105 lines
3.7 KiB
Haskell
105 lines
3.7 KiB
Haskell
module Hsbot.Types
|
|
( Bot(..)
|
|
, BotMsg(..)
|
|
, Channel(..)
|
|
, Config(..)
|
|
, IntCmd(..)
|
|
, IrcServer(..)
|
|
, IrcBot
|
|
, IrcMsg(..)
|
|
, Plugin(..)
|
|
) where
|
|
|
|
import Control.Concurrent
|
|
import Control.Concurrent.Chan
|
|
import Control.Monad.State
|
|
import qualified Data.Map as M
|
|
import Network
|
|
import System.IO
|
|
import System.Plugins
|
|
import System.Time (ClockTime)
|
|
|
|
-- | TODO : a monad for a channel, and a monad for a server, all together driven by a Bot?
|
|
|
|
-- | Configuration data type
|
|
data Config = Config
|
|
{ commandPrefix :: Char -- command prefixes, for example @[\'>\',\'@\',\'?\']@
|
|
, ircServer :: IrcServer -- list of 'Server's to connect to
|
|
} deriving (Show)
|
|
|
|
-- | An IRC server
|
|
data IrcServer = IrcServer
|
|
{ serverAddress :: String -- the server's address
|
|
, serverPort :: PortID -- the server's port
|
|
, joinChannels :: [String] -- a list of channels to join
|
|
, nickname :: String -- the hsbot's nickname
|
|
, password :: String -- the hsbot's password, optional
|
|
, realname :: String -- the hsbot's real name, optional
|
|
, administrators :: [String] -- bot admins nicknames
|
|
}
|
|
|
|
instance Show IrcServer where
|
|
show (IrcServer a p c n pa r ad) = (show a)
|
|
++ (case p of
|
|
PortNumber num -> show num
|
|
Service s -> show s
|
|
UnixSocket u -> show u)
|
|
++ (show c) ++ (show n) ++ (show pa) ++ (show r) ++ (show ad)
|
|
|
|
-- instance Show PortID where
|
|
-- show (PortNumber n) = show n
|
|
-- show (Service s) = show s
|
|
-- show (UnixSocket g) = show g
|
|
|
|
-- | The IrcBot monad
|
|
type IrcBot a = StateT Bot IO a
|
|
|
|
-- | An IRC Bot server state
|
|
data Bot = Bot
|
|
{ serverConfig :: IrcServer -- original server config we are connected to
|
|
, startTime :: ClockTime -- the bot's uptime
|
|
, botHandle :: Handle -- the socket/handle
|
|
, chans :: [Channel] -- the list of channels we have joined
|
|
, botPlugins :: M.Map String Plugin -- Loaded plugins
|
|
, botChannel :: Chan BotMsg -- The bot's communication channel
|
|
, readerThreadId :: ThreadId -- The bot's thread ID
|
|
, botCommands :: M.Map String [String] -- Registered commands ("command", ["pluginName"])
|
|
}
|
|
|
|
instance Show Bot where
|
|
show (Bot _ s h c p _ _ cmds) = (show s) ++ (show h) ++ (show c) ++ (show p) ++ (show cmds)
|
|
|
|
-- | A channel connection
|
|
data Channel = Channel
|
|
{ channelName :: String -- the channel's name
|
|
, channelNick :: String -- our nickname
|
|
, channelAdmins :: [String] -- the bot administrators
|
|
} deriving (Show)
|
|
|
|
-- | An IRC message
|
|
data IrcMsg = IrcMsg
|
|
{ prefix :: Maybe String -- the message prefix
|
|
, command :: String -- the message command
|
|
, parameters :: [String] -- the message parameters
|
|
} deriving (Show)
|
|
|
|
-- | An internal command
|
|
-- TODO : make it with a FROM and a TO for plugins handling, and make it usefull threw the helpers.
|
|
data IntCmd = IntCmd
|
|
{ internalCommand :: String -- the internal command
|
|
, internalCommandMsg :: IrcMsg -- the IrcMsg associated with the command
|
|
} deriving (Show)
|
|
|
|
-- | A plugin definition
|
|
data Plugin = Plugin
|
|
{ pluginName :: String -- The plugin's name
|
|
, pluginModule :: Module -- The plugin himself
|
|
, pluginThreadId :: ThreadId -- The plugin thread
|
|
, pluginChannel :: Chan BotMsg -- The plugin channel
|
|
}
|
|
|
|
instance Show Plugin where
|
|
show (Plugin name _ _ _) = show name
|
|
|
|
data BotMsg = InputMsg IrcMsg | OutputMsg IrcMsg | InternalCmd IntCmd
|
|
|