A very basic IRC bot in Haskell
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

64 lines
1.8 KiB

{-# LANGUAGE OverloadedStrings #-}
module Main where
import Lib
import Types
import IRCParser (runParseMessage)
import Control.Applicative
import Network.Socket hiding (recv)
import Network.Socket.ByteString as S
import qualified Data.ByteString.Lazy as L
import Control.Concurrent (threadDelay, forkIO)
import Data.Text (isInfixOf)
getNick (Message source _ _) = maybe "" id (sourceNick <$> source)
react sock msg = do
case (ircCommand msg) of
"PING" -> sendMany sock (buildCommand <$> [pong (head $ ircCommandArgs msg)])
"PRIVMSG" -> if ("crapbot" `isInfixOf` (head $ tail $ ircCommandArgs msg)) then
sendMany sock
(buildCommand <$>
[privmsg (head $ ircCommandArgs msg) (mconcat ["Hello there ", getNick msg, "!"])])
else
return ()
command -> print command
return ()
channel = "#thisisatestwhatever"
userCmd = user "crapbot" "A crappy bot"
nickCmd = nick "crapbot"
joinCmd = join channel
initMsgCmd = privmsg channel "Hello, my fellow humans!"
getAddress hname = head <$>
getAddrInfo (return defaultHints) (return hname) (return "6667")
getIRCSock addr = socket (addrFamily addr) Stream defaultProtocol
recvLoop sock = do
msg <- recv sock 4096
case runParseMessage msg of
Left _ -> return ()
Right msg -> do
_ <- react sock msg
print msg
threadDelay 1000000
recvLoop sock
sendIRCConnect host = do
addr <- getAddress host
sock <- getIRCSock addr
connect sock (addrAddress addr)
forkIO $ recvLoop sock
threadDelay 1000000
sendMany sock (buildCommand <$> [userCmd, nickCmd, joinCmd, initMsgCmd])
main = do
_ <- sendIRCConnect "irc.freenode.org"
_ <- getLine
return ()