blob: 7e78c509856e71a62051eb5de87402fa8c613a23 (
plain)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
module IRC where
import Control.Monad (forM_)
import Control.Monad.IO.Class (liftIO)
import qualified Data.ByteString.Char8 as Char8
import Data.Char
import Network.IRC.Client
-- import Network.IRC.Client.Events
import Lens.Micro
import Data.Text (Text)
import qualified Data.Text as T
connectIRC :: (Text -> Bool) -> (Text -> IO [Text]) -> IO ()
connectIRC commandDetect msgFun = do
pass <- readFile "irc-password.txt"
let trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
let conn = tlsConnection (WithDefaultConfig (Char8.pack "irc.libera.chat") 6697)
& username .~ T.pack "yahb2"
& realname .~ T.pack "Bot operated by tomsmeding"
& password .~ Just (T.pack (trim pass))
& logfunc .~ noopLogger
let cfg = defaultInstanceConfig (T.pack "yahb2")
& handlers .~
(-- some of the standard handlers
[pingHandler
,kickHandler
,ctcpPingHandler
,ctcpTimeHandler
,ctcpVersionHandler
,welcomeNick
,joinHandler]
++
-- our custom handlers
[noticeHandler
,privmsgHandler commandDetect msgFun]
)
runClient conn cfg ()
noticeHandler :: EventHandler s
noticeHandler = EventHandler
(\ev -> case ev ^. message of
Notice _ (Right text)
| T.pack "now identified for" `T.isInfixOf` text
-> Just ()
_ -> Nothing)
(\_ () -> do
liftIO $ putStrLn "Identification confirmation received, joining channel"
send $ Join (T.pack "#haskell"))
privmsgHandler :: (Text -> Bool) -> (Text -> IO [Text]) -> EventHandler s
privmsgHandler commandDetect msgFun = EventHandler
(\ev -> case ev ^. message of
Privmsg target (Right text)
| commandDetect text -> Just (target, text)
_ -> Nothing)
(\_ (target, text) -> do
msgs <- liftIO $ msgFun text
forM_ msgs $ \msg ->
send $ Privmsg target (Right msg))
|