{-# OPTIONS_GHC -Wno-name-shadowing #-}

-- | The client
module Calamity.Client.Client
    ( Client(..)
    , react
    , runBotIO
    , stopBot ) where

import           Calamity.Cache.Eff
import           Calamity.Client.ShardManager
import           Calamity.Client.Types
import           Calamity.Gateway.DispatchEvents
import           Calamity.Gateway.Types
import           Calamity.HTTP.Internal.Ratelimit
import qualified Calamity.Internal.SnowflakeMap   as SM
import           Calamity.Internal.Updateable
import           Calamity.Internal.Utils
import           Calamity.Metrics.Eff
import           Calamity.Types.Model.Channel
import           Calamity.Types.Model.Guild
import           Calamity.Types.Model.Presence    ( Presence(..) )
import           Calamity.Types.Snowflake
import           Calamity.Types.Token

import           Control.Concurrent.MVar
import           Control.Concurrent.STM
import           Control.Lens
import           Control.Monad

import           Data.Default.Class
import           Data.Dynamic
import           Data.Foldable
import           Data.Maybe
import           Data.Time.Clock.POSIX
import           Data.Traversable
import qualified Data.TypeRepMap                  as TM

import qualified DiPolysemy                       as Di

import           Fmt

import           GHC.TypeLits

import qualified Polysemy                         as P
import qualified Polysemy.Async                   as P
import qualified Polysemy.AtomicState             as P
import qualified Polysemy.Error                   as P
import qualified Polysemy.Fail                    as P
import qualified Polysemy.Reader                  as P


timeA :: P.Member (P.Embed IO) r => P.Sem r a -> P.Sem r (Double, a)
timeA :: Sem r a -> Sem r (Double, a)
timeA m :: Sem r a
m = do
  POSIXTime
start <- IO POSIXTime -> Sem r POSIXTime
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed IO POSIXTime
getPOSIXTime
  a
res <- Sem r a
m
  POSIXTime
end <- IO POSIXTime -> Sem r POSIXTime
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed IO POSIXTime
getPOSIXTime
  let duration :: Double
duration = Rational -> Double
forall a. Fractional a => Rational -> a
fromRational (Rational -> Double)
-> (POSIXTime -> Rational) -> POSIXTime -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. POSIXTime -> Rational
forall a. Real a => a -> Rational
toRational (POSIXTime -> Double) -> POSIXTime -> Double
forall a b. (a -> b) -> a -> b
$ POSIXTime
end POSIXTime -> POSIXTime -> POSIXTime
forall a. Num a => a -> a -> a
- POSIXTime
start
  (Double, a) -> Sem r (Double, a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Double
duration, a
res)


newClient :: Token -> IO Client
newClient :: Token -> IO Client
newClient token :: Token
token = do
  TVar [(Shard, Async (Maybe ()))]
shards'        <- [(Shard, Async (Maybe ()))]
-> IO (TVar [(Shard, Async (Maybe ()))])
forall a. a -> IO (TVar a)
newTVarIO []
  MVar Int
numShards'     <- IO (MVar Int)
forall a. IO (MVar a)
newEmptyMVar
  RateLimitState
rlState'       <- IO RateLimitState
newRateLimitState
  TQueue DispatchMessage
eventQueue'    <- IO (TQueue DispatchMessage)
forall a. IO (TQueue a)
newTQueueIO

  Client -> IO Client
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Client -> IO Client) -> Client -> IO Client
forall a b. (a -> b) -> a -> b
$ TVar [(Shard, Async (Maybe ()))]
-> MVar Int
-> Token
-> RateLimitState
-> TQueue DispatchMessage
-> Client
Client TVar [(Shard, Async (Maybe ()))]
shards'
                MVar Int
numShards'
                Token
token
                RateLimitState
rlState'
                TQueue DispatchMessage
eventQueue'

runBotIO :: (P.Members '[P.Embed IO, P.Final IO, P.Fail, CacheEff, MetricEff] r, Typeable r) => Token -> SetupEff r -> P.Sem r ()
runBotIO :: Token -> SetupEff r -> Sem r ()
runBotIO token :: Token
token setup :: SetupEff r
setup = do
  Client
client <- IO Client -> Sem r Client
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO Client -> Sem r Client) -> IO Client -> Sem r Client
forall a b. (a -> b) -> a -> b
$ Token -> IO Client
newClient Token
token
  TVar EventHandlers
handlers <- IO (TVar EventHandlers) -> Sem r (TVar EventHandlers)
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO (TVar EventHandlers) -> Sem r (TVar EventHandlers))
-> IO (TVar EventHandlers) -> Sem r (TVar EventHandlers)
forall a b. (a -> b) -> a -> b
$ EventHandlers -> IO (TVar EventHandlers)
forall a. a -> IO (TVar a)
newTVarIO EventHandlers
forall a. Default a => a
def
  Sem (Async : r) () -> Sem r ()
forall (r :: [(* -> *) -> * -> *]) a.
Member (Final IO) r =>
Sem (Async : r) a -> Sem r a
P.asyncToIOFinal (Sem (Async : r) () -> Sem r ())
-> (SetupEff r -> Sem (Async : r) ()) -> SetupEff r -> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar EventHandlers
-> Sem (AtomicState EventHandlers : Async : r) ()
-> Sem (Async : r) ()
forall (r :: [(* -> *) -> * -> *]) s a.
Member (Embed IO) r =>
TVar s -> Sem (AtomicState s : r) a -> Sem r a
P.runAtomicStateTVar TVar EventHandlers
handlers (Sem (AtomicState EventHandlers : Async : r) ()
 -> Sem (Async : r) ())
-> (SetupEff r -> Sem (AtomicState EventHandlers : Async : r) ())
-> SetupEff r
-> Sem (Async : r) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Client
-> Sem (Reader Client : AtomicState EventHandlers : Async : r) ()
-> Sem (AtomicState EventHandlers : Async : r) ()
forall i (r :: [(* -> *) -> * -> *]) a.
i -> Sem (Reader i : r) a -> Sem r a
P.runReader Client
client (Sem (Reader Client : AtomicState EventHandlers : Async : r) ()
 -> Sem (AtomicState EventHandlers : Async : r) ())
-> (SetupEff r
    -> Sem (Reader Client : AtomicState EventHandlers : Async : r) ())
-> SetupEff r
-> Sem (AtomicState EventHandlers : Async : r) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SetupEff r
-> Sem (Reader Client : AtomicState EventHandlers : Async : r) ()
forall (r :: [(* -> *) -> * -> *]) a.
Member (Embed IO) r =>
Sem (Di Level Path Message : r) a -> Sem r a
Di.runDiToStderrIO (SetupEff r -> Sem r ()) -> SetupEff r -> Sem r ()
forall a b. (a -> b) -> a -> b
$ do
    SetupEff r
setup
    SetupEff r
forall (r :: [(* -> *) -> * -> *]).
(BotC r, Member Fail r) =>
Sem r ()
shardBot
    SetupEff r
forall (r :: [(* -> *) -> * -> *]). BotC r => Sem r ()
clientLoop
    SetupEff r
forall (r :: [(* -> *) -> * -> *]). BotC r => Sem r ()
finishUp

react :: forall (s :: Symbol) r. (KnownSymbol s, BotC r, EHType' s ~ Dynamic, Typeable (EHType s (P.Sem r))) => EHType s (P.Sem r) -> P.Sem r ()
react :: EHType s (Sem r) -> Sem r ()
react f :: EHType s (Sem r)
f =
  let handlers :: EventHandlers
handlers = TypeRepMap EventHandler -> EventHandlers
EventHandlers (TypeRepMap EventHandler -> EventHandlers)
-> (EventHandler s -> TypeRepMap EventHandler)
-> EventHandler s
-> EventHandlers
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventHandler s -> TypeRepMap EventHandler
forall k (a :: k) (f :: k -> *). Typeable a => f a -> TypeRepMap f
TM.one (EventHandler s -> EventHandlers)
-> EventHandler s -> EventHandlers
forall a b. (a -> b) -> a -> b
$ [EHType' s] -> EventHandler s
forall (d :: Symbol). [EHType' d] -> EventHandler d
EH @s [EHType s (Sem r) -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn EHType s (Sem r)
f]
  in (EventHandlers -> EventHandlers) -> Sem r ()
forall s (r :: [(* -> *) -> * -> *]).
Member (AtomicState s) r =>
(s -> s) -> Sem r ()
P.atomicModify (EventHandlers
handlers EventHandlers -> EventHandlers -> EventHandlers
forall a. Semigroup a => a -> a -> a
<>)

stopBot :: BotC r => P.Sem r ()
stopBot :: Sem r ()
stopBot = do
  Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Di Level Path Message) r =>
Text -> Sem r ()
debug "stopping bot"
  [(Shard, Async (Maybe ()))]
shards <- (Client -> TVar [(Shard, Async (Maybe ()))])
-> Sem r (TVar [(Shard, Async (Maybe ()))])
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting
     (TVar [(Shard, Async (Maybe ()))])
     Client
     (TVar [(Shard, Async (Maybe ()))])
-> TVar [(Shard, Async (Maybe ()))]
forall s a. s -> Getting a s a -> a
^. IsLabel
  "shards"
  (Getting
     (TVar [(Shard, Async (Maybe ()))])
     Client
     (TVar [(Shard, Async (Maybe ()))]))
Getting
  (TVar [(Shard, Async (Maybe ()))])
  Client
  (TVar [(Shard, Async (Maybe ()))])
#shards) Sem r (TVar [(Shard, Async (Maybe ()))])
-> (TVar [(Shard, Async (Maybe ()))]
    -> Sem r [(Shard, Async (Maybe ()))])
-> Sem r [(Shard, Async (Maybe ()))]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO [(Shard, Async (Maybe ()))] -> Sem r [(Shard, Async (Maybe ()))]
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO [(Shard, Async (Maybe ()))]
 -> Sem r [(Shard, Async (Maybe ()))])
-> (TVar [(Shard, Async (Maybe ()))]
    -> IO [(Shard, Async (Maybe ()))])
-> TVar [(Shard, Async (Maybe ()))]
-> Sem r [(Shard, Async (Maybe ()))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar [(Shard, Async (Maybe ()))] -> IO [(Shard, Async (Maybe ()))]
forall a. TVar a -> IO a
readTVarIO
  [(Shard, Async (Maybe ()))]
-> ((Shard, Async (Maybe ())) -> Sem r ()) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [(Shard, Async (Maybe ()))]
shards (((Shard, Async (Maybe ())) -> Sem r ()) -> Sem r ())
-> ((Shard, Async (Maybe ())) -> Sem r ()) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ \shard :: (Shard, Async (Maybe ()))
shard ->
    IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> (STM () -> IO ()) -> STM () -> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> Sem r ()) -> STM () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ TQueue ControlMessage -> ControlMessage -> STM ()
forall a. TQueue a -> a -> STM ()
writeTQueue ((Shard, Async (Maybe ()))
shard (Shard, Async (Maybe ()))
-> Getting
     (TQueue ControlMessage)
     (Shard, Async (Maybe ()))
     (TQueue ControlMessage)
-> TQueue ControlMessage
forall s a. s -> Getting a s a -> a
^. (Shard -> Const (TQueue ControlMessage) Shard)
-> (Shard, Async (Maybe ()))
-> Const (TQueue ControlMessage) (Shard, Async (Maybe ()))
forall s t a b. Field1 s t a b => Lens s t a b
_1 ((Shard -> Const (TQueue ControlMessage) Shard)
 -> (Shard, Async (Maybe ()))
 -> Const (TQueue ControlMessage) (Shard, Async (Maybe ())))
-> ((TQueue ControlMessage
     -> Const (TQueue ControlMessage) (TQueue ControlMessage))
    -> Shard -> Const (TQueue ControlMessage) Shard)
-> Getting
     (TQueue ControlMessage)
     (Shard, Async (Maybe ()))
     (TQueue ControlMessage)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IsLabel
  "cmdQueue"
  ((TQueue ControlMessage
    -> Const (TQueue ControlMessage) (TQueue ControlMessage))
   -> Shard -> Const (TQueue ControlMessage) Shard)
(TQueue ControlMessage
 -> Const (TQueue ControlMessage) (TQueue ControlMessage))
-> Shard -> Const (TQueue ControlMessage) Shard
#cmdQueue) ControlMessage
ShutDownShard
  TQueue DispatchMessage
eventQueue <- (Client -> TQueue DispatchMessage)
-> Sem r (TQueue DispatchMessage)
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting (TQueue DispatchMessage) Client (TQueue DispatchMessage)
-> TQueue DispatchMessage
forall s a. s -> Getting a s a -> a
^. IsLabel
  "eventQueue"
  (Getting (TQueue DispatchMessage) Client (TQueue DispatchMessage))
Getting (TQueue DispatchMessage) Client (TQueue DispatchMessage)
#eventQueue)
  IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> (STM () -> IO ()) -> STM () -> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> Sem r ()) -> STM () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ TQueue DispatchMessage -> DispatchMessage -> STM ()
forall a. TQueue a -> a -> STM ()
writeTQueue TQueue DispatchMessage
eventQueue DispatchMessage
ShutDown

finishUp :: BotC r => P.Sem r ()
finishUp :: Sem r ()
finishUp = do
  Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Di Level Path Message) r =>
