module Network.Slack.Channel
(
Channel(..),
channels,
channelFromName
)
where
import Network.Slack.Prelude
import Network.Slack.Types (SlackResponseName(..), parseStrippedPrefix, Slack(..), request')
import Network.Slack.User (User(..), userFromId)
import Data.List (find)
data ChannelRaw = ChannelRaw {
_channelId :: String,
_channelName :: String,
_channelMembers :: [String]
} deriving (Show, Generic)
instance FromJSON ChannelRaw where
parseJSON = parseStrippedPrefix "_channel"
instance SlackResponseName [ChannelRaw] where
slackResponseName _ = "channels"
data Channel = Channel {
channelId :: String,
channelName :: String,
channelMembers :: [User]
} deriving (Show)
channels :: Slack [Channel]
channels = mapM convertRawChannel =<< request' "channels.list"
where
convertRawChannel :: ChannelRaw -> Slack Channel
convertRawChannel (ChannelRaw cid cname cuids) = do
channelUsers <- mapM userFromId cuids
return (Channel cid cname channelUsers)
channelFromName :: String -> Slack Channel
channelFromName cname = do
maybeChannel <- find (\c -> channelName c == cname) <$> channels
case maybeChannel of
Nothing -> Slack . hoistEither . Left . printf "Could not find channel with name: %s" $ cname
Just channel -> Slack . hoistEither $ Right channel