From b9c8e4d404c444d57fe7320c25ba0654d9c5193c Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Thu, 6 Aug 2009 00:11:14 +0200 Subject: Added IRC connection and initialisation stuff. --- Config.hs | 2 +- Hsbot/Core.hs | 5 +++++ Hsbot/IRC.hs | 27 +++++++++++++++++++++++++-- Hsbot/Main.hs | 5 +++-- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Config.hs b/Config.hs index a635292..05b2bed 100644 --- a/Config.hs +++ b/Config.hs @@ -10,7 +10,7 @@ import Hsbot.Core kro = IrcServer { address = "kro.corp" , port = 6667 - , channels = ["#geek"] + , channels = ["#geek", "#shbot"] , nickname = "hsbot" , password = "" , realname = "The One True bot, with it's haskell soul." diff --git a/Hsbot/Core.hs b/Hsbot/Core.hs index b2e34c8..4daeef9 100644 --- a/Hsbot/Core.hs +++ b/Hsbot/Core.hs @@ -3,10 +3,12 @@ module Hsbot.Core , Config(..) , IrcServer(..) , newbot + , sendstr ) 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 @@ -34,3 +36,6 @@ data IrcServer = IrcServer newbot :: Bot newbot = Bot (M.empty) +-- | Send a string over handle +sendstr handle str = hPrintf handle "%s\r\n" str + diff --git a/Hsbot/IRC.hs b/Hsbot/IRC.hs index 6ff1013..ead044c 100644 --- a/Hsbot/IRC.hs +++ b/Hsbot/IRC.hs @@ -1,11 +1,15 @@ module Hsbot.IRC ( IrcInput(..) , IrcOutput(..) + , connectServer + , initServer , parseIrcMsg )where -import qualified Network.IRC as Irc -import System.IO (Handle) +import Control.Monad +import Network +import qualified Network.IRC as IRC +import System.IO import Hsbot.Core @@ -32,3 +36,22 @@ data IrcOutput = Str String -- a regular string parseIrcMsg :: String -> IrcInput parseIrcMsg _ = Err "Parsing not yet implemented" +-- | Connects to a server +connectServer :: IrcServer -> IO (IrcServer, Handle) +connectServer server = do + let name = address server + port_number = port server + handle <- connectTo name (PortNumber $ fromIntegral port_number) + hSetBuffering handle NoBuffering + return (server, handle) + +-- | Setup a newly connected server by sending nick and join stuff +initServer :: (IrcServer, Handle) -> IO () +initServer (server, handle) = do + sendstr handle (IRC.encode $ IRC.nick (nickname server)) + sendstr handle (IRC.encode $ IRC.user (nickname server) "0" "*" (realname server)) + when (not . null $ (password server)) $ do + sendstr handle (IRC.encode $ IRC.privmsg "nickserv" ("identify" ++ (password server))) + mapM_ (sendstr handle . IRC.encode . IRC.joinChan) (channels server) + return () + diff --git a/Hsbot/Main.hs b/Hsbot/Main.hs index 129d2bd..5ff138b 100644 --- a/Hsbot/Main.hs +++ b/Hsbot/Main.hs @@ -2,7 +2,6 @@ module Hsbot.Main (imain ) where -import Network import System.IO import System.Plugins @@ -19,5 +18,7 @@ imain modul' reboot = imain' modul' reboot newbot -- | Bot's main entry point imain' :: Module -> Reboot -> Bot -> IO () imain' modul' reboot bot = do - print C.config + servers' <- mapM connectServer (ircServers C.config) + mapM_ initServer servers' + return () -- cgit v1.2.3