Text -> Sem r ()
debug "finishing up"
  [(Shard, Async (Maybe ()))]
shards <- (Client -> TVar [(Shard, Async (Maybe ()))])
-> Sem r (TVar [(Shard, Async (Maybe ()))])
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting
     (TVar [(Shard, Async (Maybe ()))])
     Client
     (TVar [(Shard, Async (Maybe ()))])
-> TVar [(Shard, Async (Maybe ()))]
forall s a. s -> Getting a s a -> a
^. IsLabel
  "shards"
  (Getting
     (TVar [(Shard, Async (Maybe ()))])
     Client
     (TVar [(Shard, Async (Maybe ()))]))
Getting
  (TVar [(Shard, Async (Maybe ()))])
  Client
  (TVar [(Shard, Async (Maybe ()))])
#shards) Sem r (TVar [(Shard, Async (Maybe ()))])
-> (TVar [(Shard, Async (Maybe ()))]
    -> Sem r [(Shard, Async (Maybe ()))])
-> Sem r [(Shard, Async (Maybe ()))]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO [(Shard, Async (Maybe ()))] -> Sem r [(Shard, Async (Maybe ()))]
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO [(Shard, Async (Maybe ()))]
 -> Sem r [(Shard, Async (Maybe ()))])
-> (TVar [(Shard, Async (Maybe ()))]
    -> IO [(Shard, Async (Maybe ()))])
-> TVar [(Shard, Async (Maybe ()))]
-> Sem r [(Shard, Async (Maybe ()))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar [(Shard, Async (Maybe ()))] -> IO [(Shard, Async (Maybe ()))]
forall a. TVar a -> IO a
readTVarIO
  [(Shard, Async (Maybe ()))]
-> ((Shard, Async (Maybe ())) -> Sem r ()) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [(Shard, Async (Maybe ()))]
shards (((Shard, Async (Maybe ())) -> Sem r ()) -> Sem r ())
-> ((Shard, Async (Maybe ())) -> Sem r ()) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ \shard :: (Shard, Async (Maybe ()))
shard -> Sem r (Maybe ()) -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r (Maybe ()) -> Sem r ())
-> (Async (Maybe ()) -> Sem r (Maybe ()))
-> Async (Maybe ())
-> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Async (Maybe ()) -> Sem r (Maybe ())
forall (r :: [(* -> *) -> * -> *]) a.
MemberWithError Async r =>
Async a -> Sem r a
P.await (Async (Maybe ()) -> Sem r ()) -> Async (Maybe ()) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ((Shard, Async (Maybe ()))
shard (Shard, Async (Maybe ()))
-> Getting
     (Async (Maybe ())) (Shard, Async (Maybe ())) (Async (Maybe ()))
-> Async (Maybe ())
forall s a. s -> Getting a s a -> a
^. Getting
  (Async (Maybe ())) (Shard, Async (Maybe ())) (Async (Maybe ()))
forall s t a b. Field2 s t a b => Lens s t a b
_2)
  Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Di Level Path Message) r =>
Text -> Sem r ()
debug "bot has stopped"

-- | main loop of the client, handles fetching the next event, processing the event
-- and invoking it's handler functions
clientLoop :: BotC r => P.Sem r ()
clientLoop :: Sem r ()
clientLoop = do
  TQueue DispatchMessage
evtQueue <- (Client -> TQueue DispatchMessage)
-> Sem r (TQueue DispatchMessage)
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting (TQueue DispatchMessage) Client (TQueue DispatchMessage)
-> TQueue DispatchMessage
forall s a. s -> Getting a s a -> a
^. IsLabel
  "eventQueue"
  (Getting (TQueue DispatchMessage) Client (TQueue DispatchMessage))
Getting (TQueue DispatchMessage) Client (TQueue DispatchMessage)
#eventQueue)
  Sem r (Either () Any) -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r (Either () Any) -> Sem r ())
-> (Sem (Error () : r) () -> Sem r (Either () Any))
-> Sem (Error () : r) ()
-> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Error () : r) Any -> Sem r (Either () Any)
forall e (r :: [(* -> *) -> * -> *]) a.
Sem (Error e : r) a -> Sem r (Either e a)
P.runError (Sem (Error () : r) Any -> Sem r (Either () Any))
-> (Sem (Error () : r) () -> Sem (Error () : r) Any)
-> Sem (Error () : r) ()
-> Sem r (Either () Any)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Error () : r) () -> Sem (Error () : r) Any
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Sem (Error () : r) () -> Sem r ())
-> Sem (Error () : r) () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ do
    DispatchMessage
evt' <- IO DispatchMessage -> Sem (Error () : r) DispatchMessage
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO DispatchMessage -> Sem (Error () : r) DispatchMessage)
-> (STM DispatchMessage -> IO DispatchMessage)
-> STM DispatchMessage
-> Sem (Error () : r) DispatchMessage
forall b c a. (b -> c) -> (a -> b) -> a -> c
. STM DispatchMessage -> IO DispatchMessage
forall a. STM a -> IO a
atomically (STM DispatchMessage -> Sem (Error () : r) DispatchMessage)
-> STM DispatchMessage -> Sem (Error () : r) DispatchMessage
forall a b. (a -> b) -> a -> b
$ TQueue DispatchMessage -> STM DispatchMessage
forall a. TQueue a -> STM a
readTQueue TQueue DispatchMessage
evtQueue
    case DispatchMessage
evt' of
      DispatchData' evt :: DispatchData
evt -> Sem r () -> Sem (Error () : r) ()
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
P.raise (Sem r () -> Sem (Error () : r) ())
-> Sem r () -> Sem (Error () : r) ()
forall a b. (a -> b) -> a -> b
$ DispatchData -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
BotC r =>
DispatchData -> Sem r ()
handleEvent DispatchData
evt
      ShutDown          -> () -> Sem (Error () : r) ()
forall e (r :: [(* -> *) -> * -> *]) a.
MemberWithError (Error e) r =>
e -> Sem r a
P.throw ()
  Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Di Level Path Message) r =>
Text -> Sem r ()
debug "leaving client loop"

handleEvent :: BotC r => DispatchData -> P.Sem r ()
handleEvent :: DispatchData -> Sem r ()
handleEvent data' :: DispatchData
data' = do
  Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Di Level Path Message) r =>
Text -> Sem r ()
debug "handling an event"
  EventHandlers
eventHandlers <- Sem r EventHandlers
forall s (r :: [(* -> *) -> * -> *]).
Member (AtomicState s) r =>
Sem r s
P.atomicGet

  Either String [Sem r ()]
actions <- Sem (Fail : r) [Sem r ()] -> Sem r (Either String [Sem r ()])
forall (r :: [(* -> *) -> * -> *]) a.
Sem (Fail : r) a -> Sem r (Either String a)
P.runFail (Sem (Fail : r) [Sem r ()] -> Sem r (Either String [Sem r ()]))
-> Sem (Fail : r) [Sem r ()] -> Sem r (Either String [Sem r ()])
forall a b. (a -> b) -> a -> b
$ do
    Histogram
cacheUpdateHisto <- Text -> [(Text, Text)] -> [Double] -> Sem (Fail : r) Histogram
forall (r :: [(* -> *) -> * -> *]).
MemberWithError MetricEff r =>
Text -> [(Text, Text)] -> [Double] -> Sem r Histogram
registerHistogram "cache_update" [(Text, Text)]
forall a. Monoid a => a
mempty [10, 20..100]
    (time :: Double
time, res :: [Sem r ()]
res) <- Sem (Fail : r) [Sem r ()] -> Sem (Fail : r) (Double, [Sem r ()])
forall (r :: [(* -> *) -> * -> *]) a.
Member (Embed IO) r =>
Sem r a -> Sem r (Double, a)
timeA (Sem (Fail : r) [Sem r ()] -> Sem (Fail : r) (Double, [Sem r ()]))
-> Sem (Fail : r) [Sem r ()] -> Sem (Fail : r) (Double, [Sem r ()])
forall a b. (a -> b) -> a -> b
$ EventHandlers -> DispatchData -> Sem (Fail : r) [Sem r ()]
forall (r :: [(* -> *) -> * -> *]).
BotC r =>
EventHandlers -> DispatchData -> Sem (Fail : r) [Sem r ()]
handleEvent' EventHandlers
eventHandlers DispatchData
data'
    Sem (Fail : r) HistogramSample -> Sem (Fail : r) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem (Fail : r) HistogramSample -> Sem (Fail : r) ())
-> Sem (Fail : r) HistogramSample -> Sem (Fail : r) ()
forall a b. (a -> b) -> a -> b
$ Double -> Histogram -> Sem (Fail : r) HistogramSample
forall (r :: [(* -> *) -> * -> *]).
MemberWithError MetricEff r =>
Double -> Histogram -> Sem r HistogramSample
observeHistogram Double
time Histogram
cacheUpdateHisto
    [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Sem r ()]
res

  Histogram
eventHandleHisto <- Text -> [(Text, Text)] -> [Double] -> Sem r Histogram
forall (r :: [(* -> *) -> * -> *]).
MemberWithError MetricEff r =>
Text -> [(Text, Text)] -> [Double] -> Sem r Histogram
registerHistogram "event_handle" [(Text, Text)]
forall a. Monoid a => a
mempty [10, 20..100]

  case Either String [Sem r ()]
actions of
    Right actions :: [Sem r ()]
actions -> [Sem r ()] -> (Sem r () -> Sem r (Async (Maybe ()))) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Sem r ()]
actions ((Sem r () -> Sem r (Async (Maybe ()))) -> Sem r ())
-> (Sem r () -> Sem r (Async (Maybe ()))) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ \action :: Sem r ()
action -> Sem r () -> Sem r (Async (Maybe ()))
forall (r :: [(* -> *) -> * -> *]) a.
MemberWithError Async r =>
Sem r a -> Sem r (Async (Maybe a))
P.async (Sem r () -> Sem r (Async (Maybe ())))
-> Sem r () -> Sem r (Async (Maybe ()))
forall a b. (a -> b) -> a -> b
$ do
      (time :: Double
time, _) <- Sem r () -> Sem r (Double, ())
forall (r :: [(* -> *) -> * -> *]) a.
Member (Embed IO) r =>
Sem r a -> Sem r (Double, a)
timeA Sem r ()
action
      Sem r HistogramSample -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem r HistogramSample -> Sem r ())
