calamity 0.1.30.3 → 0.1.30.4
raw patch · 8 files changed
+111/−64 lines, 8 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Calamity.Client.Client: runBotIO'' :: forall r a. Members '[LogEff, MetricEff, CacheEff, Reader Client, AtomicState EventHandlers, Embed IO, Final IO, Async] r => Token -> Intents -> Maybe StatusUpdateData -> Sem (Reader Client : r) a -> Sem r (Maybe StartupError)
- Calamity.Cache.Eff: delDM :: forall r_acVj0. MemberWithError CacheEff r_acVj0 => Snowflake DMChannel -> Sem r_acVj0 ()
+ Calamity.Cache.Eff: delDM :: forall r_acViF. MemberWithError CacheEff r_acViF => Snowflake DMChannel -> Sem r_acViF ()
- Calamity.Cache.Eff: delGuild :: forall r_acViT. MemberWithError CacheEff r_acViT => Snowflake Guild -> Sem r_acViT ()
+ Calamity.Cache.Eff: delGuild :: forall r_acViy. MemberWithError CacheEff r_acViy => Snowflake Guild -> Sem r_acViy ()
- Calamity.Cache.Eff: delMessage :: forall r_acVjl. MemberWithError CacheEff r_acVjl => Snowflake Message -> Sem r_acVjl ()
+ Calamity.Cache.Eff: delMessage :: forall r_acVj0. MemberWithError CacheEff r_acVj0 => Snowflake Message -> Sem r_acVj0 ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_acVje. MemberWithError CacheEff r_acVje => Snowflake Guild -> Sem r_acVje ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_acViT. MemberWithError CacheEff r_acViT => Snowflake Guild -> Sem r_acViT ()
- Calamity.Cache.Eff: delUser :: forall r_acVj7. MemberWithError CacheEff r_acVj7 => Snowflake User -> Sem r_acVj7 ()
+ Calamity.Cache.Eff: delUser :: forall r_acViM. MemberWithError CacheEff r_acViM => Snowflake User -> Sem r_acViM ()
- Calamity.Cache.Eff: getBotUser :: forall r_acViL. MemberWithError CacheEff r_acViL => Sem r_acViL (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_acViq. MemberWithError CacheEff r_acViq => Sem r_acViq (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_acViX. MemberWithError CacheEff r_acViX => Snowflake DMChannel -> Sem r_acViX (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_acViC. MemberWithError CacheEff r_acViC => Snowflake DMChannel -> Sem r_acViC (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_acViZ. MemberWithError CacheEff r_acViZ => Sem r_acViZ [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_acViE. MemberWithError CacheEff r_acViE => Sem r_acViE [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_acViO. MemberWithError CacheEff r_acViO => Snowflake Guild -> Sem r_acViO (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_acVit. MemberWithError CacheEff r_acVit => Snowflake Guild -> Sem r_acVit (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_acViQ. MemberWithError CacheEff r_acViQ => Snowflake GuildChannel -> Sem r_acViQ (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_acViv. MemberWithError CacheEff r_acViv => Snowflake GuildChannel -> Sem r_acViv (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_acViS. MemberWithError CacheEff r_acViS => Sem r_acViS [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_acVix. MemberWithError CacheEff r_acVix => Sem r_acVix [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_acVji. MemberWithError CacheEff r_acVji => Snowflake Message -> Sem r_acVji (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_acViX. MemberWithError CacheEff r_acViX => Snowflake Message -> Sem r_acViX (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_acVjk. MemberWithError CacheEff r_acVjk => Sem r_acVjk [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_acViZ. MemberWithError CacheEff r_acViZ => Sem r_acViZ [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_acVjd. MemberWithError CacheEff r_acVjd => Sem r_acVjd [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_acViS. MemberWithError CacheEff r_acViS => Sem r_acViS [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_acVj4. MemberWithError CacheEff r_acVj4 => Snowflake User -> Sem r_acVj4 (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_acViJ. MemberWithError CacheEff r_acViJ => Snowflake User -> Sem r_acViJ (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_acVj6. MemberWithError CacheEff r_acVj6 => Sem r_acVj6 [User]
+ Calamity.Cache.Eff: getUsers :: forall r_acViL. MemberWithError CacheEff r_acViL => Sem r_acViL [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_acVjb. MemberWithError CacheEff r_acVjb => Snowflake Guild -> Sem r_acVjb Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_acViQ. MemberWithError CacheEff r_acViQ => Snowflake Guild -> Sem r_acViQ Bool
- Calamity.Cache.Eff: setBotUser :: forall r_acViJ. MemberWithError CacheEff r_acViJ => User -> Sem r_acViJ ()
+ Calamity.Cache.Eff: setBotUser :: forall r_acVio. MemberWithError CacheEff r_acVio => User -> Sem r_acVio ()
- Calamity.Cache.Eff: setDM :: forall r_acViV. MemberWithError CacheEff r_acViV => DMChannel -> Sem r_acViV ()
+ Calamity.Cache.Eff: setDM :: forall r_acViA. MemberWithError CacheEff r_acViA => DMChannel -> Sem r_acViA ()
- Calamity.Cache.Eff: setGuild :: forall r_acViM. MemberWithError CacheEff r_acViM => Guild -> Sem r_acViM ()
+ Calamity.Cache.Eff: setGuild :: forall r_acVir. MemberWithError CacheEff r_acVir => Guild -> Sem r_acVir ()
- Calamity.Cache.Eff: setMessage :: forall r_acVjg. MemberWithError CacheEff r_acVjg => Message -> Sem r_acVjg ()
+ Calamity.Cache.Eff: setMessage :: forall r_acViV. MemberWithError CacheEff r_acViV => Message -> Sem r_acViV ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_acVj9. MemberWithError CacheEff r_acVj9 => Snowflake Guild -> Sem r_acVj9 ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_acViO. MemberWithError CacheEff r_acViO => Snowflake Guild -> Sem r_acViO ()
- Calamity.Cache.Eff: setUser :: forall r_acVj2. MemberWithError CacheEff r_acVj2 => User -> Sem r_acVj2 ()
+ Calamity.Cache.Eff: setUser :: forall r_acViH. MemberWithError CacheEff r_acViH => User -> Sem r_acViH ()
- Calamity.Client.Client: runBotIO :: forall r a. (Members '[Embed IO, Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r)) => Token -> Intents -> Sem (SetupEff r) a -> Sem r (Maybe StartupError)
+ Calamity.Client.Client: runBotIO :: forall r a. Members '[Embed IO, Final IO, CacheEff, MetricEff, LogEff] r => Token -> Intents -> Sem (SetupEff r) a -> Sem r (Maybe StartupError)
- Calamity.Client.Client: runBotIO' :: forall r a. (Members '[Embed IO, Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r)) => Token -> Intents -> Maybe StatusUpdateData -> Sem (SetupEff r) a -> Sem r (Maybe StartupError)
+ Calamity.Client.Client: runBotIO' :: forall r a. Members '[Embed IO, Final IO, CacheEff, MetricEff, LogEff] r => Token -> Intents -> Maybe StatusUpdateData -> Sem (SetupEff r) a -> Sem r (Maybe StartupError)
- Calamity.Client.Types: type BotC r = (Members '[LogEff, MetricEff, CacheEff, Reader Client, AtomicState EventHandlers, Embed IO, Final IO, Async] r, Typeable r)
+ Calamity.Client.Types: type BotC r = (Members '[LogEff, MetricEff, CacheEff, Reader Client, AtomicState EventHandlers, Embed IO, Final IO, Async] r)
- Calamity.Gateway.Types: StatusUpdateData :: Maybe Integer -> Maybe Activity -> Text -> Bool -> StatusUpdateData
+ Calamity.Gateway.Types: StatusUpdateData :: Maybe Integer -> Maybe Activity -> StatusType -> Bool -> StatusUpdateData
- Calamity.Gateway.Types: [$sel:status:StatusUpdateData] :: StatusUpdateData -> Text
+ Calamity.Gateway.Types: [$sel:status:StatusUpdateData] :: StatusUpdateData -> StatusType
- Calamity.Internal.LocalWriter: llisten :: forall o_at4e r_at5D a_Xt4e. MemberWithError (LocalWriter o_at4e) r_at5D => Sem r_at5D a_Xt4e -> Sem r_at5D (o_at4e, a_Xt4e)
+ Calamity.Internal.LocalWriter: llisten :: forall o_at3R r_at5g a_Xt3R. MemberWithError (LocalWriter o_at3R) r_at5g => Sem r_at5g a_Xt3R -> Sem r_at5g (o_at3R, a_Xt3R)
- Calamity.Internal.LocalWriter: ltell :: forall o_at4a r_at5B. MemberWithError (LocalWriter o_at4a) r_at5B => o_at4a -> Sem r_at5B ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_at3N r_at5e. MemberWithError (LocalWriter o_at3N) r_at5e => o_at3N -> Sem r_at5e ()
- Calamity.Metrics.Eff: addCounter :: forall r_aBA8. MemberWithError MetricEff r_aBA8 => Int -> Counter -> Sem r_aBA8 Int
+ Calamity.Metrics.Eff: addCounter :: forall r_aBzH. MemberWithError MetricEff r_aBzH => Int -> Counter -> Sem r_aBzH Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_aBAb. MemberWithError MetricEff r_aBAb => (Double -> Double) -> Gauge -> Sem r_aBAb Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_aBzK. MemberWithError MetricEff r_aBzK => (Double -> Double) -> Gauge -> Sem r_aBzK Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_aBAe. MemberWithError MetricEff r_aBAe => Double -> Histogram -> Sem r_aBAe HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_aBzN. MemberWithError MetricEff r_aBzN => Double -> Histogram -> Sem r_aBzN HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_aBzY. MemberWithError MetricEff r_aBzY => Text -> [(Text, Text)] -> Sem r_aBzY Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_aBzx. MemberWithError MetricEff r_aBzx => Text -> [(Text, Text)] -> Sem r_aBzx Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_aBA1. MemberWithError MetricEff r_aBA1 => Text -> [(Text, Text)] -> Sem r_aBA1 Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_aBzA. MemberWithError MetricEff r_aBzA => Text -> [(Text, Text)] -> Sem r_aBzA Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_aBA4. MemberWithError MetricEff r_aBA4 => Text -> [(Text, Text)] -> [Double] -> Sem r_aBA4 Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_aBzD. MemberWithError MetricEff r_aBzD => Text -> [(Text, Text)] -> [Double] -> Sem r_aBzD Histogram
Files
- Calamity/Client/Client.hs +89/−50
- Calamity/Client/Types.hs +0/−1
- Calamity/Commands/Dsl.hs +6/−6
- Calamity/Gateway/Types.hs +2/−1
- Calamity/Types/Upgradeable.hs +1/−1
- Calamity/Utils/Message.hs +4/−4
- ChangeLog.md +8/−0
- calamity.cabal +1/−1
Calamity/Client/Client.hs view
@@ -5,6 +5,7 @@ react, runBotIO, runBotIO',+ runBotIO'', stopBot, sendPresence, events,@@ -95,7 +96,7 @@ -- | Create a bot, run your setup action, and then loop until the bot closes. runBotIO :: forall r a.- (P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r)) =>+ (P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r) => Token -> -- | The intents the bot should use Intents ->@@ -106,15 +107,15 @@ resetDi :: BotC r => P.Sem r a -> P.Sem r a resetDi m = do initialDi <- P.asks (^. #initialDi)- Di.local (flip fromMaybe initialDi) m+ Di.local (`fromMaybe` initialDi) m {- | Create a bot, run your setup action, and then loop until the bot closes. - This version allows you to specify the initial status, and intents.+ This version allows you to specify the initial status -} runBotIO' :: forall r a.- (P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r)) =>+ (P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r) => Token -> -- | The intents the bot should use Intents ->@@ -136,6 +137,44 @@ Di.push "calamity-stop" finishUp pure Nothing +{- | Create a bot, run your setup action, and then loop until the bot closes.++ This version only handles the @'P.Reader' 'Client'@ effect, allowing you to+ handle the @'P.AtomicState' 'EventHandlers'@ yourself.+-}+runBotIO'' ::+ forall r a.+ (P.Members+ '[ LogEff+ , MetricEff+ , CacheEff+ , P.Reader Client+ , P.AtomicState EventHandlers+ , P.Embed IO+ , P.Final IO+ , P.Async+ ]+ r) =>+ Token ->+ -- | The intents the bot should use+ Intents ->+ -- | The initial status to send to the gateway+ Maybe StatusUpdateData ->+ P.Sem (P.Reader Client ': r) a ->+ P.Sem r (Maybe StartupError)+runBotIO'' token intents status setup = do+ initialDi <- Di.fetch+ client <- P.embed $ newClient token initialDi+ P.runReader client . Di.push "calamity" $ do+ void $ Di.push "calamity-setup" setup+ r <- shardBot status intents+ case r of+ Left e -> pure (Just e)+ Right _ -> do+ Di.push "calamity-loop" clientLoop+ Di.push "calamity-stop" finishUp+ pure Nothing+ {- | Register an event handler, returning an action that removes the event handler from the bot. Refer to 'EventType' for what events you can register, and 'EHType' for the@@ -217,7 +256,7 @@ inc <- P.asks (^. #eventsIn) P.embed $ dupChan inc -{- | Wait until an event satisfying a condition happens, then returns it's+{- | Wait until an event satisfying a condition happens, then returns its parameters. The check function for this command is pure unlike 'waitUntilM'@@ -260,7 +299,7 @@ when (f args) $ do P.embed $ putMVar result args -{- | Wait until an event satisfying a condition happens, then returns it's+{- | Wait until an event satisfying a condition happens, then returns its parameters This is what it would look like with @s ~ \''MessageCreateEvt'@:@@ -326,7 +365,7 @@ debug "bot has stopped" {- | main loop of the client, handles fetching the next event, processing the- event and invoking it's handler functions+ event and invoking its handler functions -} clientLoop :: BotC r => P.Sem r () clientLoop = do@@ -382,38 +421,38 @@ P.Sem (P.Fail ': r) [IO ()] handleEvent' eh evt@(Ready rd@ReadyData{}) = do updateCache evt- pure $ map ($ rd) (getEventHandlers @ 'ReadyEvt eh)+ pure $ map ($ rd) (getEventHandlers @'ReadyEvt eh) handleEvent' _ Resumed = pure [] handleEvent' eh evt@(ChannelCreate (DMChannel' chan)) = do updateCache evt Just newChan <- DMChannel' <<$>> getDM (getID chan)- pure $ map ($ newChan) (getEventHandlers @ 'ChannelCreateEvt eh)+ pure $ map ($ newChan) (getEventHandlers @'ChannelCreateEvt eh) handleEvent' eh evt@(ChannelCreate (GuildChannel' chan)) = do updateCache evt Just guild <- getGuild (getID chan) Just newChan <- pure $ GuildChannel' <$> guild ^. #channels . at (getID chan)- pure $ map ($ newChan) (getEventHandlers @ 'ChannelCreateEvt eh)+ pure $ map ($ newChan) (getEventHandlers @'ChannelCreateEvt eh) handleEvent' eh evt@(ChannelUpdate (DMChannel' chan)) = do Just oldChan <- DMChannel' <<$>> getDM (getID chan) updateCache evt Just newChan <- DMChannel' <<$>> getDM (getID chan)- pure $ map ($ (oldChan, newChan)) (getEventHandlers @ 'ChannelUpdateEvt eh)+ pure $ map ($ (oldChan, newChan)) (getEventHandlers @'ChannelUpdateEvt eh) handleEvent' eh evt@(ChannelUpdate (GuildChannel' chan)) = do Just oldGuild <- getGuild (getID chan) Just oldChan <- pure $ GuildChannel' <$> oldGuild ^. #channels . at (getID chan) updateCache evt Just newGuild <- getGuild (getID chan) Just newChan <- pure $ GuildChannel' <$> newGuild ^. #channels . at (getID chan)- pure $ map ($ (oldChan, newChan)) (getEventHandlers @ 'ChannelUpdateEvt eh)+ pure $ map ($ (oldChan, newChan)) (getEventHandlers @'ChannelUpdateEvt eh) handleEvent' eh evt@(ChannelDelete (GuildChannel' chan)) = do Just oldGuild <- getGuild (getID chan) Just oldChan <- pure $ GuildChannel' <$> oldGuild ^. #channels . at (getID chan) updateCache evt- pure $ map ($ oldChan) (getEventHandlers @ 'ChannelDeleteEvt eh)+ pure $ map ($ oldChan) (getEventHandlers @'ChannelDeleteEvt eh) handleEvent' eh evt@(ChannelDelete (DMChannel' chan)) = do Just oldChan <- DMChannel' <<$>> getDM (getID chan) updateCache evt- pure $ map ($ oldChan) (getEventHandlers @ 'ChannelDeleteEvt eh)+ pure $ map ($ oldChan) (getEventHandlers @'ChannelDeleteEvt eh) -- handleEvent' eh evt@(ChannelPinsUpdate ChannelPinsUpdateData { channelID, lastPinTimestamp }) = do -- chan <- (GuildChannel' <$> os ^? #channels . at (coerceSnowflake channelID) . _Just)@@ -427,12 +466,12 @@ pure $ map ($ (guild, (if isNew then GuildCreateNew else GuildCreateAvailable)))- (getEventHandlers @ 'GuildCreateEvt eh)+ (getEventHandlers @'GuildCreateEvt eh) handleEvent' eh evt@(GuildUpdate guild) = do Just oldGuild <- getGuild (getID guild) updateCache evt Just newGuild <- getGuild (getID guild)- pure $ map ($ (oldGuild, newGuild)) (getEventHandlers @ 'GuildUpdateEvt eh)+ pure $ map ($ (oldGuild, newGuild)) (getEventHandlers @'GuildUpdateEvt eh) -- NOTE: Guild will be deleted in the new cache if unavailable was false handleEvent' eh evt@(GuildDelete UnavailableGuild{id, unavailable}) = do@@ -441,96 +480,96 @@ pure $ map ($ (oldGuild, (if unavailable then GuildDeleteUnavailable else GuildDeleteRemoved)))- (getEventHandlers @ 'GuildDeleteEvt eh)+ (getEventHandlers @'GuildDeleteEvt eh) handleEvent' eh evt@(GuildBanAdd BanData{guildID, user}) = do Just guild <- getGuild guildID updateCache evt- pure $ map ($ (guild, user)) (getEventHandlers @ 'GuildBanAddEvt eh)+ pure $ map ($ (guild, user)) (getEventHandlers @'GuildBanAddEvt eh) handleEvent' eh evt@(GuildBanRemove BanData{guildID, user}) = do Just guild <- getGuild guildID updateCache evt- pure $ map ($ (guild, user)) (getEventHandlers @ 'GuildBanRemoveEvt eh)+ pure $ map ($ (guild, user)) (getEventHandlers @'GuildBanRemoveEvt eh) -- NOTE: we fire this event using the guild data with old emojis handleEvent' eh evt@(GuildEmojisUpdate GuildEmojisUpdateData{guildID, emojis}) = do Just guild <- getGuild guildID updateCache evt- pure $ map ($ (guild, emojis)) (getEventHandlers @ 'GuildEmojisUpdateEvt eh)+ pure $ map ($ (guild, emojis)) (getEventHandlers @'GuildEmojisUpdateEvt eh) handleEvent' eh evt@(GuildIntegrationsUpdate GuildIntegrationsUpdateData{guildID}) = do updateCache evt Just guild <- getGuild guildID- pure $ map ($ guild) (getEventHandlers @ 'GuildIntegrationsUpdateEvt eh)+ pure $ map ($ guild) (getEventHandlers @'GuildIntegrationsUpdateEvt eh) handleEvent' eh evt@(GuildMemberAdd member) = do updateCache evt Just guild <- getGuild (getID member) Just member <- pure $ guild ^. #members . at (getID member)- pure $ map ($ member) (getEventHandlers @ 'GuildMemberAddEvt eh)+ pure $ map ($ member) (getEventHandlers @'GuildMemberAddEvt eh) handleEvent' eh evt@(GuildMemberRemove GuildMemberRemoveData{user, guildID}) = do Just guild <- getGuild guildID Just member <- pure $ guild ^. #members . at (getID user) updateCache evt- pure $ map ($ member) (getEventHandlers @ 'GuildMemberRemoveEvt eh)+ pure $ map ($ member) (getEventHandlers @'GuildMemberRemoveEvt eh) handleEvent' eh evt@(GuildMemberUpdate GuildMemberUpdateData{user, guildID}) = do Just oldGuild <- getGuild guildID Just oldMember <- pure $ oldGuild ^. #members . at (getID user) updateCache evt Just newGuild <- getGuild guildID Just newMember <- pure $ newGuild ^. #members . at (getID user)- pure $ map ($ (oldMember, newMember)) (getEventHandlers @ 'GuildMemberUpdateEvt eh)+ pure $ map ($ (oldMember, newMember)) (getEventHandlers @'GuildMemberUpdateEvt eh) handleEvent' eh evt@(GuildMembersChunk GuildMembersChunkData{members, guildID}) = do updateCache evt Just guild <- getGuild guildID let memberIDs = map (getID @Member) members let members' = catMaybes $ map (\mid -> guild ^. #members . at mid) memberIDs- pure $ map ($ (guild, members')) (getEventHandlers @ 'GuildMembersChunkEvt eh)+ pure $ map ($ (guild, members')) (getEventHandlers @'GuildMembersChunkEvt eh) handleEvent' eh evt@(GuildRoleCreate GuildRoleData{guildID, role}) = do updateCache evt Just guild <- getGuild guildID Just role' <- pure $ guild ^. #roles . at (getID role)- pure $ map ($ (guild, role')) (getEventHandlers @ 'GuildRoleCreateEvt eh)+ pure $ map ($ (guild, role')) (getEventHandlers @'GuildRoleCreateEvt eh) handleEvent' eh evt@(GuildRoleUpdate GuildRoleData{guildID, role}) = do Just oldGuild <- getGuild guildID Just oldRole <- pure $ oldGuild ^. #roles . at (getID role) updateCache evt Just newGuild <- getGuild guildID Just newRole <- pure $ newGuild ^. #roles . at (getID role)- pure $ map ($ (newGuild, oldRole, newRole)) (getEventHandlers @ 'GuildRoleUpdateEvt eh)+ pure $ map ($ (newGuild, oldRole, newRole)) (getEventHandlers @'GuildRoleUpdateEvt eh) handleEvent' eh evt@(GuildRoleDelete GuildRoleDeleteData{guildID, roleID}) = do Just guild <- getGuild guildID Just role <- pure $ guild ^. #roles . at roleID updateCache evt- pure $ map ($ (guild, role)) (getEventHandlers @ 'GuildRoleDeleteEvt eh)+ pure $ map ($ (guild, role)) (getEventHandlers @'GuildRoleDeleteEvt eh) handleEvent' eh (InviteCreate d) = do- pure $ map ($ d) (getEventHandlers @ 'InviteCreateEvt eh)+ pure $ map ($ d) (getEventHandlers @'InviteCreateEvt eh) handleEvent' eh (InviteDelete d) = do- pure $ map ($ d) (getEventHandlers @ 'InviteDeleteEvt eh)+ pure $ map ($ d) (getEventHandlers @'InviteDeleteEvt eh) handleEvent' eh evt@(MessageCreate msg _) = do updateCache evt- pure $ map ($ msg) (getEventHandlers @ 'MessageCreateEvt eh)+ pure $ map ($ msg) (getEventHandlers @'MessageCreateEvt eh) handleEvent' eh evt@(MessageUpdate msg) = do oldMsg <- getMessage (getID msg) updateCache evt newMsg <- getMessage (getID msg)- let rawActions = map ($ msg) (getEventHandlers @ 'RawMessageUpdateEvt eh)+ let rawActions = map ($ msg) (getEventHandlers @'RawMessageUpdateEvt eh) let actions = case (oldMsg, newMsg) of (Just oldMsg', Just newMsg') ->- map ($ (oldMsg', newMsg')) (getEventHandlers @ 'MessageUpdateEvt eh)+ map ($ (oldMsg', newMsg')) (getEventHandlers @'MessageUpdateEvt eh) _ -> [] pure $ rawActions <> actions handleEvent' eh evt@(MessageDelete MessageDeleteData{id}) = do oldMsg <- getMessage id updateCache evt- let rawActions = map ($ id) (getEventHandlers @ 'RawMessageDeleteEvt eh)+ let rawActions = map ($ id) (getEventHandlers @'RawMessageDeleteEvt eh) let actions = case oldMsg of Just oldMsg' ->- map ($ oldMsg') (getEventHandlers @ 'MessageDeleteEvt eh)+ map ($ oldMsg') (getEventHandlers @'MessageDeleteEvt eh) _ -> [] pure $ rawActions <> actions handleEvent' eh evt@(MessageDeleteBulk MessageDeleteBulkData{ids}) = do messages <- catMaybes <$> traverse getMessage ids updateCache evt- let rawActions = map ($ ids) (getEventHandlers @ 'RawMessageDeleteBulkEvt eh)- let actions = map ($ messages) (getEventHandlers @ 'MessageDeleteBulkEvt eh)+ let rawActions = map ($ ids) (getEventHandlers @'RawMessageDeleteBulkEvt eh)+ let actions = map ($ messages) (getEventHandlers @'MessageDeleteBulkEvt eh) pure $ rawActions <> actions handleEvent' eh evt@(MessageReactionAdd reaction) = do updateCache evt@@ -543,10 +582,10 @@ Nothing -> do chan <- getDM (coerceSnowflake $ getID @Channel reaction) pure (DMChannel' <$> chan)- let rawActions = map ($ reaction) (getEventHandlers @ 'RawMessageReactionAddEvt eh)+ let rawActions = map ($ reaction) (getEventHandlers @'RawMessageReactionAddEvt eh) let actions = case (msg, user, chan) of (Just msg', Just user', Just chan') ->- map ($ (msg', user', chan', reaction ^. #emoji)) (getEventHandlers @ 'MessageReactionAddEvt eh)+ map ($ (msg', user', chan', reaction ^. #emoji)) (getEventHandlers @'MessageReactionAddEvt eh) _ -> [] pure $ rawActions <> actions handleEvent' eh evt@(MessageReactionRemove reaction) = do@@ -560,19 +599,19 @@ Nothing -> do chan <- getDM (coerceSnowflake $ getID @Channel reaction) pure (DMChannel' <$> chan)- let rawActions = map ($ reaction) (getEventHandlers @ 'RawMessageReactionRemoveEvt eh)+ let rawActions = map ($ reaction) (getEventHandlers @'RawMessageReactionRemoveEvt eh) let actions = case (msg, user, chan) of (Just msg', Just user', Just chan') ->- map ($ (msg', user', chan', reaction ^. #emoji)) (getEventHandlers @ 'MessageReactionRemoveEvt eh)+ map ($ (msg', user', chan', reaction ^. #emoji)) (getEventHandlers @'MessageReactionRemoveEvt eh) _ -> [] pure $ rawActions <> actions handleEvent' eh evt@(MessageReactionRemoveAll MessageReactionRemoveAllData{messageID}) = do msg <- getMessage messageID updateCache evt- let rawActions = map ($ messageID) (getEventHandlers @ 'RawMessageReactionRemoveAllEvt eh)+ let rawActions = map ($ messageID) (getEventHandlers @'RawMessageReactionRemoveAllEvt eh) let actions = case msg of Just msg' ->- map ($ msg') (getEventHandlers @ 'MessageReactionRemoveAllEvt eh)+ map ($ msg') (getEventHandlers @'MessageReactionRemoveAllEvt eh) _ -> [] pure $ rawActions <> actions handleEvent' eh evt@(PresenceUpdate PresenceUpdateData{userID, presence = Presence{guildID}}) = do@@ -585,30 +624,30 @@ newUser :: User = upcast newMember userUpdates = if oldUser /= newUser- then map ($ (oldUser, newUser)) (getEventHandlers @ 'UserUpdateEvt eh)+ then map ($ (oldUser, newUser)) (getEventHandlers @'UserUpdateEvt eh) else mempty- pure $ userUpdates <> map ($ (oldMember, newMember)) (getEventHandlers @ 'GuildMemberUpdateEvt eh)+ pure $ userUpdates <> map ($ (oldMember, newMember)) (getEventHandlers @'GuildMemberUpdateEvt eh) handleEvent' eh (TypingStart TypingStartData{channelID, guildID, userID, timestamp = UnixTimestamp timestamp}) = case guildID of Just gid -> do Just guild <- getGuild gid Just chan <- pure $ GuildChannel' <$> guild ^. #channels . at (coerceSnowflake channelID)- pure $ map ($ (chan, userID, timestamp)) (getEventHandlers @ 'TypingStartEvt eh)+ pure $ map ($ (chan, userID, timestamp)) (getEventHandlers @'TypingStartEvt eh) Nothing -> do Just chan <- DMChannel' <<$>> getDM (coerceSnowflake channelID)- pure $ map ($ (chan, userID, timestamp)) (getEventHandlers @ 'TypingStartEvt eh)+ pure $ map ($ (chan, userID, timestamp)) (getEventHandlers @'TypingStartEvt eh) handleEvent' eh evt@(UserUpdate _) = do Just oldUser <- getBotUser updateCache evt Just newUser <- getBotUser- pure $ map ($ (oldUser, newUser)) (getEventHandlers @ 'UserUpdateEvt eh)+ pure $ map ($ (oldUser, newUser)) (getEventHandlers @'UserUpdateEvt eh) handleEvent' eh evt@(VoiceStateUpdate newVoiceState@V.VoiceState{guildID = Just guildID}) = do oldVoiceState <- ((find ((== V.sessionID newVoiceState) . V.sessionID) . voiceStates) =<<) <$> getGuild guildID updateCache evt- pure $ map ($ (oldVoiceState, newVoiceState)) (getEventHandlers @ 'VoiceStateUpdateEvt eh)+ pure $ map ($ (oldVoiceState, newVoiceState)) (getEventHandlers @'VoiceStateUpdateEvt eh) handleEvent' eh evt@(InteractionCreate interaction) = do updateCache evt- pure $ map ($ interaction) (getEventHandlers @ 'InteractionEvt eh)+ pure $ map ($ interaction) (getEventHandlers @'InteractionEvt eh) handleEvent' _ e = fail $ "Unhandled event: " <> show e updateCache :: P.Members '[CacheEff, P.Fail] r => DispatchData -> P.Sem r ()
Calamity/Client/Types.hs view
@@ -80,7 +80,6 @@ , P.Async ] r- , Typeable r ) -- | A concrete effect stack used inside the bot
Calamity/Commands/Dsl.hs view
@@ -60,12 +60,12 @@ 'Calamity.Commands.Dsl.command' \@'[] "test" \\ctx -> 'pure' () @ - In the above block, any command declared inside 'hide' will have it's+ In the above block, any command declared inside 'hide' will have its \'hidden\' flag set and will not be shown by the default help command: 'Calamity.Commands.Help.helpCommand' The 'Calamity.Commands.Help.helpCommand' function can be used to create a- help command for the commands DSL action it is used in, read it's doc page+ help command for the commands DSL action it is used in, read its doc page for more information on how it functions. The 'Calamity.Commands.Utils.addCommands' function creates the command@@ -256,7 +256,7 @@ {- | Construct a group and place any commands registered in the given action into the new group. - This also resets the @help@ function back to it's original value, use+ This also resets the @help@ function back to its original value, use 'group'' if you don't want that (i.e. your help function is context aware). -} group ::@@ -273,7 +273,7 @@ The parent group, visibility, checks, and command help are drawn from the reader context. - This also resets the @help@ function back to it's original value, use+ This also resets the @help@ function back to its original value, use 'group'' if you don't want that (i.e. your help function is context aware). -} groupA ::@@ -292,7 +292,7 @@ The parent group, visibility, checks, and command help are drawn from the reader context. - Unlike 'help' this doesn't reset the @help@ function back to it's original+ Unlike 'help' this doesn't reset the @help@ function back to its original value. -} group' ::@@ -309,7 +309,7 @@ The parent group, visibility, checks, and command help are drawn from the reader context. - Unlike 'help' this doesn't reset the @help@ function back to it's original+ Unlike 'help' this doesn't reset the @help@ function back to its original value. -} groupA' ::
Calamity/Gateway/Types.hs view
@@ -23,6 +23,7 @@ import Calamity.Types.Model.Guild.Guild import Calamity.Types.Model.Voice import Calamity.Types.Model.Presence.Activity+import Calamity.Types.Model.User (StatusType) import Calamity.Types.Snowflake import Control.Concurrent.Async@@ -219,7 +220,7 @@ data StatusUpdateData = StatusUpdateData { since :: Maybe Integer , game :: Maybe Activity- , status :: Text+ , status :: StatusType , afk :: Bool } deriving ( Show, Generic )
Calamity/Types/Upgradeable.hs view
@@ -24,7 +24,7 @@ -- | A typeclass that represents snowflakes that can be upgraded to their -- complete data, either through the cache or HTTP. class Upgradeable a ids | a -> ids, ids -> a where- -- | Upgrade a snowflake to it's complete data.+ -- | Upgrade a snowflake to its complete data. -- -- If it existed in the cache then it is returned from there, otherwise we -- fetch from HTTP and update the cache on success.
Calamity/Utils/Message.hs view
@@ -114,21 +114,21 @@ codeline :: L.Text -> L.Text codeline content = "``" <> escapeCodelines content <> "``" -{- | Formats some text into it's bolded form+{- | Formats some text into its bolded form Any existing bolded text is escaped -} bold :: L.Text -> L.Text bold content = "**" <> escapeBold content <> "**" -{- | Formats some text into it's striked form+{- | Formats some text into its striked form Any existing striked text is escaped -} strike :: L.Text -> L.Text strike content = "~~" <> escapeStrike content <> "~~" -{- | Formats some text into it's underlined form+{- | Formats some text into its underlined form Any existing underlined text is escaped -}@@ -143,7 +143,7 @@ quoteAll :: L.Text -> L.Text quoteAll = (">> " <>) -{- | Formats some text into it's spoilered form+{- | Formats some text into its spoilered form Any existing spoilers are escaped -}
ChangeLog.md view
@@ -1,5 +1,13 @@ # Changelog for Calamity +## 0.1.30.4+++ The `status` field of `StatusUpdateData` has been changed from `Text` to+ `StatusType`.++ Removed the redundant `Typeable` constraint from `BotC` and `runBotIO`, etc.++ Added the `runBotIO''` function which gives more control over the internal+ state effects.+ ## 0.1.30.3 + Added models for interactions and components
calamity.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: calamity-version: 0.1.30.3+version: 0.1.30.4 synopsis: A library for writing discord bots in haskell description: Please see the README on GitHub at <https://github.com/simmsb/calamity#readme> category: Network, Web