packages feed

xdcc-1.1.2: src/ZNC.hs

{-# LANGUAGE NamedFieldPuns    #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms   #-}

module ZNC (autoConnectHooks) where

import           IRC.Types

import qualified Data.Text          as T (Text)
import           Network.IRC.Client (Event (..), EventHandler (..),
                                     EventType (EPrivmsg), Message (..),
                                     Source (..), StatefulIRC, send)

{- TODO Additional checks
   host == "znc.in"
   user == "znc"
-}
pattern ZncStatusUser :: Source T.Text
pattern ZncStatusUser = User "*status"

pattern ZncDisconnectedMsg :: T.Text -> Message T.Text
pattern ZncDisconnectedMsg target =
    Privmsg target (Right
        "You are currently disconnected from IRC. Use 'connect' to reconnect.")

autoConnectHooks :: Hook s
autoConnectHooks = Hook { onConnect    = return ()
                        , events       = [autoReconnect]
                        , onDisconnect = disconnect }

autoReconnect :: EventHandler s
autoReconnect = EventHandler
    { _description = "Auto-reconnect when ZNC is enabled"
    , _matchType   = EPrivmsg
    , _eventFunc   = handler
    }
  where
    handler Event { _source  = ZncStatusUser
                  , _message = ZncDisconnectedMsg _ } = send' "connect"
    handler _ = return ()

disconnect :: StatefulIRC s ()
disconnect = send' "disconnect"

send' :: T.Text -> StatefulIRC s ()
send' = send . Privmsg "*status" . Right