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

106 lines
3.3 KiB
Haskell

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Pipes.IRC.Server.Types
( HostPreference(..)
, IrcMessage
, IrcEvent(..)
, IrcEvents
, IrcConnection(..)
, IrcConfig(..)
, IrcServer(..)
, IrcUser(..)
, IrcChannel(..)
, IrcMonad(..)
, ServerState(..)
, ClientState(..)
, RegState(..)
) where
import Control.Concurrent.STM (TVar)
import Control.Monad.RWS (MonadReader, MonadState, MonadWriter,
RWS)
import Data.ByteString (ByteString)
import Data.Map (Map)
import Data.Set (Set)
import Pipes.Concurrent (Output)
import Pipes.IRC.Message.Types (IrcMessage)
import Pipes.Network.TCP (HostPreference (..), ServiceName,
SockAddr, Socket)
type IrcEvents = [IrcEvent]
newtype IrcMonad a =
IrcMonad { runIrc :: RWS IrcConfig IrcEvents ClientState a }
deriving ( Monad
, Functor
, MonadReader IrcConfig
, MonadWriter IrcEvents
, MonadState ClientState)
data IrcEvent = Msg { outMsg :: !IrcMessage
, outDest :: ![Int]
}
| Close Int
deriving (Show)
data ServerState =
ServerState { ircState :: !(TVar IrcServer)
, ircConfig :: !IrcConfig
, ircConnections :: !(TVar (Map Int IrcConnection))
, ircConnIds :: !(TVar Int)
}
data RegState = Unreg { rcvdPass :: !(Maybe ByteString)
, rcvdNick :: !(Maybe ByteString)
, rcvdName :: !(Maybe ByteString) }
| RegUser { regdNick :: !ByteString }
deriving (Show)
data ClientState =
ClientState { clientReg :: !RegState
, clientServer :: !IrcServer
, clientConn :: !Int
} deriving (Show)
data IrcServer =
IrcServer { ircNicks :: !(Set ByteString)
, ircUsers :: !(Map ByteString IrcUser)
, ircChannels :: !(Map ByteString IrcChannel)
} deriving (Show)
data IrcConfig =
IrcConfig { ircPort :: !ServiceName
, ircHost :: !HostPreference
, ircMotd :: ![ByteString]
, ircPass :: !(Maybe ByteString)
} deriving (Show)
data IrcConnection =
IrcConnection { sock :: !Socket
, addr :: !SockAddr
, out :: !(Output IrcMessage)
}
data IrcUser =
IrcUser { userNick :: !(Maybe ByteString)
, userServerName :: !(Maybe ByteString)
, userName :: !(Maybe ByteString)
, userHostName :: !(Maybe ByteString)
, userModes :: ![IrcUserMode]
, userConn :: !Int
} 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)