libmpd-0.9.3.0: src/Network/MPD/Applicative/ClientToClient.hs
{-# LANGUAGE OverloadedStrings #-}
{- |
Module : Network.MPD.Applicative.ClientToClient
Copyright : (c) Joachim Fasting 2013
License : MIT
Maintainer : joachifm@fastmail.fm
Stability : stable
Portability : unportable
Client to client communication.
-}
module Network.MPD.Applicative.ClientToClient
( -- * Types
ChannelName
, MessageText
-- * Subscribing to channels
, subscribe
, unsubscribe
, channels
-- * Communicating with other clients
, readMessages
, sendMessage
) where
import Network.MPD.Commands.Arg hiding (Command)
import Network.MPD.Applicative.Internal
import Network.MPD.Applicative.Util
import Network.MPD.Util
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.UTF8 as UTF8
------------------------------------------------------------------------
type ChannelName = String
type MessageText = String
------------------------------------------------------------------------
subscribe :: ChannelName -> Command ()
subscribe name = Command emptyResponse ["subscribe" <@> name]
unsubscribe :: ChannelName -> Command ()
unsubscribe name = Command emptyResponse ["unsubscribe" <@> name]
channels :: Command [ChannelName]
channels = Command p ["channels"]
where
p = map UTF8.toString . takeValues <$> getResponse
------------------------------------------------------------------------
readMessages :: Command [(ChannelName, MessageText)]
readMessages = Command (liftParser p) ["readmessages"]
where
p = mapM parseMessage . splitGroups ["channel"] . toAssocList
parseMessage :: [(ByteString, ByteString)] -> Either String (ChannelName, MessageText)
parseMessage [("channel", ch),("message", msg)] = Right (UTF8.toString ch, UTF8.toString msg)
parseMessage _ = Left "Unexpected result from readMessages"
sendMessage :: ChannelName -> MessageText -> Command ()
sendMessage name text = Command emptyResponse ["sendmessage" <@> name <++> text]