-> Sem r HistogramSample -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Double -> Histogram -> Sem r HistogramSample
forall (r :: [(* -> *) -> * -> *]).
MemberWithError MetricEff r =>
Double -> Histogram -> Sem r HistogramSample
observeHistogram Double
time Histogram
eventHandleHisto
    Left err :: String
err      -> Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Di Level Path Message) r =>
Text -> Sem r ()
debug (Text -> Sem r ()) -> Text -> Sem r ()
forall a b. (a -> b) -> a -> b
$ "Failed handling actions for event: " Builder -> Builder -> Text
forall b. FromBuilder b => Builder -> Builder -> b
+| String
err String -> Builder -> Builder
forall a b. (Buildable a, FromBuilder b) => a -> Builder -> b
|+ ""

-- NOTE: We have to be careful with how we run event handlers
--       They're registered through `react` which ensures the value of `r` in the event handler
--       is the same as the final value of `r`, but:
--       because they're held inside a 'Dynamic' to prevent the value of `r` being recursive,
--       we have to make sure that we don't accidentally try to execute the event handler inside a
--       nested effect, ie: `P.runError $ {- Handle events here -}` since that will result the value of
--       `r` where we handle events be: `(P.Error a ': r)`, which will make stuff explode when we unwrap the
--       event handlers

unwrapEvent :: forall s r.
            (KnownSymbol s, EHType' s ~ Dynamic, Typeable r, Typeable (EHType s (P.Sem r)))
            => EventHandlers
            -> [EHType s (P.Sem r)]
unwrapEvent :: EventHandlers -> [EHType s (Sem r)]
unwrapEvent (EventHandlers eh :: TypeRepMap EventHandler
eh) = (Dynamic -> EHType s (Sem r)) -> [Dynamic] -> [EHType s (Sem r)]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe (EHType s (Sem r)) -> EHType s (Sem r)
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (EHType s (Sem r)) -> EHType s (Sem r))
-> (Dynamic -> Maybe (EHType s (Sem r)))
-> Dynamic
-> EHType s (Sem r)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dynamic -> Maybe (EHType s (Sem r))
forall a. Typeable a => Dynamic -> Maybe a
fromDynamic) ([Dynamic] -> [EHType s (Sem r)])
-> (Maybe (EventHandler s) -> [Dynamic])
-> Maybe (EventHandler s)
-> [EHType s (Sem r)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventHandler s -> [EHType' s]
forall (d :: Symbol). EventHandler d -> [EHType' d]
unwrapEventHandler @s (EventHandler s -> [Dynamic])
-> (Maybe (EventHandler s) -> EventHandler s)
-> Maybe (EventHandler s)
-> [Dynamic]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (EventHandler s) -> EventHandler s
forall a. HasCallStack => Maybe a -> a
fromJust
  (Maybe (EventHandler s) -> [EHType s (Sem r)])
-> Maybe (EventHandler s) -> [EHType s (Sem r)]
forall a b. (a -> b) -> a -> b
$ (TypeRepMap EventHandler -> Maybe (EventHandler s)
forall k (a :: k) (f :: k -> *).
Typeable a =>
TypeRepMap f -> Maybe (f a)
TM.lookup TypeRepMap EventHandler
eh :: Maybe (EventHandler s))
-- where unwrapEach handler =
--         let msg = "wanted: " <> show (typeRep $ Proxy @r) <> ", got: " <> show (dynTypeRep handler)
--         in unwrapEvt msg . fromDynamic $ handler

handleEvent' :: BotC r
              => EventHandlers
              -> DispatchData
              -> P.Sem (P.Fail ': r) [P.Sem r ()]
handleEvent' :: EventHandlers -> DispatchData -> Sem (Fail : r) [Sem r ()]
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(Ready rd :: ReadyData
rd@ReadyData {}) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((ReadyData -> Sem r ()) -> Sem r ())
-> [ReadyData -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((ReadyData -> Sem r ()) -> ReadyData -> Sem r ()
forall a b. (a -> b) -> a -> b
$ ReadyData
rd) (EventHandlers -> [EHType "ready" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"ready" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(ChannelCreate (DMChannel' chan :: DMChannel
chan)) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newChan :: Channel
newChan <- DMChannel -> Channel
DMChannel' (DMChannel -> Channel)
-> Sem (Fail : r) (Maybe DMChannel)
-> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<<$>> Snowflake DMChannel -> Sem (Fail : r) (Maybe DMChannel)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake DMChannel -> Sem r (Maybe DMChannel)
getDM (DMChannel -> Snowflake DMChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID DMChannel
chan)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Sem r ()) -> Sem r ())
-> [Channel -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Channel -> Sem r ()) -> Channel -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Channel
newChan) (EventHandlers -> [EHType "channelcreate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"channelcreate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(ChannelCreate (GuildChannel' chan :: GuildChannel
chan)) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (GuildChannel -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  Just newChan :: Channel
newChan <- Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Channel -> Sem (Fail : r) (Maybe Channel))
-> Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall a b. (a -> b) -> a -> b
$ GuildChannel -> Channel
GuildChannel' (GuildChannel -> Channel) -> Maybe GuildChannel -> Maybe Channel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Guild
guild Guild
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
-> Maybe GuildChannel
forall s a. s -> Getting a s a -> a
^. IsLabel
  "channels"
  ((SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
   -> Guild -> Const (Maybe GuildChannel) Guild)
(SnowflakeMap GuildChannel
 -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Guild -> Const (Maybe GuildChannel) Guild
#channels ((SnowflakeMap GuildChannel
  -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
 -> Guild -> Const (Maybe GuildChannel) Guild)
-> ((Maybe GuildChannel
     -> Const (Maybe GuildChannel) (Maybe GuildChannel))
    -> SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap GuildChannel)
-> Lens'
     (SnowflakeMap GuildChannel)
     (Maybe (IxValue (SnowflakeMap GuildChannel)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (GuildChannel -> Snowflake GuildChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Sem r ()) -> Sem r ())
-> [Channel -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Channel -> Sem r ()) -> Channel -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Channel
newChan) (EventHandlers -> [EHType "channelcreate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"channelcreate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(ChannelUpdate (DMChannel' chan :: DMChannel
chan)) = do
  Just oldChan :: Channel
oldChan <- DMChannel -> Channel
DMChannel' (DMChannel -> Channel)
-> Sem (Fail : r) (Maybe DMChannel)
-> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<<$>> Snowflake DMChannel -> Sem (Fail : r) (Maybe DMChannel)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake DMChannel -> Sem r (Maybe DMChannel)
getDM (DMChannel -> Snowflake DMChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID DMChannel
chan)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newChan :: Channel
newChan <- DMChannel -> Channel
DMChannel' (DMChannel -> Channel)
-> Sem (Fail : r) (Maybe DMChannel)
-> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<<$>> Snowflake DMChannel -> Sem (Fail : r) (Maybe DMChannel)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake DMChannel -> Sem r (Maybe DMChannel)
getDM (DMChannel -> Snowflake DMChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID DMChannel
chan)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Channel -> Sem r ()) -> Sem r ())
-> [Channel -> Channel -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Channel -> Channel -> Sem r ()
f -> Channel -> Channel -> Sem r ()
f Channel
oldChan Channel
newChan) (EventHandlers -> [EHType "channelupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"channelupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(ChannelUpdate (GuildChannel' chan :: GuildChannel
chan)) = do
  Just oldGuild :: Guild
oldGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (GuildChannel -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  Just oldChan :: Channel
oldChan <- Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Channel -> Sem (Fail : r) (Maybe Channel))
-> Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall a b. (a -> b) -> a -> b
$ GuildChannel -> Channel
GuildChannel' (GuildChannel -> Channel) -> Maybe GuildChannel -> Maybe Channel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Guild
oldGuild Guild
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
-> Maybe GuildChannel
forall s a. s -> Getting a s a -> a
^. IsLabel
  "channels"
  ((SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
   -> Guild -> Const (Maybe GuildChannel) Guild)
(SnowflakeMap GuildChannel
 -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Guild -> Const (Maybe GuildChannel) Guild
#channels ((SnowflakeMap GuildChannel
  -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
 -> Guild -> Const (Maybe GuildChannel) Guild)
-> ((Maybe GuildChannel
     -> Const (Maybe GuildChannel) (Maybe GuildChannel))
    -> SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap GuildChannel)
-> Lens'
     (SnowflakeMap GuildChannel)
     (Maybe (IxValue (SnowflakeMap GuildChannel)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (GuildChannel -> Snowflake GuildChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newGuild :: Guild
newGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (GuildChannel -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  Just newChan :: Channel
newChan <- Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Channel -> Sem (Fail : r) (Maybe Channel))
-> Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall a b. (a -> b) -> a -> b
$ GuildChannel -> Channel
GuildChannel' (GuildChannel -> Channel) -> Maybe GuildChannel -> Maybe Channel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Guild
newGuild Guild
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
-> Maybe GuildChannel
forall s a. s -> Getting a s a -> a
^. IsLabel
  "channels"
  ((SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
   -> Guild -> Const (Maybe GuildChannel) Guild)
(SnowflakeMap GuildChannel
 -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Guild -> Const (Maybe GuildChannel) Guild
#channels ((SnowflakeMap GuildChannel
  -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
 -> Guild -> Const (Maybe GuildChannel) Guild)
-> ((Maybe GuildChannel
     -> Const (Maybe GuildChannel) (Maybe GuildChannel))
    -> SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap GuildChannel)
-> Lens'
     (SnowflakeMap GuildChannel)
     (Maybe (IxValue (SnowflakeMap GuildChannel)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (GuildChannel -> Snowflake GuildChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Channel -> Sem r ()) -> Sem r ())
-> [Channel -> Channel -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Channel -> Channel -> Sem r ()
f -> Channel -> Channel -> Sem r ()
f Channel
oldChan Channel
newChan) (EventHandlers -> [EHType "channelupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"channelupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(ChannelDelete (GuildChannel' chan :: GuildChannel
chan)) = do
  Just oldGuild :: Guild
oldGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (GuildChannel -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  Just oldChan :: Channel
oldChan <- Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Channel -> Sem (Fail : r) (Maybe Channel))
-> Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall a b. (a -> b) -> a -> b
$ GuildChannel -> Channel
GuildChannel' (GuildChannel -> Channel) -> Maybe GuildChannel -> Maybe Channel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Guild
oldGuild Guild
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
-> Maybe GuildChannel
forall s a. s -> Getting a s a -> a
^. IsLabel
  "channels"
  ((SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
   -> Guild -> Const (Maybe GuildChannel) Guild)
(SnowflakeMap GuildChannel
 -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Guild -> Const (Maybe GuildChannel) Guild
#channels ((SnowflakeMap GuildChannel
  -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
 -> Guild -> Const (Maybe GuildChannel) Guild)
-> ((Maybe GuildChannel
     -> Const (Maybe GuildChannel) (Maybe GuildChannel))
    -> SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap GuildChannel)
-> Lens'
     (SnowflakeMap GuildChannel)
     (Maybe (IxValue (SnowflakeMap GuildChannel)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (GuildChannel -> Snowflake GuildChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Sem r ()) -> Sem r ())
-> [Channel -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Channel -> Sem r ()
f -> Channel -> Sem r ()
f Channel
oldChan) (EventHandlers -> [EHType "channeldelete" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"channeldelete" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(ChannelDelete (DMChannel' chan :: DMChannel
chan)) = do
  Just oldChan :: Channel
oldChan <- DMChannel -> Channel
DMChannel' (DMChannel -> Channel)
-> Sem (Fail : r) (Maybe DMChannel)
-> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<<$>> Snowflake DMChannel -> Sem (Fail : r) (Maybe DMChannel)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake DMChannel -> Sem r (Maybe DMChannel)
getDM (DMChannel -> Snowflake DMChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID DMChannel
chan)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Sem r ()) -> Sem r ())
-> [Channel -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Channel -> Sem r ()
f -> Channel -> Sem r ()
f Channel
oldChan) (EventHandlers -> [EHType "channeldelete" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"channeldelete" EventHandlers
eh)

-- handleEvent' eh evt@(ChannelPinsUpdate ChannelPinsUpdateData { channelID, lastPinTimestamp }) = do
--   chan <- (GuildChannel' <$> os ^? #channels . at (coerceSnowflake channelID) . _Just)
--     <|> (DMChannel' <$> os ^? #dms . at (coerceSnowflake channelID) . _Just)
--   pure $ map (\f -> f chan lastPinTimestamp) (unwrapEvent @"channelpinsupdate" eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildCreate guild :: Guild
guild) = do
  Bool
isNew <- Snowflake Guild -> Sem (Fail : r) Bool
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r Bool
isUnavailableGuild (Guild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Guild
guild)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (Guild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Guild
guild)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> Bool -> Sem r ()) -> Sem r ())
-> [Guild -> Bool -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> Bool -> Sem r ()
f -> Guild -> Bool -> Sem r ()
f Guild
guild Bool
isNew) (EventHandlers -> [EHType "guildcreate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildcreate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildUpdate guild :: UpdatedGuild
guild) = do
  Just oldGuild :: Guild
oldGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (UpdatedGuild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID UpdatedGuild
guild)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newGuild :: Guild
newGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (UpdatedGuild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID UpdatedGuild
guild)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> Guild -> Sem r ()) -> Sem r ())
-> [Guild -> Guild -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> Guild -> Sem r ()
f -> Guild -> Guild -> Sem r ()
f Guild
oldGuild Guild
newGuild) (EventHandlers -> [EHType "guildupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildupdate" EventHandlers
eh)

-- NOTE: Guild will be deleted in the new cache if unavailable was false
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildDelete UnavailableGuild { Snowflake Guild
$sel:id:UnavailableGuild :: UnavailableGuild -> Snowflake Guild
id :: Snowflake Guild
id, Bool
$sel:unavailable:UnavailableGuild :: UnavailableGuild -> Bool
unavailable :: Bool
unavailable }) = do
  Just oldGuild :: Guild
oldGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
id
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> Bool -> Sem r ()) -> Sem r ())
-> [Guild -> Bool -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> Bool -> Sem r ()
f -> Guild -> Bool -> Sem r ()
f Guild
oldGuild Bool
unavailable) (EventHandlers -> [EHType "guilddelete" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guilddelete" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildBanAdd BanData { Snowflake Guild
$sel:guildID:BanData :: BanData -> Snowflake Guild
guildID :: Snowflake Guild
guildID, User
$sel:user:BanData :: BanData -> User
user :: User
user }) = do
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> User -> Sem r ()) -> Sem r ())
-> [Guild -> User -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> User -> Sem r ()
f -> Guild -> User -> Sem r ()
f Guild
guild User
user) (EventHandlers -> [EHType "guildbanadd" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildbanadd" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildBanRemove BanData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:BanData :: BanData -> Snowflake Guild
guildID, User
user :: User
$sel:user:BanData :: BanData -> User
user }) = do
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> User -> Sem r ()) -> Sem r ())
-> [Guild -> User -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> User -> Sem r ()
f -> Guild -> User -> Sem r ()
f Guild
guild User
user) (EventHandlers -> [EHType "guildbanremove" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildbanremove" EventHandlers
eh)

-- NOTE: we fire this event using the guild data with old emojis
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildEmojisUpdate GuildEmojisUpdateData { Snowflake Guild
$sel:guildID:GuildEmojisUpdateData :: GuildEmojisUpdateData -> Snowflake Guild
guildID :: Snowflake Guild
guildID, [Emoji]
$sel:emojis:GuildEmojisUpdateData :: GuildEmojisUpdateData -> [Emoji]
emojis :: [Emoji]
emojis }) = do
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> [Emoji] -> Sem r ()) -> Sem r ())
-> [Guild -> [Emoji] -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> [Emoji] -> Sem r ()
f -> Guild -> [Emoji] -> Sem r ()
f Guild
guild [Emoji]
emojis) (EventHandlers -> [EHType "guildemojisupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildemojisupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildIntegrationsUpdate GuildIntegrationsUpdateData { Snowflake Guild
$sel:guildID:GuildIntegrationsUpdateData :: GuildIntegrationsUpdateData -> Snowflake Guild
guildID :: Snowflake Guild
guildID }) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> Sem r ()) -> Sem r ())
-> [Guild -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Guild -> Sem r ()) -> Guild -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Guild
guild) (EventHandlers -> [EHType "guildintegrationsupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildintegrationsupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildMemberAdd member :: Member
member) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild (Member -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Member
member)
  Just member :: Member
member <- Maybe Member -> Sem (Fail : r) (Maybe Member)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Member -> Sem (Fail : r) (Maybe Member))
-> Maybe Member -> Sem (Fail : r) (Maybe Member)
forall a b. (a -> b) -> a -> b
$ Guild
guild Guild
-> Getting (Maybe Member) Guild (Maybe Member) -> Maybe Member
forall s a. s -> Getting a s a -> a
^. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
   -> Guild -> Const (Maybe Member) Guild)
(SnowflakeMap Member -> Const (Maybe Member) (SnowflakeMap Member))
-> Guild -> Const (Maybe Member) Guild
#members ((SnowflakeMap Member
  -> Const (Maybe Member) (SnowflakeMap Member))
 -> Guild -> Const (Maybe Member) Guild)
-> ((Maybe Member -> Const (Maybe Member) (Maybe Member))
    -> SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
-> Getting (Maybe Member) Guild (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Member -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Member
member)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Member -> Sem r ()) -> Sem r ())
-> [Member -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Member -> Sem r ()) -> Member -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Member
member) (EventHandlers -> [EHType "guildmemberadd" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildmemberadd" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildMemberRemove GuildMemberRemoveData { User
$sel:user:GuildMemberRemoveData :: GuildMemberRemoveData -> User
user :: User
user, Snowflake Guild
$sel:guildID:GuildMemberRemoveData :: GuildMemberRemoveData -> Snowflake Guild
guildID :: Snowflake Guild
guildID }) = do
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just member :: Member
member <- Maybe Member -> Sem (Fail : r) (Maybe Member)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Member -> Sem (Fail : r) (Maybe Member))
-> Maybe Member -> Sem (Fail : r) (Maybe Member)
forall a b. (a -> b) -> a -> b
$ Guild
guild Guild
-> Getting (Maybe Member) Guild (Maybe Member) -> Maybe Member
forall s a. s -> Getting a s a -> a
^. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
   -> Guild -> Const (Maybe Member) Guild)
(SnowflakeMap Member -> Const (Maybe Member) (SnowflakeMap Member))
-> Guild -> Const (Maybe Member) Guild
#members ((SnowflakeMap Member
  -> Const (Maybe Member) (SnowflakeMap Member))
 -> Guild -> Const (Maybe Member) Guild)
