aboutsummaryrefslogtreecommitdiff
path: root/src/IRC.hs
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))