module EventHandler ( handleEvent ) where

import           Control.Applicative    ( (<|>) )
import           Control.Monad          ( unless )
import           Data.Foldable          ( for_ )
import qualified Data.Text as T         ( head )
import           Discord.Types
import           Discord

import qualified Academic
import qualified Admin
import qualified BinancePriceFetcher
import qualified Misc
import qualified Helpme
import qualified Haskell
import qualified HallOfFame
import qualified RoleSelfAssign
import qualified MCServer
import qualified QuoteSystem
import qualified ModifyEventsChannel
--import qualified AprilFools

commandReceivers :: [Message -> DiscordHandler ()]
commandReceivers :: [Message -> DiscordHandler ()]
commandReceivers = [[Message -> DiscordHandler ()]] -> [Message -> DiscordHandler ()]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
     [  -- AprilFools.messageReceivers      -- the AprilFools message receivers MUST be first if active
       [Message -> DiscordHandler ()]
Admin.receivers
     , [Message -> DiscordHandler ()]
Academic.receivers
     , [Message -> DiscordHandler ()]
BinancePriceFetcher.receivers
     , [Message -> DiscordHandler ()]
Misc.receivers
     , [Message -> DiscordHandler ()]
Helpme.receivers
     , [Message -> DiscordHandler ()]
Haskell.receivers
     , [Message -> DiscordHandler ()]
HallOfFame.messageReceivers
     , [Message -> DiscordHandler ()]
MCServer.receivers
     , [Message -> DiscordHandler ()]
QuoteSystem.receivers
     , [Message -> DiscordHandler ()]
ModifyEventsChannel.receivers
     , [Message -> DiscordHandler ()]
RoleSelfAssign.receivers
     ]

reactionAddReceivers :: [ReactionInfo -> DiscordHandler ()]
reactionAddReceivers :: [ReactionInfo -> DiscordHandler ()]
reactionAddReceivers = [[ReactionInfo -> DiscordHandler ()]]
-> [ReactionInfo -> DiscordHandler ()]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
     [ -- AprilFools.reactionReceivers
       [ReactionInfo -> DiscordHandler ()]
Misc.reactionReceivers
     , [ReactionInfo -> DiscordHandler ()]
HallOfFame.reactionReceivers
     , [ReactionInfo -> DiscordHandler ()]
RoleSelfAssign.reactionAddReceivers
     ]

{-# ANN reactionRemoveReceivers "HLint: ignore Evaluate" #-}
reactionRemoveReceivers :: [ReactionInfo -> DiscordHandler()]
reactionRemoveReceivers :: [ReactionInfo -> DiscordHandler ()]
reactionRemoveReceivers = [[ReactionInfo -> DiscordHandler ()]]
-> [ReactionInfo -> DiscordHandler ()]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
     [ [ReactionInfo -> DiscordHandler ()]
RoleSelfAssign.reactionRemReceivers
     ]

isFromBot :: Message -> Bool
isFromBot :: Message -> Bool
isFromBot Message
m = User -> Bool
userIsBot (Message -> User
messageAuthor Message
m)

handleEvent :: Event -> DiscordHandler ()
handleEvent :: Event -> DiscordHandler ()
handleEvent Event
event = case Event
event of
    MessageCreate Message
m ->
        Bool -> DiscordHandler () -> DiscordHandler ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Message -> Bool
isFromBot Message
m) (DiscordHandler () -> DiscordHandler ())
-> DiscordHandler () -> DiscordHandler ()
forall a b. (a -> b) -> a -> b
$ [Message -> DiscordHandler ()]
-> ((Message -> DiscordHandler ()) -> DiscordHandler ())
-> DiscordHandler ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Message -> DiscordHandler ()]
commandReceivers ((Message -> DiscordHandler ()) -> Message -> DiscordHandler ()
forall a b. (a -> b) -> a -> b
$ Message
m)
    MessageReactionAdd ReactionInfo
r ->
        [ReactionInfo -> DiscordHandler ()]
-> ((ReactionInfo -> DiscordHandler ()) -> DiscordHandler ())
-> DiscordHandler ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [ReactionInfo -> DiscordHandler ()]
reactionAddReceivers ((ReactionInfo -> DiscordHandler ())
-> ReactionInfo -> DiscordHandler ()
forall a b. (a -> b) -> a -> b
$ ReactionInfo
r) DiscordHandler () -> DiscordHandler () -> DiscordHandler ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> () -> DiscordHandler ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    MessageReactionRemove ReactionInfo
r ->
        [ReactionInfo -> DiscordHandler ()]
-> ((ReactionInfo -> DiscordHandler ()) -> DiscordHandler ())
-> DiscordHandler ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [ReactionInfo -> DiscordHandler ()]
reactionRemoveReceivers ((ReactionInfo -> DiscordHandler ())
-> ReactionInfo -> DiscordHandler ()
forall a b. (a -> b) -> a -> b
$ ReactionInfo
r) DiscordHandler () -> DiscordHandler () -> DiscordHandler ()
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> () -> DiscordHandler ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    Event
_ -> () -> DiscordHandler ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()