-> ((Maybe Member -> Const (Maybe Member) (Maybe Member))
    -> SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
-> Getting (Maybe Member) Guild (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (User -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID User
user)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Member -> Sem r ()) -> Sem r ())
-> [Member -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Member -> Sem r ()) -> Member -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Member
member) (EventHandlers -> [EHType "guildmemberremove" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildmemberremove" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildMemberUpdate GuildMemberUpdateData { User
$sel:user:GuildMemberUpdateData :: GuildMemberUpdateData -> User
user :: User
user, Snowflake Guild
$sel:guildID:GuildMemberUpdateData :: GuildMemberUpdateData -> Snowflake Guild
guildID :: Snowflake Guild
guildID }) = do
  Just oldGuild :: Guild
oldGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just oldMember :: Member
oldMember <- Maybe Member -> Sem (Fail : r) (Maybe Member)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Member -> Sem (Fail : r) (Maybe Member))
-> Maybe Member -> Sem (Fail : r) (Maybe Member)
forall a b. (a -> b) -> a -> b
$ Guild
oldGuild Guild
-> Getting (Maybe Member) Guild (Maybe Member) -> Maybe Member
forall s a. s -> Getting a s a -> a
^. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
   -> Guild -> Const (Maybe Member) Guild)
(SnowflakeMap Member -> Const (Maybe Member) (SnowflakeMap Member))
-> Guild -> Const (Maybe Member) Guild
#members ((SnowflakeMap Member
  -> Const (Maybe Member) (SnowflakeMap Member))
 -> Guild -> Const (Maybe Member) Guild)
-> ((Maybe Member -> Const (Maybe Member) (Maybe Member))
    -> SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
-> Getting (Maybe Member) Guild (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (User -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID User
user)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newGuild :: Guild
newGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just newMember :: Member
newMember <- Maybe Member -> Sem (Fail : r) (Maybe Member)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Member -> Sem (Fail : r) (Maybe Member))
-> Maybe Member -> Sem (Fail : r) (Maybe Member)
forall a b. (a -> b) -> a -> b
$ Guild
newGuild Guild
-> Getting (Maybe Member) Guild (Maybe Member) -> Maybe Member
forall s a. s -> Getting a s a -> a
^. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
   -> Guild -> Const (Maybe Member) Guild)
(SnowflakeMap Member -> Const (Maybe Member) (SnowflakeMap Member))
-> Guild -> Const (Maybe Member) Guild
#members ((SnowflakeMap Member
  -> Const (Maybe Member) (SnowflakeMap Member))
 -> Guild -> Const (Maybe Member) Guild)
-> ((Maybe Member -> Const (Maybe Member) (Maybe Member))
    -> SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
-> Getting (Maybe Member) Guild (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (User -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID User
user)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Member -> Member -> Sem r ()) -> Sem r ())
-> [Member -> Member -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Member -> Member -> Sem r ()
f -> Member -> Member -> Sem r ()
f Member
oldMember Member
newMember) (EventHandlers -> [EHType "guildmemberupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildmemberupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildMembersChunk GuildMembersChunkData { [Member]
$sel:members:GuildMembersChunkData :: GuildMembersChunkData -> [Member]
members :: [Member]
members, Snowflake Guild
$sel:guildID:GuildMembersChunkData :: GuildMembersChunkData -> Snowflake Guild
guildID :: Snowflake Guild
guildID }) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  let members' :: [Member]
members' = Guild
guild Guild -> Getting (Endo [Member]) Guild Member -> [Member]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Endo [Member]) (SnowflakeMap Member))
   -> Guild -> Const (Endo [Member]) Guild)
(SnowflakeMap Member
 -> Const (Endo [Member]) (SnowflakeMap Member))
-> Guild -> Const (Endo [Member]) Guild
#members ((SnowflakeMap Member
  -> Const (Endo [Member]) (SnowflakeMap Member))
 -> Guild -> Const (Endo [Member]) Guild)
-> ((Member -> Const (Endo [Member]) Member)
    -> SnowflakeMap Member
    -> Const (Endo [Member]) (SnowflakeMap Member))
-> Getting (Endo [Member]) Guild Member
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Member
 -> (Maybe Member -> Const (Endo [Member]) (Maybe Member))
 -> SnowflakeMap Member
 -> Const (Endo [Member]) (SnowflakeMap Member))
-> [Member]
-> (Maybe Member -> Const (Endo [Member]) (Maybe Member))
-> SnowflakeMap Member
-> Const (Endo [Member]) (SnowflakeMap Member)
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Snowflake Member
-> (Maybe Member -> Const (Endo [Member]) (Maybe Member))
-> SnowflakeMap Member
-> Const (Endo [Member]) (SnowflakeMap Member)
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Snowflake Member
 -> (Maybe Member -> Const (Endo [Member]) (Maybe Member))
 -> SnowflakeMap Member
 -> Const (Endo [Member]) (SnowflakeMap Member))
