From 884c6c9f2e3a03d6666c8dd6c6d6b6513db88ad5 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Thu, 4 Feb 2010 20:36:58 +0100 Subject: Reorganized code and types, changed slightly the architecture. --- Hsbot/Types.hs | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 Hsbot/Types.hs (limited to 'Hsbot/Types.hs') diff --git a/Hsbot/Types.hs b/Hsbot/Types.hs new file mode 100644 index 0000000..7a37035 --- /dev/null +++ b/Hsbot/Types.hs @@ -0,0 +1,104 @@ +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 { + commandPrefixes :: String, -- command prefixes, for example @[\'>\',\'@\',\'?\']@ + ircServer :: IrcServer -- list of 'Server's to connect to +} deriving (Show) + +-- | An IRC server +data IrcServer = IrcServer + { address :: String -- the server's address + , port :: PortID -- the server's port + , channels :: [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) + +-- | A Bot command +data IntCmd = IntCmd + { intCmd :: String -- the bot's internal command + , intCmdParams :: [String] -- the parameters + } 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) + +-- | 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 + -- cgit v1.2.3