106 lines
3.3 KiB
Haskell
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)
|