-> (Member -> Snowflake Member)
-> Member
-> (Maybe Member -> Const (Endo [Member]) (Maybe Member))
-> SnowflakeMap Member
-> Const (Endo [Member]) (SnowflakeMap Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Member -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID) [Member]
members ((Maybe Member -> Const (Endo [Member]) (Maybe Member))
 -> SnowflakeMap Member
 -> Const (Endo [Member]) (SnowflakeMap Member))
-> ((Member -> Const (Endo [Member]) Member)
    -> Maybe Member -> Const (Endo [Member]) (Maybe Member))
-> (Member -> Const (Endo [Member]) Member)
-> SnowflakeMap Member
-> Const (Endo [Member]) (SnowflakeMap Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Member -> Const (Endo [Member]) Member)
-> Maybe Member -> Const (Endo [Member]) (Maybe Member)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> [Member] -> Sem r ()) -> Sem r ())
-> [Guild -> [Member] -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> [Member] -> Sem r ()
f -> Guild -> [Member] -> Sem r ()
f Guild
guild [Member]
members') (EventHandlers -> [EHType "guildmemberschunk" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildmemberschunk" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildRoleCreate GuildRoleData { Snowflake Guild
$sel:guildID:GuildRoleData :: GuildRoleData -> Snowflake Guild
guildID :: Snowflake Guild
guildID, Role
$sel:role:GuildRoleData :: GuildRoleData -> Role
role :: Role
role }) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just role' :: Role
role' <- Maybe Role -> Sem (Fail : r) (Maybe Role)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Role -> Sem (Fail : r) (Maybe Role))
-> Maybe Role -> Sem (Fail : r) (Maybe Role)
forall a b. (a -> b) -> a -> b
$ Guild
guild Guild -> Getting (Maybe Role) Guild (Maybe Role) -> Maybe Role
forall s a. s -> Getting a s a -> a
^. IsLabel
  "roles"
  ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
   -> Guild -> Const (Maybe Role) Guild)
(SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Guild -> Const (Maybe Role) Guild
#roles ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
 -> Guild -> Const (Maybe Role) Guild)
-> ((Maybe Role -> Const (Maybe Role) (Maybe Role))
    -> SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Getting (Maybe Role) Guild (Maybe Role)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Role)
-> Lens' (SnowflakeMap Role) (Maybe (IxValue (SnowflakeMap Role)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Role -> Snowflake Role
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Role
role)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> Role -> Sem r ()) -> Sem r ())
-> [Guild -> Role -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> Role -> Sem r ()
f -> Guild -> Role -> Sem r ()
f Guild
guild Role
role') (EventHandlers -> [EHType "guildrolecreate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildrolecreate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildRoleUpdate GuildRoleData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:GuildRoleData :: GuildRoleData -> Snowflake Guild
guildID, Role
role :: Role
$sel:role:GuildRoleData :: GuildRoleData -> Role
role }) = do
  Just oldGuild :: Guild
oldGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just oldRole :: Role
oldRole <- Maybe Role -> Sem (Fail : r) (Maybe Role)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Role -> Sem (Fail : r) (Maybe Role))
-> Maybe Role -> Sem (Fail : r) (Maybe Role)
forall a b. (a -> b) -> a -> b
$ Guild
oldGuild Guild -> Getting (Maybe Role) Guild (Maybe Role) -> Maybe Role
forall s a. s -> Getting a s a -> a
^. IsLabel
  "roles"
  ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
   -> Guild -> Const (Maybe Role) Guild)
(SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Guild -> Const (Maybe Role) Guild
#roles ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
 -> Guild -> Const (Maybe Role) Guild)
-> ((Maybe Role -> Const (Maybe Role) (Maybe Role))
    -> SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Getting (Maybe Role) Guild (Maybe Role)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Role)
-> Lens' (SnowflakeMap Role) (Maybe (IxValue (SnowflakeMap Role)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Role -> Snowflake Role
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Role
role)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newGuild :: Guild
newGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just newRole :: Role
newRole <- Maybe Role -> Sem (Fail : r) (Maybe Role)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Role -> Sem (Fail : r) (Maybe Role))
-> Maybe Role -> Sem (Fail : r) (Maybe Role)
forall a b. (a -> b) -> a -> b
$ Guild
newGuild Guild -> Getting (Maybe Role) Guild (Maybe Role) -> Maybe Role
forall s a. s -> Getting a s a -> a
^. IsLabel
  "roles"
  ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
   -> Guild -> Const (Maybe Role) Guild)
(SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Guild -> Const (Maybe Role) Guild
#roles ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
 -> Guild -> Const (Maybe Role) Guild)
-> ((Maybe Role -> Const (Maybe Role) (Maybe Role))
    -> SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Getting (Maybe Role) Guild (Maybe Role)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Role)
-> Lens' (SnowflakeMap Role) (Maybe (IxValue (SnowflakeMap Role)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Role -> Snowflake Role
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Role
role)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> Role -> Role -> Sem r ()) -> Sem r ())
-> [Guild -> Role -> Role -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> Role -> Role -> Sem r ()
f -> Guild -> Role -> Role -> Sem r ()
f Guild
newGuild Role
oldRole Role
newRole) (EventHandlers -> [EHType "guildroleupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildroleupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildRoleDelete GuildRoleDeleteData { Snowflake Guild
$sel:guildID:GuildRoleDeleteData :: GuildRoleDeleteData -> Snowflake Guild
guildID :: Snowflake Guild
guildID, Snowflake Role
$sel:roleID:GuildRoleDeleteData :: GuildRoleDeleteData -> Snowflake Role
roleID :: Snowflake Role
roleID }) = do
  Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just role :: Role
role <- Maybe Role -> Sem (Fail : r) (Maybe Role)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Role -> Sem (Fail : r) (Maybe Role))
-> Maybe Role -> Sem (Fail : r) (Maybe Role)
forall a b. (a -> b) -> a -> b
$ Guild
guild Guild -> Getting (Maybe Role) Guild (Maybe Role) -> Maybe Role
forall s a. s -> Getting a s a -> a
^. IsLabel
  "roles"
  ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
   -> Guild -> Const (Maybe Role) Guild)
(SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Guild -> Const (Maybe Role) Guild
#roles ((SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
 -> Guild -> Const (Maybe Role) Guild)
-> ((Maybe Role -> Const (Maybe Role) (Maybe Role))
    -> SnowflakeMap Role -> Const (Maybe Role) (SnowflakeMap Role))
-> Getting (Maybe Role) Guild (Maybe Role)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Role)
-> Lens' (SnowflakeMap Role) (Maybe (IxValue (SnowflakeMap Role)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at Index (SnowflakeMap Role)
Snowflake Role
roleID
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> Role -> Sem r ()) -> Sem r ())
-> [Guild -> Role -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Guild -> Role -> Sem r ()
f -> Guild -> Role -> Sem r ()
f Guild
guild Role
role) (EventHandlers -> [EHType "guildroledelete" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildroledelete" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageCreate msg :: Message
msg) = do
  Counter
messagesReceived <- Text -> [(Text, Text)] -> Sem (Fail : r) Counter
forall (r :: [(* -> *) -> * -> *]).
MemberWithError MetricEff r =>
Text -> [(Text, Text)] -> Sem r Counter
registerCounter "messages_received" [(Text, Text)]
forall a. Monoid a => a
mempty
  Sem (Fail : r) Int -> Sem (Fail : r) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem (Fail : r) Int -> Sem (Fail : r) ())
-> Sem (Fail : r) Int -> Sem (Fail : r) ()
forall a b. (a -> b) -> a -> b
$ Int -> Counter -> Sem (Fail : r) Int
forall (r :: [(* -> *) -> * -> *]).
MemberWithError MetricEff r =>
Int -> Counter -> Sem r Int
addCounter 1 Counter
messagesReceived
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> Sem r ()) -> Sem r ())
-> [Message -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Message -> Sem r ()) -> Message -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Message
msg) (EventHandlers -> [EHType "messagecreate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"messagecreate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageUpdate msg :: UpdatedMessage
msg) = do
  Just oldMsg :: Message
oldMsg <- Snowflake Message -> Sem (Fail : r) (Maybe Message)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r (Maybe Message)
getMessage (UpdatedMessage -> Snowflake Message
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID UpdatedMessage
msg)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newMsg :: Message
newMsg <- Snowflake Message -> Sem (Fail : r) (Maybe Message)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r (Maybe Message)
getMessage (UpdatedMessage -> Snowflake Message
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID UpdatedMessage
msg)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> Message -> Sem r ()) -> Sem r ())
-> [Message -> Message -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Message -> Message -> Sem r ()
f -> Message -> Message -> Sem r ()
f Message
oldMsg Message
newMsg) (EventHandlers -> [EHType "messageupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"messageupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageDelete MessageDeleteData { Snowflake Message
$sel:id:MessageDeleteData :: MessageDeleteData -> Snowflake Message
id :: Snowflake Message
id }) = do
  Just oldMsg :: Message
oldMsg <- Snowflake Message -> Sem (Fail : r) (Maybe Message)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r (Maybe Message)
getMessage Snowflake Message
id
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> Sem r ()) -> Sem r ())
-> [Message -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Message -> Sem r ()) -> Message -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Message
oldMsg) (EventHandlers -> [EHType "messagedelete" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"messagedelete" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageDeleteBulk MessageDeleteBulkData { [Snowflake Message]
$sel:ids:MessageDeleteBulkData :: MessageDeleteBulkData -> [Snowflake Message]
ids :: [Snowflake Message]
ids }) = do
  [Message]
messages <- [Maybe Message] -> [Message]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe Message] -> [Message])
-> Sem (Fail : r) [Maybe Message] -> Sem (Fail : r) [Message]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Snowflake Message -> Sem (Fail : r) (Maybe Message))
-> [Snowflake Message] -> Sem (Fail : r) [Maybe Message]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Snowflake Message -> Sem (Fail : r) (Maybe Message)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r (Maybe Message)
getMessage [Snowflake Message]
ids
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [[Sem r ()]] -> [Sem r ()]
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join ([[Sem r ()]] -> [Sem r ()])
-> Sem (Fail : r) [[Sem r ()]] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Message]
-> (Message -> Sem (Fail : r) [Sem r ()])
-> Sem (Fail : r) [[Sem r ()]]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for [Message]
messages (\msg :: Message
msg -> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> Sem r ()) -> Sem r ())
-> [Message -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Message -> Sem r ()) -> Message -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Message
msg) (EventHandlers -> [EHType "messagedelete" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"messagedelete" EventHandlers
eh))

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageReactionAdd reaction :: Reaction
reaction) = do
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just msg :: Message
msg <- Snowflake Message -> Sem (Fail : r) (Maybe Message)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r (Maybe Message)
getMessage (Reaction -> Snowflake Message
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Reaction
reaction)
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> Reaction -> Sem r ()) -> Sem r ())
-> [Message -> Reaction -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Message -> Reaction -> Sem r ()
f -> Message -> Reaction -> Sem r ()
f Message
msg Reaction
reaction) (EventHandlers -> [EHType "messagereactionadd" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"messagereactionadd" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageReactionRemove reaction :: Reaction
reaction) = do
  Just msg :: Message
msg <- Snowflake Message -> Sem (Fail : r) (Maybe Message)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r (Maybe Message)
getMessage (Reaction -> Snowflake Message
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Reaction
reaction)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> Reaction -> Sem r ()) -> Sem r ())
-> [Message -> Reaction -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Message -> Reaction -> Sem r ()
f -> Message -> Reaction -> Sem r ()
f Message
msg Reaction
reaction) (EventHandlers -> [EHType "messagereactionremove" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"messagereactionremove" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageReactionRemoveAll MessageReactionRemoveAllData { Snowflake Message
$sel:messageID:MessageReactionRemoveAllData :: MessageReactionRemoveAllData -> Snowflake Message
messageID :: Snowflake Message
messageID }) = do
  Just msg :: Message
msg <- Snowflake Message -> Sem (Fail : r) (Maybe Message)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r (Maybe Message)
getMessage Snowflake Message
messageID
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> Sem r ()) -> Sem r ())
-> [Message -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Message -> Sem r ()) -> Message -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Message
msg) (EventHandlers -> [EHType "messagereactionremoveall" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"messagereactionremoveall" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(PresenceUpdate PresenceUpdateData { Snowflake User
$sel:userID:PresenceUpdateData :: PresenceUpdateData -> Snowflake User
userID :: Snowflake User
userID, $sel:presence:PresenceUpdateData :: PresenceUpdateData -> Presence
presence = Presence { Snowflake Guild
$sel:guildID:Presence :: Presence -> Snowflake Guild
guildID :: Snowflake Guild
guildID } }) = do
  Just oldGuild :: Guild
oldGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just oldMember :: Member
oldMember <- Maybe Member -> Sem (Fail : r) (Maybe Member)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Member -> Sem (Fail : r) (Maybe Member))
-> Maybe Member -> Sem (Fail : r) (Maybe Member)
forall a b. (a -> b) -> a -> b
$ Guild
oldGuild Guild
-> Getting (Maybe Member) Guild (Maybe Member) -> Maybe Member
forall s a. s -> Getting a s a -> a
^. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
   -> Guild -> Const (Maybe Member) Guild)
