{-# LANGUAGE OverloadedStrings #-}
module Network.IRC.Bot.Part.Hello where

import Control.Monad            (void)
import Control.Monad.Trans      (liftIO)
import Data.Maybe               (fromMaybe)
import Data.ByteString          (ByteString)
import Network.IRC.Bot.Log      (LogLevel(Debug))
import Network.IRC.Bot.BotMonad (BotMonad(..), maybeZero)
import Network.IRC.Bot.Commands (PrivMsg(..),askSenderNickName, replyTo, sendCommand)
import Network.IRC.Bot.Parsec   (botPrefix, parsecPart)
import System.Random            (randomRIO)
import Text.Parsec              (ParsecT, (<|>), string, try)

helloPart :: (BotMonad m) => m ()
helloPart :: forall (m :: * -> *). BotMonad m => m ()
helloPart = forall (m :: * -> *) a.
BotMonad m =>
ParsecT ByteString () m a -> m a
parsecPart forall (m :: * -> *). BotMonad m => ParsecT ByteString () m ()
helloCommand

helloCommand :: (BotMonad m) => ParsecT ByteString () m ()
helloCommand :: forall (m :: * -> *). BotMonad m => ParsecT ByteString () m ()
helloCommand =
    do forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). BotMonad m => ParsecT ByteString () m ()
botPrefix forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
string String
"hello"
       forall (m :: * -> *). BotMonad m => LogLevel -> ByteString -> m ()
logM LogLevel
Debug ByteString
"helloPart"
       ByteString
target <- forall (m :: * -> *) a. MonadPlus m => Maybe a -> m a
maybeZero forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> *). BotMonad m => m (Maybe ByteString)
replyTo
       forall (m :: * -> *). BotMonad m => LogLevel -> ByteString -> m ()
logM LogLevel
Debug forall a b. (a -> b) -> a -> b
$ ByteString
"target: " forall a. Semigroup a => a -> a -> a
<> ByteString
target
       Maybe ByteString
mNick <- forall (m :: * -> *). BotMonad m => m (Maybe ByteString)
askSenderNickName
       let greetings :: [ByteString]
greetings = [ByteString
"Hello", ByteString
"Howdy", ByteString
"Greetings", ByteString
"Word up"]
       Int
n <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a (m :: * -> *). (Random a, MonadIO m) => (a, a) -> m a
randomRIO (Int
0, forall (t :: * -> *) a. Foldable t => t a -> Int
length [ByteString]
greetings forall a. Num a => a -> a -> a
- Int
1)
       let message :: ByteString
message = [ByteString]
greetingsforall a. [a] -> Int -> a
!!Int
n forall a. Semigroup a => a -> a -> a
<> ByteString
", " forall a. Semigroup a => a -> a -> a
<> (forall a. a -> Maybe a -> a
fromMaybe ByteString
"stranger" Maybe ByteString
mNick)
       forall c (m :: * -> *).
(ToMessage c, BotMonad m, Functor m) =>
c -> m ()
sendCommand (Maybe Prefix -> [ByteString] -> ByteString -> PrivMsg
PrivMsg forall a. Maybe a
Nothing [ByteString
target] ByteString
message)
    forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall (m :: * -> *) a. Monad m => a -> m a
return ()