summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Dessaux2009-08-06 00:11:14 +0200
committerJulien Dessaux2009-08-06 00:11:14 +0200
commitb9c8e4d404c444d57fe7320c25ba0654d9c5193c (patch)
tree98796cc7cf2b74b51feaf6214c5b1ae8c49688d8
parentrenamed "Server" algebraic data type to "IrcServer" (diff)
downloadhsbot-b9c8e4d404c444d57fe7320c25ba0654d9c5193c.tar.gz
hsbot-b9c8e4d404c444d57fe7320c25ba0654d9c5193c.tar.bz2
hsbot-b9c8e4d404c444d57fe7320c25ba0654d9c5193c.zip
Added IRC connection and initialisation stuff.
-rw-r--r--Config.hs2
-rw-r--r--Hsbot/Core.hs5
-rw-r--r--Hsbot/IRC.hs27
-rw-r--r--Hsbot/Main.hs5
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 ()