56 lines
1.8 KiB
Haskell
56 lines
1.8 KiB
Haskell
module Hsbot.Core
|
|
( Bot(..)
|
|
, Config(..)
|
|
, IrcServer(..)
|
|
, isConnected
|
|
, newbot
|
|
, sendstr
|
|
, saveServersStates
|
|
) where
|
|
|
|
import qualified Data.Map as M
|
|
import System.IO (Handle)
|
|
import Text.Printf (hPrintf)
|
|
|
|
-- | An IRC Bot server state (socket handles)
|
|
data Bot = Bot
|
|
{ joinedServers :: M.Map IrcServer Handle -- servers we are connected to
|
|
} deriving (Eq, Show)
|
|
|
|
-- | Configuration data type
|
|
data Config = Config {
|
|
commandPrefixes :: String, -- command prefixes, for example @[\'>\',\'@\',\'?\']@
|
|
ircServers :: [IrcServer] -- list of 'Server's to connect to
|
|
} deriving (Eq,Show)
|
|
|
|
-- | An IRC server
|
|
data IrcServer = IrcServer
|
|
{ address :: String -- the server's address
|
|
, port :: Int -- 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
|
|
} deriving (Eq, Ord, Show)
|
|
|
|
-- | Returns a new, empty bot
|
|
newbot :: Bot
|
|
newbot = Bot (M.empty)
|
|
|
|
-- | Send a string over handle
|
|
sendstr :: Handle -> String -> IO ()
|
|
sendstr handle str = hPrintf handle "%s\r\n" str
|
|
|
|
-- | Are we already connected to this server?
|
|
isConnected :: Bot -> IrcServer -> Bool
|
|
isConnected (Bot bot) ircServer = ircServer `M.member` bot
|
|
|
|
saveServerState :: Handle -> IrcServer -> Bot -> Bot
|
|
saveServerState handle ircServer x@(Bot bot) =
|
|
if ircServer `M.member` bot then x
|
|
else (Bot $ M.insert ircServer handle bot)
|
|
|
|
saveServersStates :: [(IrcServer,Handle)] -> Bot -> Bot
|
|
saveServersStates liste bot = foldr (\(ircServer,handle) bot' -> saveServerState handle ircServer bot') bot liste
|
|
|