1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Kirk.Simple where
import Control.Exception.Base (finally)
import Control.Monad (forever,unless)
import Data.List (intercalate,null)
import Data.Monoid
import Data.Text (isPrefixOf,pack,replace,unpack)
import Network (withSocketsDo,PortID(..),connectTo)
import System.IO (hSetBuffering,hSetNewlineMode,hPutStrLn,hClose,hGetLine,BufferMode(LineBuffering),universalNewlineMode,Handle)
import Kirk.Config
run :: Config -> (Handle -> IO a) -> IO a
run Config{..} f =
withSocketsDo $ do
h <- connectTo server_hostname (PortNumber server_port)
(`finally` hClose h) $ do
hSetNewlineMode h universalNewlineMode
hSetBuffering h LineBuffering
f h
handshake :: Config -> Handle -> IO ()
handshake Config{..} h = do
hPutStrLn h ("NICK " ++ nick)
hPutStrLn h ("USER " ++ nick ++ " * 0 :" ++ nick)
unless (null channels) $ hPutStrLn h ("JOIN " ++ channels)
where
channels = intercalate "," $ filter ((=='#') . head) msgtarget
ircAgent :: Config -> Handle -> IO ()
ircAgent Config{..} h = forever $ do
line <- hGetLine h
if (isPrefixOf "PING" (pack line)) then
hPutStrLn h (unpack (replace "PING" "PONG" (pack line)))
else
print line
privmsg :: Config -> Handle -> String -> IO ()
privmsg Config{..} h text =
hPutStrLn h ("PRIVMSG " <> msgtarget' <> " :" <> text)
where
msgtarget' = intercalate "," msgtarget
|