pipes-irc-server/src/Pipes/IRC/Server/Types.hs

72 lines
2.2 KiB
Haskell

{-# LANGUAGE RecordWildCards #-}
module Pipes.IRC.Server.Types
( HostPreference(..)
, IrcHandler
, IrcMessage
, IrcConnection(..)
, IrcConfig(..)
, IrcServer(..)
, IrcUser(..)
, IrcChannel(..)
) where
import Control.Concurrent.STM (TVar)
import Data.ByteString (ByteString)
import Pipes (Consumer)
import Pipes.Concurrent (Output)
import Pipes.IRC.Message.Types (IrcMessage)
import Pipes.Network.TCP (HostPreference (..), ServiceName,
SockAddr, Socket)
data IrcServer =
IrcServer { ircConfig :: !IrcConfig
, ircConnections :: !(TVar [IrcConnection IrcMessage])
, ircUsers :: !(TVar [IrcUser])
, ircChannels :: !(TVar [IrcChannel])
, ircHandler :: !(Consumer IrcMessage IO ())
}
data IrcConfig =
IrcConfig { ircPort :: !ServiceName
, ircHost :: !HostPreference
} deriving (Show)
data IrcConnection a =
IrcConnection { sock :: !Socket
, addr :: !SockAddr
, out :: !(Output a)
}
instance Eq (IrcConnection a) where
(IrcConnection s1 _ _) == (IrcConnection s2 _ _) = s1 == s2
instance Show (IrcConnection a) where
show IrcConnection {..} =
"IrcConnection " ++ show sock ++ " " ++ show addr
type IrcHandler = (Socket, SockAddr) -> IO ()
data IrcUser =
IrcUser { userNick :: !ByteString
, userClientId :: !ByteString
, userServerName :: !ByteString
, userName :: !ByteString
, userHostName :: !ByteString
, userModes :: ![IrcUserMode]
, userConn :: !(IrcConnection IrcMessage)
} deriving (Show, Eq)
data IrcUserMode = Away | Invisible | WallOps | Restricted
| Oper | LocalOper | ServerNotices
deriving (Show, Eq, Enum)
data IrcChannel =
IrcChannel { chanName :: !ByteString
, chanTopic :: !ByteString
, chanModes :: ![IrcChanMode]
, chanUsers :: ![IrcUser]
} deriving (Show, Eq)
data IrcChanMode = Anonymous | InviteOnly | Moderated | Quiet | Secret
deriving (Show, Eq, Enum)