(SnowflakeMap Member -> Const (Maybe Member) (SnowflakeMap Member))
-> Guild -> Const (Maybe Member) Guild
#members ((SnowflakeMap Member
  -> Const (Maybe Member) (SnowflakeMap Member))
 -> Guild -> Const (Maybe Member) Guild)
-> ((Maybe Member -> Const (Maybe Member) (Maybe Member))
    -> SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
-> Getting (Maybe Member) Guild (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Snowflake User -> Snowflake Member
forall k1 k2 (a :: k1) (b :: k2). Snowflake a -> Snowflake b
coerceSnowflake Snowflake User
userID)
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newGuild :: Guild
newGuild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
guildID
  Just newMember :: Member
newMember <- Maybe Member -> Sem (Fail : r) (Maybe Member)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Member -> Sem (Fail : r) (Maybe Member))
-> Maybe Member -> Sem (Fail : r) (Maybe Member)
forall a b. (a -> b) -> a -> b
$ Guild
newGuild Guild
-> Getting (Maybe Member) Guild (Maybe Member) -> Maybe Member
forall s a. s -> Getting a s a -> a
^. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
   -> Guild -> Const (Maybe Member) Guild)
(SnowflakeMap Member -> Const (Maybe Member) (SnowflakeMap Member))
-> Guild -> Const (Maybe Member) Guild
#members ((SnowflakeMap Member
  -> Const (Maybe Member) (SnowflakeMap Member))
 -> Guild -> Const (Maybe Member) Guild)
-> ((Maybe Member -> Const (Maybe Member) (Maybe Member))
    -> SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
-> Getting (Maybe Member) Guild (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Snowflake User -> Snowflake Member
forall k1 k2 (a :: k1) (b :: k2). Snowflake a -> Snowflake b
coerceSnowflake Snowflake User
userID)
  let userUpdates :: [Sem r ()]
userUpdates = if Member
oldMember Member -> Getting User Member User -> User
forall s a. s -> Getting a s a -> a
^. IsLabel "user" (Getting User Member User)
Getting User Member User
#user User -> User -> Bool
forall a. Eq a => a -> a -> Bool
/= Member
newMember Member -> Getting User Member User -> User
forall s a. s -> Getting a s a -> a
^. IsLabel "user" (Getting User Member User)
Getting User Member User
#user
                    then ((User -> User -> Sem r ()) -> Sem r ())
-> [User -> User -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: User -> User -> Sem r ()
f -> User -> User -> Sem r ()
f (Member
oldMember Member -> Getting User Member User -> User
forall s a. s -> Getting a s a -> a
^. IsLabel "user" (Getting User Member User)
Getting User Member User
#user) (Member
newMember Member -> Getting User Member User -> User
forall s a. s -> Getting a s a -> a
^. IsLabel "user" (Getting User Member User)
Getting User Member User
#user)) (EventHandlers -> [EHType "userupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"userupdate" EventHandlers
eh)
                    else [Sem r ()]
forall a. Monoid a => a
mempty
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ [Sem r ()]
userUpdates [Sem r ()] -> [Sem r ()] -> [Sem r ()]
forall a. Semigroup a => a -> a -> a
<> ((Member -> Member -> Sem r ()) -> Sem r ())
-> [Member -> Member -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Member -> Member -> Sem r ()
f -> Member -> Member -> Sem r ()
f Member
oldMember Member
newMember) (EventHandlers -> [EHType "guildmemberupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"guildmemberupdate" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh (TypingStart TypingStartData { Snowflake Channel
$sel:channelID:TypingStartData :: TypingStartData -> Snowflake Channel
channelID :: Snowflake Channel
channelID, Maybe (Snowflake Guild)
$sel:guildID:TypingStartData :: TypingStartData -> Maybe (Snowflake Guild)
guildID :: Maybe (Snowflake Guild)
guildID, Snowflake User
$sel:userID:TypingStartData :: TypingStartData -> Snowflake User
userID :: Snowflake User
userID, UnixTimestamp
$sel:timestamp:TypingStartData :: TypingStartData -> UnixTimestamp
timestamp :: UnixTimestamp
timestamp }) =
  case Maybe (Snowflake Guild)
guildID of
    Just gid :: Snowflake Guild
gid -> do
      Just guild :: Guild
guild <- Snowflake Guild -> Sem (Fail : r) (Maybe Guild)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r (Maybe Guild)
getGuild Snowflake Guild
gid
      Just member :: Member
member <- Maybe Member -> Sem (Fail : r) (Maybe Member)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Member -> Sem (Fail : r) (Maybe Member))
-> Maybe Member -> Sem (Fail : r) (Maybe Member)
forall a b. (a -> b) -> a -> b
$ Guild
guild Guild
-> Getting (Maybe Member) Guild (Maybe Member) -> Maybe Member
forall s a. s -> Getting a s a -> a
^. IsLabel
  "members"
  ((SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
   -> Guild -> Const (Maybe Member) Guild)
(SnowflakeMap Member -> Const (Maybe Member) (SnowflakeMap Member))
-> Guild -> Const (Maybe Member) Guild
#members ((SnowflakeMap Member
  -> Const (Maybe Member) (SnowflakeMap Member))
 -> Guild -> Const (Maybe Member) Guild)
-> ((Maybe Member -> Const (Maybe Member) (Maybe Member))
    -> SnowflakeMap Member
    -> Const (Maybe Member) (SnowflakeMap Member))
-> Getting (Maybe Member) Guild (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Snowflake User -> Snowflake Member
forall k1 k2 (a :: k1) (b :: k2). Snowflake a -> Snowflake b
coerceSnowflake Snowflake User
userID)
      Just chan :: Channel
chan <- Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Channel -> Sem (Fail : r) (Maybe Channel))
-> Maybe Channel -> Sem (Fail : r) (Maybe Channel)
forall a b. (a -> b) -> a -> b
$ GuildChannel -> Channel
GuildChannel' (GuildChannel -> Channel) -> Maybe GuildChannel -> Maybe Channel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Guild
guild Guild
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
-> Maybe GuildChannel
forall s a. s -> Getting a s a -> a
^. IsLabel
  "channels"
  ((SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
   -> Guild -> Const (Maybe GuildChannel) Guild)
(SnowflakeMap GuildChannel
 -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Guild -> Const (Maybe GuildChannel) Guild
#channels ((SnowflakeMap GuildChannel
  -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
 -> Guild -> Const (Maybe GuildChannel) Guild)
-> ((Maybe GuildChannel
     -> Const (Maybe GuildChannel) (Maybe GuildChannel))
    -> SnowflakeMap GuildChannel
    -> Const (Maybe GuildChannel) (SnowflakeMap GuildChannel))
-> Getting (Maybe GuildChannel) Guild (Maybe GuildChannel)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap GuildChannel)
-> Lens'
     (SnowflakeMap GuildChannel)
     (Maybe (IxValue (SnowflakeMap GuildChannel)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Snowflake Channel -> Snowflake GuildChannel
forall k1 k2 (a :: k1) (b :: k2). Snowflake a -> Snowflake b
coerceSnowflake Snowflake Channel
channelID)
      [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Maybe Member -> UnixTimestamp -> Sem r ())
 -> Sem r ())
-> [Channel -> Maybe Member -> UnixTimestamp -> Sem r ()]
-> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Channel -> Maybe Member -> UnixTimestamp -> Sem r ()
f -> Channel -> Maybe Member -> UnixTimestamp -> Sem r ()
f Channel
chan (Member -> Maybe Member
forall a. a -> Maybe a
Just Member
member) UnixTimestamp
timestamp) (EventHandlers -> [EHType "typingstart" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"typingstart" EventHandlers
eh)
    Nothing -> do
      Just chan :: Channel
chan <- DMChannel -> Channel
DMChannel' (DMChannel -> Channel)
-> Sem (Fail : r) (Maybe DMChannel)
-> Sem (Fail : r) (Maybe Channel)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<<$>> Snowflake DMChannel -> Sem (Fail : r) (Maybe DMChannel)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake DMChannel -> Sem r (Maybe DMChannel)
getDM (Snowflake Channel -> Snowflake DMChannel
forall k1 k2 (a :: k1) (b :: k2). Snowflake a -> Snowflake b
coerceSnowflake Snowflake Channel
channelID)
      [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> Maybe Member -> UnixTimestamp -> Sem r ())
 -> Sem r ())
-> [Channel -> Maybe Member -> UnixTimestamp -> Sem r ()]
-> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: Channel -> Maybe Member -> UnixTimestamp -> Sem r ()
f -> Channel -> Maybe Member -> UnixTimestamp -> Sem r ()
f Channel
chan Maybe Member
forall a. Maybe a
Nothing UnixTimestamp
timestamp) (EventHandlers -> [EHType "typingstart" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"typingstart" EventHandlers
eh)

handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(UserUpdate _) = do
  Just oldUser :: User
oldUser <- Sem (Fail : r) (Maybe User)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Sem r (Maybe User)
getBotUser
  DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
  Just newUser :: User
newUser <- Sem (Fail : r) (Maybe User)
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Sem r (Maybe User)
getBotUser
  [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Sem r ()] -> Sem (Fail : r) [Sem r ()])
-> [Sem r ()] -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ ((User -> User -> Sem r ()) -> Sem r ())
-> [User -> User -> Sem r ()] -> [Sem r ()]
forall a b. (a -> b) -> [a] -> [b]
map (\f :: User -> User -> Sem r ()
f -> User -> User -> Sem r ()
f User
oldUser User
newUser) (EventHandlers -> [EHType "userupdate" (Sem r)]
forall (s :: Symbol) (r :: [(* -> *) -> * -> *]).
(KnownSymbol s, EHType' s ~ Dynamic, Typeable r,
 Typeable (EHType s (Sem r))) =>
EventHandlers -> [EHType s (Sem r)]
unwrapEvent @"userupdate" EventHandlers
eh)

handleEvent' _ e :: DispatchData
e = String -> Sem (Fail : r) [Sem r ()]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Sem (Fail : r) [Sem r ()])
-> String -> Sem (Fail : r) [Sem r ()]
forall a b. (a -> b) -> a -> b
$ "Unhandled event: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> DispatchData -> String
forall a. Show a => a -> String
show DispatchData
e

