{-# OPTIONS_GHC -Wno-name-shadowing #-}
module Calamity.Client.Client
( react
, runBotIO
, runBotIO'
, stopBot
, sendPresence
, events
, fire
, waitUntil
, waitUntilM
, CalamityEvent(Dispatch, ShutDown)
, customEvt ) where
import Calamity.Cache.Eff
import Calamity.Client.ShardManager
import Calamity.Client.Types
import Calamity.Gateway.DispatchEvents
import Calamity.Gateway.Types
import Calamity.Gateway.Intents
import Calamity.HTTP.Internal.Ratelimit
import Calamity.Internal.ConstructorName
import Calamity.Internal.RunIntoIO
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.Model.User
import Calamity.Types.Snowflake
import Calamity.Types.Token
import Calamity.Types.LogEff
import Control.Concurrent.Chan.Unagi
import Control.Concurrent.MVar
import Control.Concurrent.STM
import Control.Exception ( SomeException )
import Control.Lens hiding ( (<.>) )
import Control.Monad
import Data.Default.Class
import Data.Dynamic
import Data.Foldable
import Data.Generics.Product.Subtype
import Data.IORef
import Data.Maybe
import Data.Proxy
import qualified Data.Text as S
import Data.Time.Clock.POSIX
import Data.Typeable
import qualified Di.Core as DC
import qualified Df1
import qualified DiPolysemy as Di
import Network.Wreq.Session ( Session, newAPISession )
import Fmt
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
import qualified Polysemy.Resource as P
import TextShow ( TextShow(showt) )
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 -> Session -> Maybe (DC.Di Df1.Level Df1.Path Df1.Message) -> IO Client
newClient :: Token -> Session -> Maybe (Di Level Path Message) -> IO Client
newClient token :: Token
token session :: Session
session initialDi :: Maybe (Di Level Path Message)
initialDi = do
TVar [(InChan ControlMessage, Async (Maybe ()))]
shards' <- [(InChan ControlMessage, Async (Maybe ()))]
-> IO (TVar [(InChan ControlMessage, 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
(inc :: InChan CalamityEvent
inc, outc :: OutChan CalamityEvent
outc) <- IO (InChan CalamityEvent, OutChan CalamityEvent)
forall a. IO (InChan a, OutChan a)
newChan
IORef Integer
ehidCounter <- Integer -> IO (IORef Integer)
forall a. a -> IO (IORef a)
newIORef 0
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 [(InChan ControlMessage, Async (Maybe ()))]
-> MVar Int
-> Token
-> RateLimitState
-> InChan CalamityEvent
-> OutChan CalamityEvent
-> IORef Integer
-> Session
-> Maybe (Di Level Path Message)
-> Client
Client TVar [(InChan ControlMessage, Async (Maybe ()))]
shards'
MVar Int
numShards'
Token
token
RateLimitState
rlState'
InChan CalamityEvent
inc
OutChan CalamityEvent
outc
IORef Integer
ehidCounter
Session
session
Maybe (Di Level Path Message)
initialDi
runBotIO :: forall r a.
(P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r))
=> Token
-> P.Sem (SetupEff r) a
-> P.Sem r (Maybe StartupError)
runBotIO :: Token -> Sem (SetupEff r) a -> Sem r (Maybe StartupError)
runBotIO token :: Token
token setup :: Sem (SetupEff r) a
setup = Token
-> Maybe Session
-> Maybe StatusUpdateData
-> Maybe Intents
-> Sem (SetupEff r) a
-> Sem r (Maybe StartupError)
forall (r :: [(* -> *) -> * -> *]) a.
(Members '[Embed IO, Final IO, CacheEff, MetricEff, LogEff] r,
Typeable (SetupEff r)) =>
Token
-> Maybe Session
-> Maybe StatusUpdateData
-> Maybe Intents
-> Sem (SetupEff r) a
-> Sem r (Maybe StartupError)
runBotIO' Token
token Maybe Session
forall a. Maybe a
Nothing Maybe StatusUpdateData
forall a. Maybe a
Nothing Maybe Intents
forall a. Maybe a
Nothing Sem (SetupEff r) a
setup
resetDi :: BotC r => P.Sem r a -> P.Sem r a
resetDi :: Sem r a -> Sem r a
resetDi m :: Sem r a
m = do
Maybe (Di Level Path Message)
initialDi <- (Client -> Maybe (Di Level Path Message))
-> Sem r (Maybe (Di Level Path Message))
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting
(Maybe (Di Level Path Message))
Client
(Maybe (Di Level Path Message))
-> Maybe (Di Level Path Message)
forall s a. s -> Getting a s a -> a
^. IsLabel
"initialDi"
(Getting
(Maybe (Di Level Path Message))
Client
(Maybe (Di Level Path Message)))
Getting
(Maybe (Di Level Path Message))
Client
(Maybe (Di Level Path Message))
#initialDi)
(Di Level Path Message -> Di Level Path Message)
-> Sem r a -> Sem r a
forall level path msg (r :: [(* -> *) -> * -> *]) a.
MemberWithError (Di level path msg) r =>
(Di level path msg -> Di level path msg) -> Sem r a -> Sem r a
Di.local ((Di Level Path Message
-> Maybe (Di Level Path Message) -> Di Level Path Message)
-> Maybe (Di Level Path Message)
-> Di Level Path Message
-> Di Level Path Message
forall a b c. (a -> b -> c) -> b -> a -> c
flip Di Level Path Message
-> Maybe (Di Level Path Message) -> Di Level Path Message
forall a. a -> Maybe a -> a
fromMaybe Maybe (Di Level Path Message)
initialDi) Sem r a
m
runBotIO' :: forall r a.
(P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r))
=> Token
-> Maybe Session
-> Maybe StatusUpdateData
-> Maybe Intents
-> P.Sem (SetupEff r) a
-> P.Sem r (Maybe StartupError)
runBotIO' :: Token
-> Maybe Session
-> Maybe StatusUpdateData
-> Maybe Intents
-> Sem (SetupEff r) a
-> Sem r (Maybe StartupError)
runBotIO' token :: Token
token session :: Maybe Session
session status :: Maybe StatusUpdateData
status intents :: Maybe Intents
intents setup :: Sem (SetupEff r) a
setup = do
Maybe (Di Level Path Message)
initialDi <- Sem r (Maybe (Di Level Path Message))
forall level path msg (r :: [(* -> *) -> * -> *]).
MemberWithError (Di level path msg) r =>
Sem r (Maybe (Di level path msg))
Di.fetch
Session
session' <- Sem r Session
-> (Session -> Sem r Session) -> Maybe Session -> Sem r Session
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (IO Session -> Sem r Session
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed IO Session
newAPISession) Session -> Sem r Session
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Session
session
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 -> Session -> Maybe (Di Level Path Message) -> IO Client
newClient Token
token Session
session' Maybe (Di Level Path Message)
initialDi
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) (Maybe StartupError) -> Sem r (Maybe StartupError)
forall (r :: [(* -> *) -> * -> *]) a.
Member (Final IO) r =>
Sem (Async : r) a -> Sem r a
P.asyncToIOFinal (Sem (Async : r) (Maybe StartupError)
-> Sem r (Maybe StartupError))
-> (Sem (SetupEff r) (Maybe StartupError)
-> Sem (Async : r) (Maybe StartupError))
-> Sem (SetupEff r) (Maybe StartupError)
-> Sem r (Maybe StartupError)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar EventHandlers
-> Sem (AtomicState EventHandlers : Async : r) (Maybe StartupError)
-> Sem (Async : r) (Maybe StartupError)
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) (Maybe StartupError)
-> Sem (Async : r) (Maybe StartupError))
-> (Sem (SetupEff r) (Maybe StartupError)
-> Sem
(AtomicState EventHandlers : Async : r) (Maybe StartupError))
-> Sem (SetupEff r) (Maybe StartupError)
-> Sem (Async : r) (Maybe StartupError)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Client
-> Sem (SetupEff r) (Maybe StartupError)
-> Sem (AtomicState EventHandlers : Async : r) (Maybe StartupError)
forall i (r :: [(* -> *) -> * -> *]) a.
i -> Sem (Reader i : r) a -> Sem r a
P.runReader Client
client (Sem (SetupEff r) (Maybe StartupError)
-> Sem
(AtomicState EventHandlers : Async : r) (Maybe StartupError))
-> (Sem (SetupEff r) (Maybe StartupError)
-> Sem (SetupEff r) (Maybe StartupError))
-> Sem (SetupEff r) (Maybe StartupError)
-> Sem (AtomicState EventHandlers : Async : r) (Maybe StartupError)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Segment
-> Sem (SetupEff r) (Maybe StartupError)
-> Sem (SetupEff r) (Maybe StartupError)
forall level msg (r :: [(* -> *) -> * -> *]) a.
Member (Di level Path msg) r =>
Segment -> Sem r a -> Sem r a
Di.push "calamity" (Sem (SetupEff r) (Maybe StartupError)
-> Sem r (Maybe StartupError))
-> Sem (SetupEff r) (Maybe StartupError)
-> Sem r (Maybe StartupError)
forall a b. (a -> b) -> a -> b
$ do
Sem (SetupEff r) a -> Sem (SetupEff r) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem (SetupEff r) a -> Sem (SetupEff r) ())
-> Sem (SetupEff r) a -> Sem (SetupEff r) ()
forall a b. (a -> b) -> a -> b
$ Segment -> Sem (SetupEff r) a -> Sem (SetupEff r) a
forall level msg (r :: [(* -> *) -> * -> *]) a.
Member (Di level Path msg) r =>
Segment -> Sem r a -> Sem r a
Di.push "calamity-setup" Sem (SetupEff r) a
setup
Either StartupError ()
r <- Maybe StatusUpdateData
-> Maybe Intents -> Sem (SetupEff r) (Either StartupError ())
forall (r :: [(* -> *) -> * -> *]).
BotC r =>
Maybe StatusUpdateData
-> Maybe Intents -> Sem r (Either StartupError ())
shardBot Maybe StatusUpdateData
status Maybe Intents
intents
case Either StartupError ()
r of
Left e :: StartupError
e -> Maybe StartupError -> Sem (SetupEff r) (Maybe StartupError)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (StartupError -> Maybe StartupError
forall a. a -> Maybe a
Just StartupError
e)
Right _ -> do
Segment -> Sem (SetupEff r) () -> Sem (SetupEff r) ()
forall level msg (r :: [(* -> *) -> * -> *]) a.
Member (Di level Path msg) r =>
Segment -> Sem r a -> Sem r a
Di.push "calamity-loop" Sem (SetupEff r) ()
forall (r :: [(* -> *) -> * -> *]). BotC r => Sem r ()
clientLoop
Segment -> Sem (SetupEff r) () -> Sem (SetupEff r) ()
forall level msg (r :: [(* -> *) -> * -> *]) a.
Member (Di level Path msg) r =>
Segment -> Sem r a -> Sem r a
Di.push "calamity-stop" Sem (SetupEff r) ()
forall (r :: [(* -> *) -> * -> *]). BotC r => Sem r ()
finishUp
Maybe StartupError -> Sem (SetupEff r) (Maybe StartupError)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe StartupError
forall a. Maybe a
Nothing
react :: forall (s :: EventType) r.
(BotC r, ReactConstraints s)
=> (EHType s -> (P.Sem r) ())
-> P.Sem r (P.Sem r ())
react :: (EHType s -> Sem r ()) -> Sem r (Sem r ())
react handler :: EHType s -> Sem r ()
handler = do
EHType s -> IO (Maybe ())
handler' <- (EHType s -> Sem r ()) -> Sem r (EHType s -> IO (Maybe ()))
forall (r :: [(* -> *) -> * -> *]) p a.
Member (Final IO) r =>
(p -> Sem r a) -> Sem r (p -> IO (Maybe a))
bindSemToIO EHType s -> Sem r ()
handler
IORef Integer
ehidC <- (Client -> IORef Integer) -> Sem r (IORef Integer)
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting (IORef Integer) Client (IORef Integer) -> IORef Integer
forall s a. s -> Getting a s a -> a
^. IsLabel
"ehidCounter" (Getting (IORef Integer) Client (IORef Integer))
Getting (IORef Integer) Client (IORef Integer)
#ehidCounter)
Integer
id' <- IO Integer -> Sem r Integer
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO Integer -> Sem r Integer) -> IO Integer -> Sem r Integer
forall a b. (a -> b) -> a -> b
$ IORef Integer -> (Integer -> (Integer, Integer)) -> IO Integer
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef IORef Integer
ehidC (\i :: Integer
i -> (Integer
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 1, Integer
i))
let handlers :: EventHandlers
handlers = Proxy s -> Integer -> StoredEHType s -> EventHandlers
forall (a :: EventType).
InsertEventHandler a =>
Proxy a -> Integer -> StoredEHType a -> EventHandlers
makeEventHandlers (Proxy s
forall k (t :: k). Proxy t
Proxy @s) Integer
id' (() -> Maybe () -> ()
forall a b. a -> b -> a
const () (Maybe () -> ()) -> (EHType s -> IO (Maybe ())) -> StoredEHType s
forall (f :: * -> *) a b c.
Functor f =>
(a -> b) -> (c -> f a) -> c -> f b
<.> EHType s -> IO (Maybe ())
handler')
(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
<>)
Sem r () -> Sem r (Sem r ())
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Sem r () -> Sem r (Sem r ())) -> Sem r () -> Sem r (Sem r ())
forall a b. (a -> b) -> a -> b
$ Integer -> Sem r ()
forall (s :: EventType) (r :: [(* -> *) -> * -> *]).
(BotC r, RemoveEventHandler s) =>
Integer -> Sem r ()
removeHandler @s Integer
id'
removeHandler :: forall (s :: EventType) r. (BotC r, RemoveEventHandler s) => Integer -> P.Sem r ()
removeHandler :: Integer -> Sem r ()
removeHandler id' :: Integer
id' = (EventHandlers -> EventHandlers) -> Sem r ()
forall s (r :: [(* -> *) -> * -> *]).
Member (AtomicState s) r =>
(s -> s) -> Sem r ()
P.atomicModify (Proxy s -> Integer -> EventHandlers -> EventHandlers
forall k (a :: k).
RemoveEventHandler a =>
Proxy a -> Integer -> EventHandlers -> EventHandlers
removeEventHandler (Proxy s
forall k (t :: k). Proxy t
Proxy @s) Integer
id')
fire :: BotC r => CalamityEvent -> P.Sem r ()
fire :: CalamityEvent -> Sem r ()
fire e :: CalamityEvent
e = do
InChan CalamityEvent
inc <- (Client -> InChan CalamityEvent) -> Sem r (InChan CalamityEvent)
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting (InChan CalamityEvent) Client (InChan CalamityEvent)
-> InChan CalamityEvent
forall s a. s -> Getting a s a -> a
^. IsLabel
"eventsIn"
(Getting (InChan CalamityEvent) Client (InChan CalamityEvent))
Getting (InChan CalamityEvent) Client (InChan CalamityEvent)
#eventsIn)
IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ InChan CalamityEvent -> CalamityEvent -> IO ()
forall a. InChan a -> a -> IO ()
writeChan InChan CalamityEvent
inc CalamityEvent
e
customEvt :: forall s a. (Typeable s, Typeable a) => a -> CalamityEvent
customEvt :: a -> CalamityEvent
customEvt x :: a
x = TypeRep -> Dynamic -> CalamityEvent
Custom (Proxy s -> TypeRep
forall k (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy s -> TypeRep) -> Proxy s -> TypeRep
forall a b. (a -> b) -> a -> b
$ Proxy s
forall k (t :: k). Proxy t
Proxy @s) (a -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn a
x)
events :: BotC r => P.Sem r (OutChan CalamityEvent)
events :: Sem r (OutChan CalamityEvent)
events = do
InChan CalamityEvent
inc <- (Client -> InChan CalamityEvent) -> Sem r (InChan CalamityEvent)
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting (InChan CalamityEvent) Client (InChan CalamityEvent)
-> InChan CalamityEvent
forall s a. s -> Getting a s a -> a
^. IsLabel
"eventsIn"
(Getting (InChan CalamityEvent) Client (InChan CalamityEvent))
Getting (InChan CalamityEvent) Client (InChan CalamityEvent)
#eventsIn)
IO (OutChan CalamityEvent) -> Sem r (OutChan CalamityEvent)
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO (OutChan CalamityEvent) -> Sem r (OutChan CalamityEvent))
-> IO (OutChan CalamityEvent) -> Sem r (OutChan CalamityEvent)
forall a b. (a -> b) -> a -> b
$ InChan CalamityEvent -> IO (OutChan CalamityEvent)
forall a. InChan a -> IO (OutChan a)
dupChan InChan CalamityEvent
inc
waitUntil
:: forall (s :: EventType) r.
( BotC r, ReactConstraints s)
=> (EHType s -> Bool)
-> P.Sem r (EHType s)
waitUntil :: (EHType s -> Bool) -> Sem r (EHType s)
waitUntil f :: EHType s -> Bool
f = Sem (Resource : r) (EHType s) -> Sem r (EHType s)
forall (r :: [(* -> *) -> * -> *]) a.
Member (Final IO) r =>
Sem (Resource : r) a -> Sem r a
P.resourceToIOFinal (Sem (Resource : r) (EHType s) -> Sem r (EHType s))
-> Sem (Resource : r) (EHType s) -> Sem r (EHType s)
forall a b. (a -> b) -> a -> b
$ do
MVar (EHType s)
result <- IO (MVar (EHType s)) -> Sem (Resource : r) (MVar (EHType s))
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed IO (MVar (EHType s))
forall a. IO (MVar a)
newEmptyMVar
Sem (Resource : r) (Sem r ())
-> (Sem r () -> Sem (Resource : r) ())
-> (Sem r () -> Sem (Resource : r) (EHType s))
-> Sem (Resource : r) (EHType s)
forall (r :: [(* -> *) -> * -> *]) a c b.
MemberWithError Resource r =>
Sem r a -> (a -> Sem r c) -> (a -> Sem r b) -> Sem r b
P.bracket (Sem r (Sem r ()) -> Sem (Resource : r) (Sem r ())
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
P.raise (Sem r (Sem r ()) -> Sem (Resource : r) (Sem r ()))
-> Sem r (Sem r ()) -> Sem (Resource : r) (Sem r ())
forall a b. (a -> b) -> a -> b
$ (EHType s -> Sem r ()) -> Sem r (Sem r ())
forall (s :: EventType) (r :: [(* -> *) -> * -> *]).
(BotC r, ReactConstraints s) =>
(EHType s -> Sem r ()) -> Sem r (Sem r ())
react @s (MVar (EHType s) -> EHType s -> Sem r ()
checker MVar (EHType s)
result))
Sem r () -> Sem (Resource : r) ()
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
P.raise
(Sem (Resource : r) (EHType s)
-> Sem r () -> Sem (Resource : r) (EHType s)
forall a b. a -> b -> a
const (Sem (Resource : r) (EHType s)
-> Sem r () -> Sem (Resource : r) (EHType s))
-> (IO (EHType s) -> Sem (Resource : r) (EHType s))
-> IO (EHType s)
-> Sem r ()
-> Sem (Resource : r) (EHType s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (EHType s) -> Sem (Resource : r) (EHType s)
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO (EHType s) -> Sem r () -> Sem (Resource : r) (EHType s))
-> IO (EHType s) -> Sem r () -> Sem (Resource : r) (EHType s)
forall a b. (a -> b) -> a -> b
$ MVar (EHType s) -> IO (EHType s)
forall a. MVar a -> IO a
takeMVar MVar (EHType s)
result)
where
checker :: MVar (EHType s) -> EHType s -> P.Sem r ()
checker :: MVar (EHType s) -> EHType s -> Sem r ()
checker result :: MVar (EHType s)
result args :: EHType s
args = do
Bool -> Sem r () -> Sem r ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (EHType s -> Bool
f EHType s
args) (Sem r () -> Sem r ()) -> Sem r () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ do
IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ MVar (EHType s) -> EHType s -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (EHType s)
result EHType s
args
waitUntilM
:: forall (s :: EventType) r.
( BotC r, ReactConstraints s)
=> (EHType s -> P.Sem r Bool)
-> P.Sem r (EHType s)
waitUntilM :: (EHType s -> Sem r Bool) -> Sem r (EHType s)
waitUntilM f :: EHType s -> Sem r Bool
f = Sem (Resource : r) (EHType s) -> Sem r (EHType s)
forall (r :: [(* -> *) -> * -> *]) a.
Member (Final IO) r =>
Sem (Resource : r) a -> Sem r a
P.resourceToIOFinal (Sem (Resource : r) (EHType s) -> Sem r (EHType s))
-> Sem (Resource : r) (EHType s) -> Sem r (EHType s)
forall a b. (a -> b) -> a -> b
$ do
MVar (EHType s)
result <- IO (MVar (EHType s)) -> Sem (Resource : r) (MVar (EHType s))
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed IO (MVar (EHType s))
forall a. IO (MVar a)
newEmptyMVar
Sem (Resource : r) (Sem r ())
-> (Sem r () -> Sem (Resource : r) ())
-> (Sem r () -> Sem (Resource : r) (EHType s))
-> Sem (Resource : r) (EHType s)
forall (r :: [(* -> *) -> * -> *]) a c b.
MemberWithError Resource r =>
Sem r a -> (a -> Sem r c) -> (a -> Sem r b) -> Sem r b
P.bracket (Sem r (Sem r ()) -> Sem (Resource : r) (Sem r ())
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
P.raise (Sem r (Sem r ()) -> Sem (Resource : r) (Sem r ()))
-> Sem r (Sem r ()) -> Sem (Resource : r) (Sem r ())
forall a b. (a -> b) -> a -> b
$ (EHType s -> Sem r ()) -> Sem r (Sem r ())
forall (s :: EventType) (r :: [(* -> *) -> * -> *]).
(BotC r, ReactConstraints s) =>
(EHType s -> Sem r ()) -> Sem r (Sem r ())
react @s (MVar (EHType s) -> EHType s -> Sem r ()
checker MVar (EHType s)
result))
Sem r () -> Sem (Resource : r) ()
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
P.raise
(Sem (Resource : r) (EHType s)
-> Sem r () -> Sem (Resource : r) (EHType s)
forall a b. a -> b -> a
const (Sem (Resource : r) (EHType s)
-> Sem r () -> Sem (Resource : r) (EHType s))
-> (IO (EHType s) -> Sem (Resource : r) (EHType s))
-> IO (EHType s)
-> Sem r ()
-> Sem (Resource : r) (EHType s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (EHType s) -> Sem (Resource : r) (EHType s)
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO (EHType s) -> Sem r () -> Sem (Resource : r) (EHType s))
-> IO (EHType s) -> Sem r () -> Sem (Resource : r) (EHType s)
forall a b. (a -> b) -> a -> b
$ MVar (EHType s) -> IO (EHType s)
forall a. MVar a -> IO a
takeMVar MVar (EHType s)
result)
where
checker :: MVar (EHType s) -> EHType s -> P.Sem r ()
checker :: MVar (EHType s) -> EHType s -> Sem r ()
checker result :: MVar (EHType s)
result args :: EHType s
args = do
Bool
res <- EHType s -> Sem r Bool
f EHType s
args
Bool -> Sem r () -> Sem r ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
res (Sem r () -> Sem r ()) -> Sem r () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ do
IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ MVar (EHType s) -> EHType s -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (EHType s)
result EHType s
args
sendPresence :: BotC r => StatusUpdateData -> P.Sem r ()
sendPresence :: StatusUpdateData -> Sem r ()
sendPresence s :: StatusUpdateData
s = do
[(InChan ControlMessage, Async (Maybe ()))]
shards <- (Client -> TVar [(InChan ControlMessage, Async (Maybe ()))])
-> Sem r (TVar [(InChan ControlMessage, Async (Maybe ()))])
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting
(TVar [(InChan ControlMessage, Async (Maybe ()))])
Client
(TVar [(InChan ControlMessage, Async (Maybe ()))])
-> TVar [(InChan ControlMessage, Async (Maybe ()))]
forall s a. s -> Getting a s a -> a
^. IsLabel
"shards"
(Getting
(TVar [(InChan ControlMessage, Async (Maybe ()))])
Client
(TVar [(InChan ControlMessage, Async (Maybe ()))]))
Getting
(TVar [(InChan ControlMessage, Async (Maybe ()))])
Client
(TVar [(InChan ControlMessage, Async (Maybe ()))])
#shards) Sem r (TVar [(InChan ControlMessage, Async (Maybe ()))])
-> (TVar [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))])
-> Sem r [(InChan ControlMessage, Async (Maybe ()))]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))]
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))])
-> (TVar [(InChan ControlMessage, Async (Maybe ()))]
-> IO [(InChan ControlMessage, Async (Maybe ()))])
-> TVar [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar [(InChan ControlMessage, Async (Maybe ()))]
-> IO [(InChan ControlMessage, Async (Maybe ()))]
forall a. TVar a -> IO a
readTVarIO
[(InChan ControlMessage, Async (Maybe ()))]
-> ((InChan ControlMessage, Async (Maybe ())) -> Sem r ())
-> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [(InChan ControlMessage, Async (Maybe ()))]
shards (((InChan ControlMessage, Async (Maybe ())) -> Sem r ())
-> Sem r ())
-> ((InChan ControlMessage, Async (Maybe ())) -> Sem r ())
-> Sem r ()
forall a b. (a -> b) -> a -> b
$ \(inc :: InChan ControlMessage
inc, _) ->
IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ InChan ControlMessage -> ControlMessage -> IO ()
forall a. InChan a -> a -> IO ()
writeChan InChan ControlMessage
inc (StatusUpdateData -> ControlMessage
SendPresence StatusUpdateData
s)
stopBot :: BotC r => P.Sem r ()
stopBot :: Sem r ()
stopBot = do
Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member LogEff r =>
Text -> Sem r ()
debug "stopping bot"
InChan CalamityEvent
inc <- (Client -> InChan CalamityEvent) -> Sem r (InChan CalamityEvent)
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting (InChan CalamityEvent) Client (InChan CalamityEvent)
-> InChan CalamityEvent
forall s a. s -> Getting a s a -> a
^. IsLabel
"eventsIn"
(Getting (InChan CalamityEvent) Client (InChan CalamityEvent))
Getting (InChan CalamityEvent) Client (InChan CalamityEvent)
#eventsIn)
IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ InChan CalamityEvent -> CalamityEvent -> IO ()
forall a. InChan a -> a -> IO ()
writeChan InChan CalamityEvent
inc CalamityEvent
ShutDown
finishUp :: BotC r => P.Sem r ()
finishUp :: Sem r ()
finishUp = do
Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member LogEff r =>
Text -> Sem r ()
debug "finishing up"
[(InChan ControlMessage, Async (Maybe ()))]
shards <- (Client -> TVar [(InChan ControlMessage, Async (Maybe ()))])
-> Sem r (TVar [(InChan ControlMessage, Async (Maybe ()))])
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting
(TVar [(InChan ControlMessage, Async (Maybe ()))])
Client
(TVar [(InChan ControlMessage, Async (Maybe ()))])
-> TVar [(InChan ControlMessage, Async (Maybe ()))]
forall s a. s -> Getting a s a -> a
^. IsLabel
"shards"
(Getting
(TVar [(InChan ControlMessage, Async (Maybe ()))])
Client
(TVar [(InChan ControlMessage, Async (Maybe ()))]))
Getting
(TVar [(InChan ControlMessage, Async (Maybe ()))])
Client
(TVar [(InChan ControlMessage, Async (Maybe ()))])
#shards) Sem r (TVar [(InChan ControlMessage, Async (Maybe ()))])
-> (TVar [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))])
-> Sem r [(InChan ControlMessage, Async (Maybe ()))]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))]
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))])
-> (TVar [(InChan ControlMessage, Async (Maybe ()))]
-> IO [(InChan ControlMessage, Async (Maybe ()))])
-> TVar [(InChan ControlMessage, Async (Maybe ()))]
-> Sem r [(InChan ControlMessage, Async (Maybe ()))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar [(InChan ControlMessage, Async (Maybe ()))]
-> IO [(InChan ControlMessage, Async (Maybe ()))]
forall a. TVar a -> IO a
readTVarIO
[(InChan ControlMessage, Async (Maybe ()))]
-> ((InChan ControlMessage, Async (Maybe ())) -> Sem r ())
-> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [(InChan ControlMessage, Async (Maybe ()))]
shards (((InChan ControlMessage, Async (Maybe ())) -> Sem r ())
-> Sem r ())
-> ((InChan ControlMessage, Async (Maybe ())) -> Sem r ())
-> Sem r ()
forall a b. (a -> b) -> a -> b
$ \(inc :: InChan ControlMessage
inc, _) ->
IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r ()) -> IO () -> Sem r ()
forall a b. (a -> b) -> a -> b
$ InChan ControlMessage -> ControlMessage -> IO ()
forall a. InChan a -> a -> IO ()
writeChan InChan ControlMessage
inc ControlMessage
ShutDownShard
[(InChan ControlMessage, Async (Maybe ()))]
-> ((InChan ControlMessage, Async (Maybe ())) -> Sem r (Maybe ()))
-> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [(InChan ControlMessage, Async (Maybe ()))]
shards (((InChan ControlMessage, Async (Maybe ())) -> Sem r (Maybe ()))
-> Sem r ())
-> ((InChan ControlMessage, Async (Maybe ())) -> Sem r (Maybe ()))
-> Sem r ()
forall a b. (a -> b) -> a -> b
$ \(_, shardThread :: Async (Maybe ())
shardThread) -> Async (Maybe ()) -> Sem r (Maybe ())
forall (r :: [(* -> *) -> * -> *]) a.
MemberWithError Async r =>
Async a -> Sem r a
P.await Async (Maybe ())
shardThread
Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member LogEff r =>
Text -> Sem r ()
debug "bot has stopped"
clientLoop :: BotC r => P.Sem r ()
clientLoop :: Sem r ()
clientLoop = do
OutChan CalamityEvent
outc <- (Client -> OutChan CalamityEvent) -> Sem r (OutChan CalamityEvent)
forall i j (r :: [(* -> *) -> * -> *]).
Member (Reader i) r =>
(i -> j) -> Sem r j
P.asks (Client
-> Getting (OutChan CalamityEvent) Client (OutChan CalamityEvent)
-> OutChan CalamityEvent
forall s a. s -> Getting a s a -> a
^. IsLabel
"eventsOut"
(Getting (OutChan CalamityEvent) Client (OutChan CalamityEvent))
Getting (OutChan CalamityEvent) Client (OutChan CalamityEvent)
#eventsOut)
Sem r Bool -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member (Final IO) r =>
Sem r Bool -> Sem r ()
whileMFinalIO (Sem r Bool -> Sem r ()) -> Sem r Bool -> Sem r ()
forall a b. (a -> b) -> a -> b
$ do
CalamityEvent
evt' <- IO CalamityEvent -> Sem r CalamityEvent
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO CalamityEvent -> Sem r CalamityEvent)
-> IO CalamityEvent -> Sem r CalamityEvent
forall a b. (a -> b) -> a -> b
$ OutChan CalamityEvent -> IO CalamityEvent
forall a. OutChan a -> IO a
readChan OutChan CalamityEvent
outc
case CalamityEvent
evt' of
Dispatch sid :: Int
sid evt :: DispatchData
evt -> Int -> DispatchData -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
BotC r =>
Int -> DispatchData -> Sem r ()
handleEvent Int
sid DispatchData
evt Sem r () -> Sem r Bool -> Sem r Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> Sem r Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
Custom s :: TypeRep
s d :: Dynamic
d -> TypeRep -> Dynamic -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
BotC r =>
TypeRep -> Dynamic -> Sem r ()
handleCustomEvent TypeRep
s Dynamic
d Sem r () -> Sem r Bool -> Sem r Bool
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> Sem r Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
ShutDown -> Bool -> Sem r Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member LogEff r =>
Text -> Sem r ()
debug "leaving client loop"
handleCustomEvent :: forall r. BotC r => TypeRep -> Dynamic -> P.Sem r ()
handleCustomEvent :: TypeRep -> Dynamic -> Sem r ()
handleCustomEvent s :: TypeRep
s d :: Dynamic
d = do
Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member LogEff r =>
Text -> Sem r ()
debug (Text -> Sem r ()) -> Text -> Sem r ()
forall a b. (a -> b) -> a -> b
$ "handling a custom event, s: " Builder -> Builder -> Text
forall b. FromBuilder b => Builder -> Builder -> b
+|| TypeRep
s TypeRep -> Builder -> Builder
forall a b. (Show a, FromBuilder b) => a -> Builder -> b
||+ ", d: " Builder -> Builder -> Builder
forall b. FromBuilder b => Builder -> Builder -> b
+|| Dynamic
d Dynamic -> Builder -> Builder
forall a b. (Show a, FromBuilder b) => a -> Builder -> b
||+ ""
EventHandlers
eventHandlers <- Sem r EventHandlers
forall s (r :: [(* -> *) -> * -> *]).
Member (AtomicState s) r =>
Sem r s
P.atomicGet
let handlers :: [Dynamic -> IO ()]
handlers = TypeRep -> TypeRep -> EventHandlers -> [Dynamic -> IO ()]
getCustomEventHandlers TypeRep
s (Dynamic -> TypeRep
dynTypeRep Dynamic
d) EventHandlers
eventHandlers
[Dynamic -> IO ()]
-> ((Dynamic -> IO ()) -> Sem r (Async (Maybe ()))) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Dynamic -> IO ()]
handlers (\h :: Dynamic -> IO ()
h -> 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 ())))
-> (IO () -> Sem r ()) -> IO () -> Sem r (Async (Maybe ()))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed (IO () -> Sem r (Async (Maybe ())))
-> IO () -> Sem r (Async (Maybe ()))
forall a b. (a -> b) -> a -> b
$ Dynamic -> IO ()
h Dynamic
d)
catchAllLogging :: BotC r => P.Sem r () -> P.Sem r ()
catchAllLogging :: Sem r () -> Sem r ()
catchAllLogging m :: Sem r ()
m = do
Either SomeException ()
r <- Sem (Error SomeException : r) () -> Sem r (Either SomeException ())
forall e (r :: [(* -> *) -> * -> *]) a.
(Typeable e, Member (Final IO) r) =>
Sem (Error e : r) a -> Sem r (Either e a)
P.errorToIOFinal (Sem (Error SomeException : r) ()
-> Sem r (Either SomeException ()))
-> (Sem (Error SomeException : r) ()
-> Sem (Error SomeException : r) ())
-> Sem (Error SomeException : r) ()
-> Sem r (Either SomeException ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: [(* -> *) -> * -> *]) a.
(Exception SomeException, Member (Error SomeException) r,
Member (Final IO) r) =>
Sem r a -> Sem r a
forall e (r :: [(* -> *) -> * -> *]) a.
(Exception e, Member (Error e) r, Member (Final IO) r) =>
Sem r a -> Sem r a
P.fromExceptionSem @SomeException (Sem (Error SomeException : r) ()
-> Sem r (Either SomeException ()))
-> Sem (Error SomeException : r) ()
-> Sem r (Either SomeException ())
forall a b. (a -> b) -> a -> b
$ Sem r () -> Sem (Error SomeException : r) ()
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Sem r a -> Sem (e : r) a
P.raise Sem r ()
m
case Either SomeException ()
r of
Right _ -> () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
Left e :: SomeException
e -> Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member LogEff r =>
Text -> Sem r ()
debug (Text -> Sem r ()) -> Text -> Sem r ()
forall a b. (a -> b) -> a -> b
$ "got exception: " Builder -> Builder -> Text
forall b. FromBuilder b => Builder -> Builder -> b
+|| SomeException
e SomeException -> Builder -> Builder
forall a b. (Show a, FromBuilder b) => a -> Builder -> b
||+ ""
handleEvent :: BotC r => Int -> DispatchData -> P.Sem r ()
handleEvent :: Int -> DispatchData -> Sem r ()
handleEvent shardID :: Int
shardID data' :: DispatchData
data' = do
Text -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member LogEff 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 [IO ()]
actions <- Sem (Fail : r) [IO ()] -> Sem r (Either String [IO ()])
forall (r :: [(* -> *) -> * -> *]) a.
Sem (Fail : r) a -> Sem r (Either String a)
P.runFail (Sem (Fail : r) [IO ()] -> Sem r (Either String [IO ()]))
-> Sem (Fail : r) [IO ()] -> Sem r (Either String [IO ()])
forall a b. (a -> b) -> a -> b
$ do
Counter
evtCounter <- Text -> [(Text, Text)] -> Sem (Fail : r) Counter
forall (r :: [(* -> *) -> * -> *]).
MemberWithError MetricEff r =>
Text -> [(Text, Text)] -> Sem r Counter
registerCounter "events_received" [("type", String -> Text
S.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ DispatchData -> String
forall a. CtorName a => a -> String
ctorName DispatchData
data'), ("shard", Int -> Text
forall a. TextShow a => a -> Text
showt Int
shardID)]
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
evtCounter
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 :: [IO ()]
res) <- Sem (Fail : r) [IO ()] -> Sem (Fail : r) (Double, [IO ()])
forall (r :: [(* -> *) -> * -> *]) a.
Member (Embed IO) r =>
Sem r a -> Sem r (Double, a)
timeA (Sem (Fail : r) [IO ()] -> Sem (Fail : r) (Double, [IO ()]))
-> Sem (Fail : r) [IO ()] -> Sem (Fail : r) (Double, [IO ()])
forall a b. (a -> b) -> a -> b
$ Sem (Fail : r) [IO ()] -> Sem (Fail : r) [IO ()]
forall (r :: [(* -> *) -> * -> *]) a. BotC r => Sem r a -> Sem r a
resetDi (Sem (Fail : r) [IO ()] -> Sem (Fail : r) [IO ()])
-> Sem (Fail : r) [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ EventHandlers -> DispatchData -> Sem (Fail : r) [IO ()]
forall (r :: [(* -> *) -> * -> *]).
BotC r =>
EventHandlers -> DispatchData -> Sem (Fail : r) [IO ()]
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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [IO ()]
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 [IO ()]
actions of
Right actions :: [IO ()]
actions -> [IO ()] -> (IO () -> Sem r (Async (Maybe ()))) -> Sem r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [IO ()]
actions ((IO () -> Sem r (Async (Maybe ()))) -> Sem r ())
-> (IO () -> Sem r (Async (Maybe ()))) -> Sem r ()
forall a b. (a -> b) -> a -> b
$ \action :: IO ()
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 () -> Sem r (Double, ()))
-> (Sem r () -> Sem r ()) -> Sem r () -> Sem r (Double, ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem r () -> Sem r ()
forall (r :: [(* -> *) -> * -> *]). BotC r => Sem r () -> Sem r ()
catchAllLogging (Sem r () -> Sem r (Double, ())) -> Sem r () -> Sem r (Double, ())
forall a b. (a -> b) -> a -> b
$ IO () -> Sem r ()
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
P.embed IO ()
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 LogEff 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
|+ ""
handleEvent' :: BotC r
=> EventHandlers
-> DispatchData
-> P.Sem (P.Fail ': r) [IO ()]
handleEvent' :: EventHandlers -> DispatchData -> Sem (Fail : r) [IO ()]
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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((ReadyData -> IO ()) -> IO ()) -> [ReadyData -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((ReadyData -> IO ()) -> ReadyData -> IO ()
forall a b. (a -> b) -> a -> b
$ ReadyData
rd) (EventHandlers -> [StoredEHType 'ReadyEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'ReadyEvt EventHandlers
eh)
handleEvent' _ Resumed = [IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
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 b a. HasID b a => a -> Snowflake b
getID DMChannel
chan)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> IO ()) -> IO ()) -> [Channel -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Channel -> IO ()) -> Channel -> IO ()
forall a b. (a -> b) -> a -> b
$ Channel
newChan) (EventHandlers -> [StoredEHType 'ChannelCreateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'ChannelCreateEvt 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 b 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 b a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> IO ()) -> IO ()) -> [Channel -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Channel -> IO ()) -> Channel -> IO ()
forall a b. (a -> b) -> a -> b
$ Channel
newChan) (EventHandlers -> [StoredEHType 'ChannelCreateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'ChannelCreateEvt 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 b 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 b a. HasID b a => a -> Snowflake b
getID DMChannel
chan)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Channel, Channel) -> IO ()) -> IO ())
-> [(Channel, Channel) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Channel, Channel) -> IO ()) -> (Channel, Channel) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Channel
oldChan, Channel
newChan)) (EventHandlers -> [StoredEHType 'ChannelUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'ChannelUpdateEvt 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 b 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 b 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 b 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 b a. HasID b a => a -> Snowflake b
getID GuildChannel
chan)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Channel, Channel) -> IO ()) -> IO ())
-> [(Channel, Channel) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Channel, Channel) -> IO ()) -> (Channel, Channel) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Channel
oldChan, Channel
newChan)) (EventHandlers -> [StoredEHType 'ChannelUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'ChannelUpdateEvt 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 b 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 b 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> IO ()) -> IO ()) -> [Channel -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Channel -> IO ()) -> Channel -> IO ()
forall a b. (a -> b) -> a -> b
$ Channel
oldChan) (EventHandlers -> [StoredEHType 'ChannelDeleteEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'ChannelDeleteEvt 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 b 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Channel -> IO ()) -> IO ()) -> [Channel -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Channel -> IO ()) -> Channel -> IO ()
forall a b. (a -> b) -> a -> b
$ Channel
oldChan) (EventHandlers -> [StoredEHType 'ChannelDeleteEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'ChannelDeleteEvt EventHandlers
eh)
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(GuildCreate guild :: Guild
guild) = do
Bool
isNew <- Bool -> Bool
not (Bool -> Bool) -> Sem (Fail : r) Bool -> Sem (Fail : r) Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Snowflake Guild -> Sem (Fail : r) Bool
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r Bool
isUnavailableGuild (Guild -> Snowflake Guild
forall b 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 b a. HasID b a => a -> Snowflake b
getID Guild
guild)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, GuildCreateStatus) -> IO ()) -> IO ())
-> [(Guild, GuildCreateStatus) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, GuildCreateStatus) -> IO ())
-> (Guild, GuildCreateStatus) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
guild, (if Bool
isNew then GuildCreateStatus
GuildCreateNew else GuildCreateStatus
GuildCreateAvailable)))
(EventHandlers -> [StoredEHType 'GuildCreateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildCreateEvt 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 b 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 b a. HasID b a => a -> Snowflake b
getID UpdatedGuild
guild)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, Guild) -> IO ()) -> IO ())
-> [(Guild, Guild) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, Guild) -> IO ()) -> (Guild, Guild) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
oldGuild, Guild
newGuild)) (EventHandlers -> [StoredEHType 'GuildUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildUpdateEvt EventHandlers
eh)
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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, GuildDeleteStatus) -> IO ()) -> IO ())
-> [(Guild, GuildDeleteStatus) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, GuildDeleteStatus) -> IO ())
-> (Guild, GuildDeleteStatus) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
oldGuild, (if Bool
unavailable then GuildDeleteStatus
GuildDeleteUnavailable else GuildDeleteStatus
GuildDeleteRemoved)))
(EventHandlers -> [StoredEHType 'GuildDeleteEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildDeleteEvt 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, User) -> IO ()) -> IO ())
-> [(Guild, User) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, User) -> IO ()) -> (Guild, User) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
guild, User
user)) (EventHandlers -> [StoredEHType 'GuildBanAddEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildBanAddEvt 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, User) -> IO ()) -> IO ())
-> [(Guild, User) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, User) -> IO ()) -> (Guild, User) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
guild, User
user)) (EventHandlers -> [StoredEHType 'GuildBanRemoveEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildBanRemoveEvt EventHandlers
eh)
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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, [Emoji]) -> IO ()) -> IO ())
-> [(Guild, [Emoji]) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, [Emoji]) -> IO ()) -> (Guild, [Emoji]) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
guild, [Emoji]
emojis)) (EventHandlers -> [StoredEHType 'GuildEmojisUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildEmojisUpdateEvt 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Guild -> IO ()) -> IO ()) -> [Guild -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Guild -> IO ()) -> Guild -> IO ()
forall a b. (a -> b) -> a -> b
$ Guild
guild) (EventHandlers -> [StoredEHType 'GuildIntegrationsUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildIntegrationsUpdateEvt 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 b 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 b a. HasID b a => a -> Snowflake b
getID Member
member)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Member -> IO ()) -> IO ()) -> [Member -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Member -> IO ()) -> Member -> IO ()
forall a b. (a -> b) -> a -> b
$ Member
member) (EventHandlers -> [StoredEHType 'GuildMemberAddEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildMemberAddEvt 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 b 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Member -> IO ()) -> IO ()) -> [Member -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Member -> IO ()) -> Member -> IO ()
forall a b. (a -> b) -> a -> b
$ Member
member) (EventHandlers -> [StoredEHType 'GuildMemberRemoveEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildMemberRemoveEvt 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 b 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 b a. HasID b a => a -> Snowflake b
getID User
user)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Member, Member) -> IO ()) -> IO ())
-> [(Member, Member) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Member, Member) -> IO ()) -> (Member, Member) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Member
oldMember, Member
newMember)) (EventHandlers -> [StoredEHType 'GuildMemberUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildMemberUpdateEvt 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 b 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, [Member]) -> IO ()) -> IO ())
-> [(Guild, [Member]) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, [Member]) -> IO ()) -> (Guild, [Member]) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
guild, [Member]
members')) (EventHandlers -> [StoredEHType 'GuildMembersChunkEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildMembersChunkEvt 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 b a. HasID b a => a -> Snowflake b
getID Role
role)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, Role) -> IO ()) -> IO ())
-> [(Guild, Role) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, Role) -> IO ()) -> (Guild, Role) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
guild, Role
role')) (EventHandlers -> [StoredEHType 'GuildRoleCreateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildRoleCreateEvt 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 b 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 b a. HasID b a => a -> Snowflake b
getID Role
role)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, Role, Role) -> IO ()) -> IO ())
-> [(Guild, Role, Role) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, Role, Role) -> IO ()) -> (Guild, Role, Role) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
newGuild, Role
oldRole, Role
newRole)) (EventHandlers -> [StoredEHType 'GuildRoleUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildRoleUpdateEvt 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Guild, Role) -> IO ()) -> IO ())
-> [(Guild, Role) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Guild, Role) -> IO ()) -> (Guild, Role) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Guild
guild, Role
role)) (EventHandlers -> [StoredEHType 'GuildRoleDeleteEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildRoleDeleteEvt EventHandlers
eh)
handleEvent' eh :: EventHandlers
eh (InviteCreate d :: InviteCreateData
d) = do
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((InviteCreateData -> IO ()) -> IO ())
-> [InviteCreateData -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((InviteCreateData -> IO ()) -> InviteCreateData -> IO ()
forall a b. (a -> b) -> a -> b
$ InviteCreateData
d) (EventHandlers -> [StoredEHType 'InviteCreateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'InviteCreateEvt EventHandlers
eh)
handleEvent' eh :: EventHandlers
eh (InviteDelete d :: InviteDeleteData
d) = do
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((InviteDeleteData -> IO ()) -> IO ())
-> [InviteDeleteData -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((InviteDeleteData -> IO ()) -> InviteDeleteData -> IO ()
forall a b. (a -> b) -> a -> b
$ InviteDeleteData
d) (EventHandlers -> [StoredEHType 'InviteDeleteEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'InviteDeleteEvt EventHandlers
eh)
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageCreate msg :: Message
msg) = do
DispatchData -> Sem (Fail : r) ()
forall (r :: [(* -> *) -> * -> *]).
Members '[CacheEff, Fail] r =>
DispatchData -> Sem r ()
updateCache DispatchData
evt
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ ((Message -> IO ()) -> IO ()) -> [Message -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Message -> IO ()) -> Message -> IO ()
forall a b. (a -> b) -> a -> b
$ Message
msg) (EventHandlers -> [StoredEHType 'MessageCreateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'MessageCreateEvt EventHandlers
eh)
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageUpdate msg :: UpdatedMessage
msg) = do
Maybe 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 b 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
Maybe 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 b a. HasID b a => a -> Snowflake b
getID UpdatedMessage
msg)
let rawActions :: [IO ()]
rawActions = ((UpdatedMessage -> IO ()) -> IO ())
-> [UpdatedMessage -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((UpdatedMessage -> IO ()) -> UpdatedMessage -> IO ()
forall a b. (a -> b) -> a -> b
$ UpdatedMessage
msg) (EventHandlers -> [StoredEHType 'RawMessageUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'RawMessageUpdateEvt EventHandlers
eh)
let actions :: [IO ()]
actions = case (Maybe Message
oldMsg, Maybe Message
newMsg) of
(Just oldMsg' :: Message
oldMsg', Just newMsg' :: Message
newMsg') ->
(((Message, Message) -> IO ()) -> IO ())
-> [(Message, Message) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Message, Message) -> IO ()) -> (Message, Message) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Message
oldMsg', Message
newMsg')) (EventHandlers -> [StoredEHType 'MessageUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'MessageUpdateEvt EventHandlers
eh)
_ -> []
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ [IO ()]
rawActions [IO ()] -> [IO ()] -> [IO ()]
forall a. Semigroup a => a -> a -> a
<> [IO ()]
actions
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageDelete MessageDeleteData { Snowflake Message
$sel:id:MessageDeleteData :: MessageDeleteData -> Snowflake Message
id :: Snowflake Message
id }) = do
Maybe 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
let rawActions :: [IO ()]
rawActions = ((Snowflake Message -> IO ()) -> IO ())
-> [Snowflake Message -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Snowflake Message -> IO ()) -> Snowflake Message -> IO ()
forall a b. (a -> b) -> a -> b
$ Snowflake Message
id) (EventHandlers -> [StoredEHType 'RawMessageDeleteEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'RawMessageDeleteEvt EventHandlers
eh)
let actions :: [IO ()]
actions = case Maybe Message
oldMsg of
Just oldMsg' :: Message
oldMsg' ->
((Message -> IO ()) -> IO ()) -> [Message -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Message -> IO ()) -> Message -> IO ()
forall a b. (a -> b) -> a -> b
$ Message
oldMsg') (EventHandlers -> [StoredEHType 'MessageDeleteEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'MessageDeleteEvt EventHandlers
eh)
_ -> []
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ [IO ()]
rawActions [IO ()] -> [IO ()] -> [IO ()]
forall a. Semigroup a => a -> a -> a
<> [IO ()]
actions
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 :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse 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
let rawActions :: [IO ()]
rawActions = (([Snowflake Message] -> IO ()) -> IO ())
-> [[Snowflake Message] -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (([Snowflake Message] -> IO ()) -> [Snowflake Message] -> IO ()
forall a b. (a -> b) -> a -> b
$ [Snowflake Message]
ids) (EventHandlers -> [StoredEHType 'RawMessageDeleteBulkEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'RawMessageDeleteBulkEvt EventHandlers
eh)
let actions :: [IO ()]
actions = (([Message] -> IO ()) -> IO ()) -> [[Message] -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (([Message] -> IO ()) -> [Message] -> IO ()
forall a b. (a -> b) -> a -> b
$ [Message]
messages) (EventHandlers -> [StoredEHType 'MessageDeleteBulkEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'MessageDeleteBulkEvt EventHandlers
eh)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ [IO ()]
rawActions [IO ()] -> [IO ()] -> [IO ()]
forall a. Semigroup a => a -> a -> a
<> [IO ()]
actions
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
Maybe 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 b a. HasID b a => a -> Snowflake b
getID Reaction
reaction)
let rawActions :: [IO ()]
rawActions = ((Reaction -> IO ()) -> IO ()) -> [Reaction -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Reaction -> IO ()) -> Reaction -> IO ()
forall a b. (a -> b) -> a -> b
$ Reaction
reaction) (EventHandlers -> [StoredEHType 'RawMessageReactionAddEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'RawMessageReactionAddEvt EventHandlers
eh)
let actions :: [IO ()]
actions = case Maybe Message
msg of
Just msg' :: Message
msg' ->
(((Message, Reaction) -> IO ()) -> IO ())
-> [(Message, Reaction) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Message, Reaction) -> IO ()) -> (Message, Reaction) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Message
msg', Reaction
reaction)) (EventHandlers -> [StoredEHType 'MessageReactionAddEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'MessageReactionAddEvt EventHandlers
eh)
_ -> []
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ [IO ()]
rawActions [IO ()] -> [IO ()] -> [IO ()]
forall a. Semigroup a => a -> a -> a
<> [IO ()]
actions
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageReactionRemove reaction :: Reaction
reaction) = do
Maybe 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 b 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
let rawActions :: [IO ()]
rawActions = ((Reaction -> IO ()) -> IO ()) -> [Reaction -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Reaction -> IO ()) -> Reaction -> IO ()
forall a b. (a -> b) -> a -> b
$ Reaction
reaction) (EventHandlers -> [StoredEHType 'RawMessageReactionRemoveEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'RawMessageReactionRemoveEvt EventHandlers
eh)
let actions :: [IO ()]
actions = case Maybe Message
msg of
Just msg' :: Message
msg' ->
(((Message, Reaction) -> IO ()) -> IO ())
-> [(Message, Reaction) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Message, Reaction) -> IO ()) -> (Message, Reaction) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Message
msg', Reaction
reaction)) (EventHandlers -> [StoredEHType 'MessageReactionRemoveEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'MessageReactionRemoveEvt EventHandlers
eh)
_ -> []
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ [IO ()]
rawActions [IO ()] -> [IO ()] -> [IO ()]
forall a. Semigroup a => a -> a -> a
<> [IO ()]
actions
handleEvent' eh :: EventHandlers
eh evt :: DispatchData
evt@(MessageReactionRemoveAll MessageReactionRemoveAllData { Snowflake Message
$sel:messageID:MessageReactionRemoveAllData :: MessageReactionRemoveAllData -> Snowflake Message
messageID :: Snowflake Message
messageID }) = do
Maybe 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
let rawActions :: [IO ()]
rawActions = ((Snowflake Message -> IO ()) -> IO ())
-> [Snowflake Message -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Snowflake Message -> IO ()) -> Snowflake Message -> IO ()
forall a b. (a -> b) -> a -> b
$ Snowflake Message
messageID) (EventHandlers -> [StoredEHType 'RawMessageReactionRemoveAllEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'RawMessageReactionRemoveAllEvt EventHandlers
eh)
let actions :: [IO ()]
actions = case Maybe Message
msg of
Just msg' :: Message
msg' ->
((Message -> IO ()) -> IO ()) -> [Message -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map ((Message -> IO ()) -> Message -> IO ()
forall a b. (a -> b) -> a -> b
$ Message
msg') (EventHandlers -> [StoredEHType 'MessageReactionRemoveAllEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'MessageReactionRemoveAllEvt EventHandlers
eh)
_ -> []
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ [IO ()]
rawActions [IO ()] -> [IO ()] -> [IO ()]
forall a. Semigroup a => a -> a -> a
<> [IO ()]
actions
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 a b. 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 a b. Snowflake a -> Snowflake b
coerceSnowflake Snowflake User
userID)
let User
oldUser :: User = Member -> User
forall sup sub. Subtype sup sub => sub -> sup
upcast Member
oldMember
User
newUser :: User = Member -> User
forall sup sub. Subtype sup sub => sub -> sup
upcast Member
newMember
userUpdates :: [IO ()]
userUpdates = if User
oldUser User -> User -> Bool
forall a. Eq a => a -> a -> Bool
/= User
newUser
then (((User, User) -> IO ()) -> IO ())
-> [(User, User) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((User, User) -> IO ()) -> (User, User) -> IO ()
forall a b. (a -> b) -> a -> b
$ (User
oldUser, User
newUser)) (EventHandlers -> [StoredEHType 'UserUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'UserUpdateEvt EventHandlers
eh)
else [IO ()]
forall a. Monoid a => a
mempty
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ [IO ()]
userUpdates [IO ()] -> [IO ()] -> [IO ()]
forall a. Semigroup a => a -> a -> a
<> (((Member, Member) -> IO ()) -> IO ())
-> [(Member, Member) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Member, Member) -> IO ()) -> (Member, Member) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Member
oldMember, Member
newMember)) (EventHandlers -> [StoredEHType 'GuildMemberUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'GuildMemberUpdateEvt 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 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 a b. Snowflake a -> Snowflake b
coerceSnowflake Snowflake Channel
channelID)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Channel, Snowflake User, UnixTimestamp) -> IO ()) -> IO ())
-> [(Channel, Snowflake User, UnixTimestamp) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Channel, Snowflake User, UnixTimestamp) -> IO ())
-> (Channel, Snowflake User, UnixTimestamp) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Channel
chan, Snowflake User
userID, UnixTimestamp
timestamp)) (EventHandlers -> [StoredEHType 'TypingStartEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'TypingStartEvt 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 a b. Snowflake a -> Snowflake b
coerceSnowflake Snowflake Channel
channelID)
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((Channel, Snowflake User, UnixTimestamp) -> IO ()) -> IO ())
-> [(Channel, Snowflake User, UnixTimestamp) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((Channel, Snowflake User, UnixTimestamp) -> IO ())
-> (Channel, Snowflake User, UnixTimestamp) -> IO ()
forall a b. (a -> b) -> a -> b
$ (Channel
chan, Snowflake User
userID, UnixTimestamp
timestamp)) (EventHandlers -> [StoredEHType 'TypingStartEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'TypingStartEvt 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
[IO ()] -> Sem (Fail : r) [IO ()]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([IO ()] -> Sem (Fail : r) [IO ()])
-> [IO ()] -> Sem (Fail : r) [IO ()]
forall a b. (a -> b) -> a -> b
$ (((User, User) -> IO ()) -> IO ())
-> [(User, User) -> IO ()] -> [IO ()]
forall a b. (a -> b) -> [a] -> [b]
map (((User, User) -> IO ()) -> (User, User) -> IO ()
forall a b. (a -> b) -> a -> b
$ (User
oldUser, User
newUser)) (EventHandlers -> [StoredEHType 'UserUpdateEvt]
forall (a :: EventType).
GetEventHandlers a =>
EventHandlers -> [StoredEHType a]
getEventHandlers @'UserUpdateEvt EventHandlers
eh)
handleEvent' _ e :: DispatchData
e = String -> Sem (Fail : r) [IO ()]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Sem (Fail : r) [IO ()])
-> String -> Sem (Fail : r) [IO ()]
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 b 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 Resumed = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
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 b 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 b 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 b 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)
-> Traversal'
(SnowflakeMap GuildChannel) (IxValue (SnowflakeMap GuildChannel))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix (GuildChannel -> Snowflake GuildChannel
forall b a. HasID b a => a -> Snowflake b
getID GuildChannel
chan) ((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 b 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 b 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 b 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 b 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 b 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
. (User -> Const (Endo [User]) User)
-> Member -> Const (Endo [User]) Member
forall sup sub. Subtype sup sub => Lens sub sub sup sup
super)) 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 b 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 UnavailableGuild { Snowflake Guild
id :: Snowflake Guild
$sel:id:UnavailableGuild :: UnavailableGuild -> Snowflake Guild
id, Bool
unavailable :: Bool
$sel:unavailable:UnavailableGuild :: UnavailableGuild -> Bool
unavailable }) =
if Bool
unavailable
then Snowflake Guild -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r ()
setUnavailableGuild Snowflake Guild
id
else Snowflake Guild -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
MemberWithError CacheEff r =>
Snowflake Guild -> Sem r ()
delGuild Snowflake Guild
id
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
^. Getting User Member User
forall sup sub. Subtype sup sub => Lens sub sub sup sup
super)
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
forall (r :: [(* -> *) -> * -> *]).
Member CacheEff r =>
Snowflake Guild -> (Guild -> Guild) -> Sem r ()
updateGuild (Member -> Snowflake Guild
forall b 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 b 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 b 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 b 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 b 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 b 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 b 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 b 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 a b. 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
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 ()
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 ()
updateCache (InviteCreate _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
updateCache (InviteDelete _) = () -> Sem r ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
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 ()