module Network.IRC.Bot.Part.NickUser where

import Control.Monad.Trans        (liftIO)
import Data.ByteString            (ByteString)
import Data.ByteString.Char8      (pack)
import Network.IRC.Bot.BotMonad   (BotMonad(..) )
import Network.IRC.Bot.Types      (User(..))
import Network.IRC.Bot.ErrorCodes
import Network.IRC.Bot.Log        (LogLevel(..))
import           Network.IRC      (Message(..), showMessage)
import qualified Network.IRC      as IRC
import System.Random              (randomRIO)

nickUserPart :: (BotMonad m) => m ()
nickUserPart :: forall (m :: * -> *). BotMonad m => m ()
nickUserPart =
  do Message
msg <- forall (m :: * -> *). BotMonad m => m Message
askMessage
     let cmd :: Command
cmd = Message -> Command
msg_command Message
msg
     case () of
       () | Command
cmd forall a. Eq a => a -> a -> Bool
== Command
noNicknameGiven  -> forall (m :: * -> *). BotMonad m => LogLevel -> Command -> m ()
logM LogLevel
Important (Message -> Command
showMessage Message
msg)
          | Command
cmd forall a. Eq a => a -> a -> Bool
== Command
erroneusNickname -> forall (m :: * -> *). BotMonad m => LogLevel -> Command -> m ()
logM LogLevel
Important (Message -> Command
showMessage Message
msg)
          | Command
cmd forall a. Eq a => a -> a -> Bool
== Command
nickCollision    -> forall (m :: * -> *). BotMonad m => LogLevel -> Command -> m ()
logM LogLevel
Important (Message -> Command
showMessage Message
msg)
          | Command
cmd forall a. Eq a => a -> a -> Bool
== Command
nicknameInUse    ->
              do forall (m :: * -> *). BotMonad m => LogLevel -> Command -> m ()
logM LogLevel
Important (Message -> Command
showMessage Message
msg)
                 Command
n <- forall (m :: * -> *). BotMonad m => m Command
whoami
                 Int
i <- 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
1, Int
100 :: Int)
                 forall (m :: * -> *). BotMonad m => Command -> Maybe User -> m ()
changeNickUser (Command
n forall a. Semigroup a => a -> a -> a
<> String -> Command
pack (forall a. Show a => a -> String
show Int
i)) forall a. Maybe a
Nothing
          | Bool
otherwise -> forall (m :: * -> *) a. Monad m => a -> m a
return ()

changeNickUser :: (BotMonad m) => ByteString -> Maybe User -> m ()
changeNickUser :: forall (m :: * -> *). BotMonad m => Command -> Maybe User -> m ()
changeNickUser Command
n Maybe User
mUser =
    do forall (m :: * -> *). BotMonad m => Message -> m ()
sendMessage (Command -> Message
IRC.nick Command
n)
       case Maybe User
mUser of
         Maybe User
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
         (Just User
u) ->
             forall (m :: * -> *). BotMonad m => Message -> m ()
sendMessage (Command -> Command -> Command -> Command -> Message
IRC.user (User -> Command
username User
u) (String -> Command
pack forall a b. (a -> b) -> a -> b
$ User -> String
hostname User
u) (String -> Command
pack forall a b. (a -> b) -> a -> b
$ User -> String
servername User
u) (User -> Command
realname User
u))