fastirc-0.1.2: Network/FastIRC/Users.hs
-- |
-- Module: Network.FastIRC.Users
-- Copyright: (c) 2010 Ertugrul Soeylemez
-- License: BSD3
-- Maintainer: Ertugrul Soeylemez
-- Stability: experimental
--
-- This module includes parsers for IRC users.
module Network.FastIRC.Users
( UserSpec(..),
showUserSpec,
userParser )
where
import qualified Data.ByteString.Char8 as B
import Control.Applicative
import Control.Monad
import Data.Attoparsec.Char8 as P
import Network.FastIRC.ServerSet
import Network.FastIRC.Types
import Network.FastIRC.Utils
-- | IRC user or server.
data UserSpec
-- | Nickname.
= Nick NickName
-- | Nickname, username and hostname.
| User NickName UserName HostName
-- | IRC server.
| Server ServerName
deriving (Eq, Read, Show)
-- | Turn a 'UserSpec' into a 'B.ByteString' in a format suitable to be
-- sent to the IRC server.
showUserSpec :: UserSpec -> MsgString
showUserSpec (Nick n) = n
showUserSpec (User n u h) = B.concat [ n, B.cons '!' u, B.cons '@' h ]
showUserSpec (Server sh) = sh
-- | A 'Parser' for IRC users and servers.
userParser :: ServerSet -> Parser UserSpec
userParser servers =
try server <|> try full <|> nickOnly
where
server :: Parser UserSpec
server = do
srv <- P.takeWhile1 isIRCTokChar
guard $ srv `isServer` servers
return (Server srv)
full :: Parser UserSpec
full =
User <$> P.takeWhile1 isNickChar <* char '!'
<*> P.takeWhile1 isUserChar <* char '@'
<*> P.takeWhile1 isHostChar
nickOnly :: Parser UserSpec
nickOnly = Nick <$> P.takeWhile1 isNickChar