updateCache :: P.Members '[CacheEff, P.Fail] r => DispatchData -> P.Sem r ()
updateCache :: DispatchData -> Sem r ()
updateCache (Ready ReadyData { User
$sel:user:ReadyData :: ReadyData -> User
user :: User
user, [UnavailableGuild]
$sel:guilds:ReadyData :: ReadyData -> [UnavailableGuild]
guilds :: [UnavailableGuild]
guilds }) = do
  User -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
User -> Sem r ()
setBotUser User
user
  [Snowflake Guild] -> (Snowflake Guild -> Sem r ()) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ ((UnavailableGuild -> Snowflake Guild)
-> [UnavailableGuild] -> [Snowflake Guild]
forall a b. (a -> b) -> [a] -> [b]
map UnavailableGuild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID [UnavailableGuild]
guilds) Snowflake Guild -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r ()
setUnavailableGuild

updateCache (ChannelCreate (DMChannel' chan :: DMChannel
chan)) =
  DMChannel -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
DMChannel -> Sem r ()
setDM DMChannel
chan

updateCache (ChannelCreate (GuildChannel' chan :: GuildChannel
chan)) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild (GuildChannel -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan) (IsLabel
  "channels"
  (ASetter
     Guild
     Guild
     (SnowflakeMap GuildChannel)
     (SnowflakeMap GuildChannel))
ASetter
  Guild Guild (SnowflakeMap GuildChannel) (SnowflakeMap GuildChannel)
#channels ASetter
  Guild Guild (SnowflakeMap GuildChannel) (SnowflakeMap GuildChannel)
-> (SnowflakeMap GuildChannel -> SnowflakeMap GuildChannel)
-> Guild
-> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ GuildChannel
-> SnowflakeMap GuildChannel -> SnowflakeMap GuildChannel
forall a. HasID' a => a -> SnowflakeMap a -> SnowflakeMap a
SM.insert GuildChannel
chan)

updateCache (ChannelUpdate (DMChannel' chan :: DMChannel
chan)) =
  Snowflake DMChannel -> (DMChannel -> DMChannel) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake DMChannel -> (DMChannel -> DMChannel) -> Sem r ()
updateDM (DMChannel -> Snowflake DMChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID DMChannel
chan) (Updated DMChannel -> DMChannel -> DMChannel
forall a. Updateable a => Updated a -> a -> a
update DMChannel
Updated DMChannel
chan)

updateCache (ChannelUpdate (GuildChannel' chan :: GuildChannel
chan)) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild (GuildChannel -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan) (IsLabel
  "channels"
  (ASetter
     Guild
     Guild
     (SnowflakeMap GuildChannel)
     (SnowflakeMap GuildChannel))
ASetter
  Guild Guild (SnowflakeMap GuildChannel) (SnowflakeMap GuildChannel)
#channels ASetter
  Guild Guild (SnowflakeMap GuildChannel) (SnowflakeMap GuildChannel)
-> ((GuildChannel -> Identity GuildChannel)
    -> SnowflakeMap GuildChannel
    -> Identity (SnowflakeMap GuildChannel))
-> (GuildChannel -> Identity GuildChannel)
-> Guild
-> Identity Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap GuildChannel)
-> Lens'
     (SnowflakeMap GuildChannel)
     (Maybe (IxValue (SnowflakeMap GuildChannel)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (GuildChannel -> Snowflake GuildChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan) ((Maybe GuildChannel -> Identity (Maybe GuildChannel))
 -> SnowflakeMap GuildChannel
 -> Identity (SnowflakeMap GuildChannel))
-> ((GuildChannel -> Identity GuildChannel)
    -> Maybe GuildChannel -> Identity (Maybe GuildChannel))
-> (GuildChannel -> Identity GuildChannel)
-> SnowflakeMap GuildChannel
-> Identity (SnowflakeMap GuildChannel)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GuildChannel -> Identity GuildChannel)
-> Maybe GuildChannel -> Identity (Maybe GuildChannel)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((GuildChannel -> Identity GuildChannel)
 -> Guild -> Identity Guild)
-> (GuildChannel -> GuildChannel) -> Guild -> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Updated GuildChannel -> GuildChannel -> GuildChannel
forall a. Updateable a => Updated a -> a -> a
update GuildChannel
Updated GuildChannel
chan)

updateCache (ChannelDelete (DMChannel' chan :: DMChannel
chan)) =
  Snowflake DMChannel -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake DMChannel -> Sem r ()
delDM (DMChannel -> Snowflake DMChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID DMChannel
chan)

updateCache (ChannelDelete (GuildChannel' chan :: GuildChannel
chan)) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild (GuildChannel -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan) (IsLabel
  "channels"
  (ASetter
     Guild
     Guild
     (SnowflakeMap GuildChannel)
     (SnowflakeMap GuildChannel))
ASetter
  Guild Guild (SnowflakeMap GuildChannel) (SnowflakeMap GuildChannel)
#channels ASetter
  Guild Guild (SnowflakeMap GuildChannel) (SnowflakeMap GuildChannel)
-> (SnowflakeMap GuildChannel -> SnowflakeMap GuildChannel)
-> Guild
-> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Index (SnowflakeMap GuildChannel)
-> SnowflakeMap GuildChannel -> SnowflakeMap GuildChannel
forall m. At m => Index m -> m -> m
sans (GuildChannel -> Snowflake GuildChannel
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID GuildChannel
chan))

updateCache (GuildCreate guild :: Guild
guild) = do
  Bool
isNew <- Snowflake Guild -> Sem r Bool
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r Bool
isUnavailableGuild (Guild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Guild
guild)
  Bool -> Sem r () -> Sem r ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
isNew (Sem r () -> Sem r ()) -> Sem r () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ Snowflake Guild -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r ()
delUnavailableGuild (Guild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Guild
guild)
  Guild -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Guild -> Sem r ()
setGuild Guild
guild
  SnowflakeMap User -> (User -> Sem r ()) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ ([User] -> SnowflakeMap User
forall a. HasID' a => [a] -> SnowflakeMap a
SM.fromList (Guild
guild Guild -> Getting (Endo [User]) Guild User -> [User]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. IsLabel
  "members"
  ((SnowflakeMap Member -> Const (Endo [User]) (SnowflakeMap Member))
   -> Guild -> Const (Endo [User]) Guild)
(SnowflakeMap Member -> Const (Endo [User]) (SnowflakeMap Member))
-> Guild -> Const (Endo [User]) Guild
#members ((SnowflakeMap Member -> Const (Endo [User]) (SnowflakeMap Member))
 -> Guild -> Const (Endo [User]) Guild)
-> ((User -> Const (Endo [User]) User)
    -> SnowflakeMap Member
    -> Const (Endo [User]) (SnowflakeMap Member))
-> Getting (Endo [User]) Guild User
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Member -> Const (Endo [User]) Member)
-> SnowflakeMap Member -> Const (Endo [User]) (SnowflakeMap Member)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Member -> Const (Endo [User]) Member)
 -> SnowflakeMap Member
 -> Const (Endo [User]) (SnowflakeMap Member))
-> ((User -> Const (Endo [User]) User)
    -> Member -> Const (Endo [User]) Member)
-> (User -> Const (Endo [User]) User)
-> SnowflakeMap Member
-> Const (Endo [User]) (SnowflakeMap Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IsLabel
  "user"
  ((User -> Const (Endo [User]) User)
   -> Member -> Const (Endo [User]) Member)
(User -> Const (Endo [User]) User)
-> Member -> Const (Endo [User]) Member
#user)) User -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
User -> Sem r ()
setUser

updateCache (GuildUpdate guild :: UpdatedGuild
guild) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild (UpdatedGuild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID UpdatedGuild
guild) (Updated Guild -> Guild -> Guild
forall a. Updateable a => Updated a -> a -> a
update UpdatedGuild
Updated Guild
guild)

updateCache (GuildDelete guild :: UnavailableGuild
guild) =
  Snowflake Guild -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r ()
delGuild (UnavailableGuild -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID UnavailableGuild
guild)

updateCache (GuildEmojisUpdate GuildEmojisUpdateData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:GuildEmojisUpdateData :: GuildEmojisUpdateData -> Snowflake Guild
guildID, [Emoji]
emojis :: [Emoji]
$sel:emojis:GuildEmojisUpdateData :: GuildEmojisUpdateData -> [Emoji]
emojis }) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild Snowflake Guild
guildID (IsLabel
  "emojis"
  (ASetter Guild Guild (SnowflakeMap Emoji) (SnowflakeMap Emoji))
ASetter Guild Guild (SnowflakeMap Emoji) (SnowflakeMap Emoji)
#emojis ASetter Guild Guild (SnowflakeMap Emoji) (SnowflakeMap Emoji)
-> SnowflakeMap Emoji -> Guild -> Guild
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Emoji] -> SnowflakeMap Emoji
forall a. HasID' a => [a] -> SnowflakeMap a
SM.fromList [Emoji]
emojis)

updateCache (GuildMemberAdd member :: Member
member) = do
  User -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
User -> Sem r ()
setUser (Member
member Member -> Getting User Member User -> User
forall s a. s -> Getting a s a -> a
^. IsLabel "user" (Getting User Member User)
Getting User Member User
#user)
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild (Member -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Member
member) (IsLabel
  "members"
  ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
   -> Guild -> Identity Guild)
(SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> Guild -> Identity Guild
#members ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
 -> Guild -> Identity Guild)
-> ((Maybe Member -> Identity (Maybe Member))
    -> SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> (Maybe Member -> Identity (Maybe Member))
-> Guild
-> Identity Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Member -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Member
member) ((Maybe Member -> Identity (Maybe Member))
 -> Guild -> Identity Guild)
-> Member -> Guild -> Guild
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Member
member)

updateCache (GuildMemberRemove GuildMemberRemoveData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:GuildMemberRemoveData :: GuildMemberRemoveData -> Snowflake Guild
guildID, User
user :: User
$sel:user:GuildMemberRemoveData :: GuildMemberRemoveData -> User
user }) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild Snowflake Guild
guildID (IsLabel
  "members"
  ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
   -> Guild -> Identity Guild)
(SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> Guild -> Identity Guild
#members ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
 -> Guild -> Identity Guild)
-> (SnowflakeMap Member -> SnowflakeMap Member) -> Guild -> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Index (SnowflakeMap Member)
-> SnowflakeMap Member -> SnowflakeMap Member
forall m. At m => Index m -> m -> m
sans (User -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID User
user))

updateCache (GuildMemberUpdate GuildMemberUpdateData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:GuildMemberUpdateData :: GuildMemberUpdateData -> Snowflake Guild
guildID, Vector (Snowflake Role)
$sel:roles:GuildMemberUpdateData :: GuildMemberUpdateData -> Vector (Snowflake Role)
roles :: Vector (Snowflake Role)
roles, User
user :: User
$sel:user:GuildMemberUpdateData :: GuildMemberUpdateData -> User
user, Maybe Text
$sel:nick:GuildMemberUpdateData :: GuildMemberUpdateData -> Maybe Text
nick :: Maybe Text
nick }) = do
  User -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
User -> Sem r ()
setUser User
user
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild Snowflake Guild
guildID (IsLabel
  "members"
  ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
   -> Guild -> Identity Guild)
(SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> Guild -> Identity Guild
#members ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
 -> Guild -> Identity Guild)
-> ((Member -> Identity Member)
    -> SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> (Member -> Identity Member)
-> Guild
-> Identity Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Traversal' (SnowflakeMap Member) (IxValue (SnowflakeMap Member))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix (User -> Snowflake Member
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID User
user) ((Member -> Identity Member) -> Guild -> Identity Guild)
-> (Member -> Member) -> Guild -> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (IsLabel
  "roles"
  (ASetter
     Member Member (Vector (Snowflake Role)) (Vector (Snowflake Role)))
ASetter
  Member Member (Vector (Snowflake Role)) (Vector (Snowflake Role))
#roles ASetter
  Member Member (Vector (Snowflake Role)) (Vector (Snowflake Role))
-> Vector (Snowflake Role) -> Member -> Member
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Vector (Snowflake Role)
roles) (Member -> Member) -> (Member -> Member) -> Member -> Member
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IsLabel "nick" (ASetter Member Member (Maybe Text) (Maybe Text))
ASetter Member Member (Maybe Text) (Maybe Text)
#nick ASetter Member Member (Maybe Text) (Maybe Text)
-> Maybe Text -> Member -> Member
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Text
nick))

updateCache (GuildMembersChunk GuildMembersChunkData { [Member]
members :: [Member]
$sel:members:GuildMembersChunkData :: GuildMembersChunkData -> [Member]
members }) =
  (Member -> Sem r ()) -> [Member] -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ (DispatchData -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache (DispatchData -> Sem r ())
-> (Member -> DispatchData) -> Member -> Sem r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Member -> DispatchData
GuildMemberAdd) [Member]
members

updateCache (GuildRoleCreate GuildRoleData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:GuildRoleData :: GuildRoleData -> Snowflake Guild
guildID, Role
role :: Role
$sel:role:GuildRoleData :: GuildRoleData -> Role
role }) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild Snowflake Guild
guildID (IsLabel
  "roles"
  (ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role))
ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role)
#roles ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role)
-> (SnowflakeMap Role -> SnowflakeMap Role) -> Guild -> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Role -> SnowflakeMap Role -> SnowflakeMap Role
forall a. HasID' a => a -> SnowflakeMap a -> SnowflakeMap a
SM.insert Role
role)

updateCache (GuildRoleUpdate GuildRoleData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:GuildRoleData :: GuildRoleData -> Snowflake Guild
guildID, Role
role :: Role
$sel:role:GuildRoleData :: GuildRoleData -> Role
role }) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild Snowflake Guild
guildID (IsLabel
  "roles"
  (ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role))
ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role)
#roles ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role)
-> (SnowflakeMap Role -> SnowflakeMap Role) -> Guild -> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Role -> SnowflakeMap Role -> SnowflakeMap Role
forall a. HasID' a => a -> SnowflakeMap a -> SnowflakeMap a
SM.insert Role
role)

updateCache (GuildRoleDelete GuildRoleDeleteData { Snowflake Guild
guildID :: Snowflake Guild
$sel:guildID:GuildRoleDeleteData :: GuildRoleDeleteData -> Snowflake Guild
guildID, Snowflake Role
roleID :: Snowflake Role
$sel:roleID:GuildRoleDeleteData :: GuildRoleDeleteData -> Snowflake Role
roleID }) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild Snowflake Guild
guildID (IsLabel
  "roles"
  (ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role))
ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role)
#roles ASetter Guild Guild (SnowflakeMap Role) (SnowflakeMap Role)
-> (SnowflakeMap Role -> SnowflakeMap Role) -> Guild -> Guild
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Index (SnowflakeMap Role) -> SnowflakeMap Role -> SnowflakeMap Role
forall m. At m => Index m -> m -> m
sans Index (SnowflakeMap Role)
Snowflake Role
roleID)

updateCache (MessageCreate msg :: Message
msg) = Message -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Message -> Sem r ()
setMessage Message
msg

updateCache (MessageUpdate msg :: UpdatedMessage
msg) =
  Snowflake Message -> (Message -> Message) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Message -> (Message -> Message) -> Sem r ()
updateMessage (UpdatedMessage -> Snowflake Message
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID UpdatedMessage
msg) (Updated Message -> Message -> Message
forall a. Updateable a => Updated a -> a -> a
update UpdatedMessage
Updated Message
msg)

updateCache (MessageDelete MessageDeleteData { Snowflake Message
id :: Snowflake Message
$sel:id:MessageDeleteData :: MessageDeleteData -> Snowflake Message
id }) = Snowflake Message -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r ()
delMessage Snowflake Message
id

updateCache (MessageDeleteBulk MessageDeleteBulkData { [Snowflake Message]
ids :: [Snowflake Message]
$sel:ids:MessageDeleteBulkData :: MessageDeleteBulkData -> [Snowflake Message]
ids }) =
  [Snowflake Message] -> (Snowflake Message -> Sem r ()) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Snowflake Message]
ids Snowflake Message -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Message -> Sem r ()
delMessage

updateCache (MessageReactionAdd reaction :: Reaction
reaction) =
  Snowflake Message -> (Message -> Message) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Message -> (Message -> Message) -> Sem r ()
updateMessage (Reaction -> Snowflake Message
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Reaction
reaction) (IsLabel "reactions" (ASetter Message Message [Reaction] [Reaction])
ASetter Message Message [Reaction] [Reaction]
#reactions ASetter Message Message [Reaction] [Reaction]
-> ([Reaction] -> [Reaction]) -> Message -> Message
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Reaction -> [Reaction] -> [Reaction]
forall s a. Cons s s a a => a -> s -> s
cons Reaction
reaction)

updateCache (MessageReactionRemove reaction :: Reaction
reaction) =
  Snowflake Message -> (Message -> Message) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Message -> (Message -> Message) -> Sem r ()
updateMessage (Reaction -> Snowflake Message
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Reaction
reaction) (IsLabel "reactions" (ASetter Message Message [Reaction] [Reaction])
ASetter Message Message [Reaction] [Reaction]
#reactions ASetter Message Message [Reaction] [Reaction]
-> ([Reaction] -> [Reaction]) -> Message -> Message
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (Reaction -> Bool) -> [Reaction] -> [Reaction]
forall a. (a -> Bool) -> [a] -> [a]
filter (\r :: Reaction
r -> Reaction
r Reaction -> Getting RawEmoji Reaction RawEmoji -> RawEmoji
forall s a. s -> Getting a s a -> a
^. IsLabel "emoji" (Getting RawEmoji Reaction RawEmoji)
Getting RawEmoji Reaction RawEmoji
#emoji RawEmoji -> RawEmoji -> Bool
forall a. Eq a => a -> a -> Bool
/= Reaction
reaction Reaction -> Getting RawEmoji Reaction RawEmoji -> RawEmoji
forall s a. s -> Getting a s a -> a
^. IsLabel "emoji" (Getting RawEmoji Reaction RawEmoji)
Getting RawEmoji Reaction RawEmoji
#emoji))

updateCache (MessageReactionRemoveAll MessageReactionRemoveAllData { Snowflake Message
messageID :: Snowflake Message
$sel:messageID:MessageReactionRemoveAllData :: MessageReactionRemoveAllData -> Snowflake Message
messageID }) =
  Snowflake Message -> (Message -> Message) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Message -> (Message -> Message) -> Sem r ()
updateMessage Snowflake Message
messageID (IsLabel "reactions" (ASetter Message Message [Reaction] [Reaction])
ASetter Message Message [Reaction] [Reaction]
#reactions ASetter Message Message [Reaction] [Reaction]
-> [Reaction] -> Message -> Message
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Reaction]
forall a. Monoid a => a
mempty)

updateCache (PresenceUpdate PresenceUpdateData { Snowflake User
userID :: Snowflake User
$sel:userID:PresenceUpdateData :: PresenceUpdateData -> Snowflake User
userID, Vector (Snowflake Role)
$sel:roles:PresenceUpdateData :: PresenceUpdateData -> Vector (Snowflake Role)
roles :: Vector (Snowflake Role)
roles, Presence
presence :: Presence
$sel:presence:PresenceUpdateData :: PresenceUpdateData -> Presence
presence }) =
  Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild (Presence -> Snowflake Guild
forall k (b :: k) a. HasID b a => a -> Snowflake b
getID Presence
presence) ((IsLabel
  "members"
  ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
   -> Guild -> Identity Guild)
(SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> Guild -> Identity Guild
#members ((SnowflakeMap Member -> Identity (SnowflakeMap Member))
 -> Guild -> Identity Guild)
-> ((Vector (Snowflake Role) -> Identity (Vector (Snowflake Role)))
    -> SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> (Vector (Snowflake Role) -> Identity (Vector (Snowflake Role)))
-> Guild
-> Identity Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (SnowflakeMap Member)
-> Lens'
     (SnowflakeMap Member) (Maybe (IxValue (SnowflakeMap Member)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at (Snowflake User -> Snowflake Member
forall k1 k2 (a :: k1) (b :: k2). Snowflake a -> Snowflake b
coerceSnowflake Snowflake User
userID) ((Maybe Member -> Identity (Maybe Member))
 -> SnowflakeMap Member -> Identity (SnowflakeMap Member))
-> ((Vector (Snowflake Role) -> Identity (Vector (Snowflake Role)))
    -> Maybe Member -> Identity (Maybe Member))
-> (Vector (Snowflake Role) -> Identity (Vector (Snowflake Role)))
-> SnowflakeMap Member
-> Identity (SnowflakeMap Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Member -> Identity Member)
-> Maybe Member -> Identity (Maybe Member)
forall a b. Prism (Maybe a) (Maybe b) a b
_Just ((Member -> Identity Member)
 -> Maybe Member -> Identity (Maybe Member))
-> ASetter
     Member Member (Vector (Snowflake Role)) (Vector (Snowflake Role))
-> (Vector (Snowflake Role) -> Identity (Vector (Snowflake Role)))
-> Maybe Member
-> Identity (Maybe Member)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IsLabel
  "roles"
  (ASetter
     Member Member (Vector (Snowflake Role)) (Vector (Snowflake Role)))
ASetter
  Member Member (Vector (Snowflake Role)) (Vector (Snowflake Role))
#roles ((Vector (Snowflake Role) -> Identity (Vector (Snowflake Role)))
 -> Guild -> Identity Guild)
-> Vector (Snowflake Role) -> Guild -> Guild
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Vector (Snowflake Role)
roles)
                                (Guild -> Guild) -> (Guild -> Guild) -> Guild -> Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IsLabel
  "presences"
  ((HashMap (Snowflake User) Presence
    -> Identity (HashMap (Snowflake User) Presence))
   -> Guild -> Identity Guild)
(HashMap (Snowflake User) Presence
 -> Identity (HashMap (Snowflake User) Presence))
-> Guild -> Identity Guild
#presences ((HashMap (Snowflake User) Presence
  -> Identity (HashMap (Snowflake User) Presence))
 -> Guild -> Identity Guild)
-> ((Maybe Presence -> Identity (Maybe Presence))
    -> HashMap (Snowflake User) Presence
    -> Identity (HashMap (Snowflake User) Presence))
-> (Maybe Presence -> Identity (Maybe Presence))
-> Guild
-> Identity Guild
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Index (HashMap (Snowflake User) Presence)
-> Lens'
     (HashMap (Snowflake User) Presence)
     (Maybe (IxValue (HashMap (Snowflake User) Presence)))
forall m. At m => Index m -> Lens' m (Maybe (IxValue m))
at Index (HashMap (Snowflake User) Presence)
Snowflake User
userID ((Maybe Presence -> Identity (Maybe Presence))
 -> Guild -> Identity Guild)
-> Presence -> Guild -> Guild
forall s t a b. ASetter s t a (Maybe b) -> b -> s -> t
?~ Presence
presence))

updateCache (UserUpdate user :: User
user) = User -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
User -> Sem r ()
setBotUser User
user

-- we don't handle group channels currently
updateCache (ChannelCreate (GroupChannel' _)) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (ChannelUpdate (GroupChannel' _)) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (ChannelDelete (GroupChannel' _)) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- these don't modify state
updateCache (GuildBanAdd _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (GuildBanRemove _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (GuildIntegrationsUpdate _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (TypingStart _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (ChannelPinsUpdate _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (WebhooksUpdate _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- we don't handle voice state currently
updateCache (VoiceStateUpdate _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (VoiceServerUpdate _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()