packages feed

calamity 0.1.28.5 → 0.1.29.0

raw patch · 7 files changed

+109/−60 lines, 7 filesdep ~basedep ~df1dep ~lensPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, df1, lens, polysemy, polysemy-plugin

API changes (from Hackage documentation)

- Calamity.Cache.Eff: delDM :: forall r_a9tTz. MemberWithError CacheEff r_a9tTz => Snowflake DMChannel -> Sem r_a9tTz ()
+ Calamity.Cache.Eff: delDM :: forall r_a9tRf. MemberWithError CacheEff r_a9tRf => Snowflake DMChannel -> Sem r_a9tRf ()
- Calamity.Cache.Eff: delGuild :: forall r_a9tTs. MemberWithError CacheEff r_a9tTs => Snowflake Guild -> Sem r_a9tTs ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9tR8. MemberWithError CacheEff r_a9tR8 => Snowflake Guild -> Sem r_a9tR8 ()
- Calamity.Cache.Eff: delMessage :: forall r_a9tTU. MemberWithError CacheEff r_a9tTU => Snowflake Message -> Sem r_a9tTU ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9tRA. MemberWithError CacheEff r_a9tRA => Snowflake Message -> Sem r_a9tRA ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9tTN. MemberWithError CacheEff r_a9tTN => Snowflake Guild -> Sem r_a9tTN ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9tRt. MemberWithError CacheEff r_a9tRt => Snowflake Guild -> Sem r_a9tRt ()
- Calamity.Cache.Eff: delUser :: forall r_a9tTG. MemberWithError CacheEff r_a9tTG => Snowflake User -> Sem r_a9tTG ()
+ Calamity.Cache.Eff: delUser :: forall r_a9tRm. MemberWithError CacheEff r_a9tRm => Snowflake User -> Sem r_a9tRm ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9tTk. MemberWithError CacheEff r_a9tTk => Sem r_a9tTk (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9tR0. MemberWithError CacheEff r_a9tR0 => Sem r_a9tR0 (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9tTw. MemberWithError CacheEff r_a9tTw => Snowflake DMChannel -> Sem r_a9tTw (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9tRc. MemberWithError CacheEff r_a9tRc => Snowflake DMChannel -> Sem r_a9tRc (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9tTy. MemberWithError CacheEff r_a9tTy => Sem r_a9tTy [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9tRe. MemberWithError CacheEff r_a9tRe => Sem r_a9tRe [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9tTn. MemberWithError CacheEff r_a9tTn => Snowflake Guild -> Sem r_a9tTn (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9tR3. MemberWithError CacheEff r_a9tR3 => Snowflake Guild -> Sem r_a9tR3 (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_a9tTp. MemberWithError CacheEff r_a9tTp => Snowflake GuildChannel -> Sem r_a9tTp (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9tR5. MemberWithError CacheEff r_a9tR5 => Snowflake GuildChannel -> Sem r_a9tR5 (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_a9tTr. MemberWithError CacheEff r_a9tTr => Sem r_a9tTr [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9tR7. MemberWithError CacheEff r_a9tR7 => Sem r_a9tR7 [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9tTR. MemberWithError CacheEff r_a9tTR => Snowflake Message -> Sem r_a9tTR (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9tRx. MemberWithError CacheEff r_a9tRx => Snowflake Message -> Sem r_a9tRx (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9tTT. MemberWithError CacheEff r_a9tTT => Sem r_a9tTT [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9tRz. MemberWithError CacheEff r_a9tRz => Sem r_a9tRz [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9tTM. MemberWithError CacheEff r_a9tTM => Sem r_a9tTM [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9tRs. MemberWithError CacheEff r_a9tRs => Sem r_a9tRs [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9tTD. MemberWithError CacheEff r_a9tTD => Snowflake User -> Sem r_a9tTD (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9tRj. MemberWithError CacheEff r_a9tRj => Snowflake User -> Sem r_a9tRj (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9tTF. MemberWithError CacheEff r_a9tTF => Sem r_a9tTF [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9tRl. MemberWithError CacheEff r_a9tRl => Sem r_a9tRl [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9tTK. MemberWithError CacheEff r_a9tTK => Snowflake Guild -> Sem r_a9tTK Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9tRq. MemberWithError CacheEff r_a9tRq => Snowflake Guild -> Sem r_a9tRq Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9tTi. MemberWithError CacheEff r_a9tTi => User -> Sem r_a9tTi ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9tQY. MemberWithError CacheEff r_a9tQY => User -> Sem r_a9tQY ()
- Calamity.Cache.Eff: setDM :: forall r_a9tTu. MemberWithError CacheEff r_a9tTu => DMChannel -> Sem r_a9tTu ()
+ Calamity.Cache.Eff: setDM :: forall r_a9tRa. MemberWithError CacheEff r_a9tRa => DMChannel -> Sem r_a9tRa ()
- Calamity.Cache.Eff: setGuild :: forall r_a9tTl. MemberWithError CacheEff r_a9tTl => Guild -> Sem r_a9tTl ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9tR1. MemberWithError CacheEff r_a9tR1 => Guild -> Sem r_a9tR1 ()
- Calamity.Cache.Eff: setMessage :: forall r_a9tTP. MemberWithError CacheEff r_a9tTP => Message -> Sem r_a9tTP ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9tRv. MemberWithError CacheEff r_a9tRv => Message -> Sem r_a9tRv ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9tTI. MemberWithError CacheEff r_a9tTI => Snowflake Guild -> Sem r_a9tTI ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9tRo. MemberWithError CacheEff r_a9tRo => Snowflake Guild -> Sem r_a9tRo ()
- Calamity.Cache.Eff: setUser :: forall r_a9tTB. MemberWithError CacheEff r_a9tTB => User -> Sem r_a9tTB ()
+ Calamity.Cache.Eff: setUser :: forall r_a9tRh. MemberWithError CacheEff r_a9tRh => User -> Sem r_a9tRh ()
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a4VkT. MemberWithError ParsePrefix r_a4VkT => Message -> Sem r_a4VkT (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a4ViQ. MemberWithError ParsePrefix r_a4ViQ => Message -> Sem r_a4ViQ (Maybe (Text, Text))
- Calamity.Internal.LocalWriter: llisten :: forall o_arTS r_as1p a_XrTS. MemberWithError (LocalWriter o_arTS) r_as1p => Sem r_as1p a_XrTS -> Sem r_as1p (o_arTS, a_XrTS)
+ Calamity.Internal.LocalWriter: llisten :: forall o_arRL r_arZi a_XrRL. MemberWithError (LocalWriter o_arRL) r_arZi => Sem r_arZi a_XrRL -> Sem r_arZi (o_arRL, a_XrRL)
- Calamity.Internal.LocalWriter: ltell :: forall o_arTO r_as1n. MemberWithError (LocalWriter o_arTO) r_as1n => o_arTO -> Sem r_as1n ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_arRH r_arZg. MemberWithError (LocalWriter o_arRH) r_arZg => o_arRH -> Sem r_arZg ()
- Calamity.Metrics.Eff: addCounter :: forall r_avxO. MemberWithError MetricEff r_avxO => Int -> Counter -> Sem r_avxO Int
+ Calamity.Metrics.Eff: addCounter :: forall r_avvL. MemberWithError MetricEff r_avvL => Int -> Counter -> Sem r_avvL Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_avxR. MemberWithError MetricEff r_avxR => (Double -> Double) -> Gauge -> Sem r_avxR Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_avvO. MemberWithError MetricEff r_avvO => (Double -> Double) -> Gauge -> Sem r_avvO Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_avxU. MemberWithError MetricEff r_avxU => Double -> Histogram -> Sem r_avxU HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_avvR. MemberWithError MetricEff r_avvR => Double -> Histogram -> Sem r_avvR HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_avxE. MemberWithError MetricEff r_avxE => Text -> [(Text, Text)] -> Sem r_avxE Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_avvB. MemberWithError MetricEff r_avvB => Text -> [(Text, Text)] -> Sem r_avvB Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_avxH. MemberWithError MetricEff r_avxH => Text -> [(Text, Text)] -> Sem r_avxH Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_avvE. MemberWithError MetricEff r_avvE => Text -> [(Text, Text)] -> Sem r_avvE Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_avxK. MemberWithError MetricEff r_avxK => Text -> [(Text, Text)] -> [Double] -> Sem r_avxK Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_avvH. MemberWithError MetricEff r_avvH => Text -> [(Text, Text)] -> [Double] -> Sem r_avvH Histogram

Files

Calamity/Client/Client.hs view
@@ -486,7 +486,8 @@ handleEvent' eh evt@(GuildMembersChunk GuildMembersChunkData { members, guildID }) = do   updateCache evt   Just guild <- getGuild guildID-  let members' = guild ^.. #members . foldMap (at . getID) members . _Just+  let memberIDs = map (getID @Member) members+  let members' = catMaybes $ map (\mid -> guild ^. #members . at mid) memberIDs   pure $ map ($ (guild, members')) (getEventHandlers @'GuildMembersChunkEvt eh)  handleEvent' eh evt@(GuildRoleCreate GuildRoleData { guildID, role }) = do
Calamity/Client/Types.hs view
@@ -256,35 +256,35 @@   def =     EventHandlers $       fromList-        [ WrapTypeable $ EH @ 'ReadyEvt []-        , WrapTypeable $ EH @ 'ChannelCreateEvt []-        , WrapTypeable $ EH @ 'ChannelUpdateEvt []-        , WrapTypeable $ EH @ 'ChannelDeleteEvt []-        , WrapTypeable $ EH @ 'ChannelpinsUpdateEvt []-        , WrapTypeable $ EH @ 'GuildCreateEvt []-        , WrapTypeable $ EH @ 'GuildUpdateEvt []-        , WrapTypeable $ EH @ 'GuildDeleteEvt []-        , WrapTypeable $ EH @ 'GuildBanAddEvt []-        , WrapTypeable $ EH @ 'GuildBanRemoveEvt []-        , WrapTypeable $ EH @ 'GuildEmojisUpdateEvt []-        , WrapTypeable $ EH @ 'GuildIntegrationsUpdateEvt []-        , WrapTypeable $ EH @ 'GuildMemberAddEvt []-        , WrapTypeable $ EH @ 'GuildMemberRemoveEvt []-        , WrapTypeable $ EH @ 'GuildMemberUpdateEvt []-        , WrapTypeable $ EH @ 'GuildMembersChunkEvt []-        , WrapTypeable $ EH @ 'GuildRoleCreateEvt []-        , WrapTypeable $ EH @ 'GuildRoleUpdateEvt []-        , WrapTypeable $ EH @ 'GuildRoleDeleteEvt []-        , WrapTypeable $ EH @ 'MessageCreateEvt []-        , WrapTypeable $ EH @ 'MessageUpdateEvt []-        , WrapTypeable $ EH @ 'MessageDeleteEvt []-        , WrapTypeable $ EH @ 'MessageDeleteBulkEvt []-        , WrapTypeable $ EH @ 'MessageReactionAddEvt []-        , WrapTypeable $ EH @ 'MessageReactionRemoveEvt []-        , WrapTypeable $ EH @ 'MessageReactionRemoveAllEvt []-        , WrapTypeable $ EH @ 'TypingStartEvt []-        , WrapTypeable $ EH @ 'UserUpdateEvt []-        , WrapTypeable $ EH @( 'CustomEvt Void Dynamic) LH.empty+        [ WrapTypeable $ EH @'ReadyEvt []+        , WrapTypeable $ EH @'ChannelCreateEvt []+        , WrapTypeable $ EH @'ChannelUpdateEvt []+        , WrapTypeable $ EH @'ChannelDeleteEvt []+        , WrapTypeable $ EH @'ChannelpinsUpdateEvt []+        , WrapTypeable $ EH @'GuildCreateEvt []+        , WrapTypeable $ EH @'GuildUpdateEvt []+        , WrapTypeable $ EH @'GuildDeleteEvt []+        , WrapTypeable $ EH @'GuildBanAddEvt []+        , WrapTypeable $ EH @'GuildBanRemoveEvt []+        , WrapTypeable $ EH @'GuildEmojisUpdateEvt []+        , WrapTypeable $ EH @'GuildIntegrationsUpdateEvt []+        , WrapTypeable $ EH @'GuildMemberAddEvt []+        , WrapTypeable $ EH @'GuildMemberRemoveEvt []+        , WrapTypeable $ EH @'GuildMemberUpdateEvt []+        , WrapTypeable $ EH @'GuildMembersChunkEvt []+        , WrapTypeable $ EH @'GuildRoleCreateEvt []+        , WrapTypeable $ EH @'GuildRoleUpdateEvt []+        , WrapTypeable $ EH @'GuildRoleDeleteEvt []+        , WrapTypeable $ EH @'MessageCreateEvt []+        , WrapTypeable $ EH @'MessageUpdateEvt []+        , WrapTypeable $ EH @'MessageDeleteEvt []+        , WrapTypeable $ EH @'MessageDeleteBulkEvt []+        , WrapTypeable $ EH @'MessageReactionAddEvt []+        , WrapTypeable $ EH @'MessageReactionRemoveEvt []+        , WrapTypeable $ EH @'MessageReactionRemoveAllEvt []+        , WrapTypeable $ EH @'TypingStartEvt []+        , WrapTypeable $ EH @'UserUpdateEvt []+        , WrapTypeable $ EH @('CustomEvt Void Dynamic) LH.empty         ]  instance Semigroup EventHandlers where
Calamity/HTTP/Internal/Request.hs view
@@ -88,7 +88,7 @@   let r = action a (route' ^. #path) (requestOptions token')       act = runReq reqConfig r -  resp <- attr "route" (renderUrl $ route' ^. #path) $ doRequest rlState' route' act+  resp <- push "calamity" . attr "route" (renderUrl $ route' ^. #path) $ doRequest rlState' route' act    void $ modifyGauge (subtract 1) inFlightRequests 
Calamity/Utils/Permissions.hs view
@@ -17,8 +17,10 @@  import           Control.Lens +import           Data.Maybe (catMaybes) import           Data.Flags import qualified Data.Vector.Unboxing                   as V+import           Data.Generics.Product.Fields  import qualified Polysemy                               as P import Data.Foldable (Foldable(foldl'))@@ -29,7 +31,8 @@   | (g ^. #ownerID == getID m) = allFlags   | otherwise = let everyoneRole  = g ^. #roles . at (coerceSnowflake $ getID @Guild g)                     permsEveryone = maybe noFlags (^. #permissions) everyoneRole-                    rolePerms     = g ^.. #roles . foldMap ix (V.toList $ m ^. #roles) . #permissions+                    roleIDs       = V.toList $ m ^. #roles+                    rolePerms     = catMaybes $ map (\rid -> g ^? #roles . ix rid . #permissions) roleIDs                     perms         = foldl' andFlags noFlags (permsEveryone:rolePerms)                 in if perms .<=. administrator                    then allFlags@@ -40,16 +43,16 @@ applyOverwrites c m p   | p .<=. administrator = allFlags   | otherwise =-    let everyoneOverwrite = c ^. #permissionOverwrites . at (coerceSnowflake $ getID @Guild c)+    let everyoneOverwrite = c ^. field' @"permissionOverwrites" . at (coerceSnowflake $ getID @Guild c)         everyoneAllow     = maybe noFlags (^. #allow) everyoneOverwrite         everyoneDeny      = maybe noFlags (^. #deny) everyoneOverwrite         p'                = p .-. everyoneDeny .+. everyoneAllow-        roleOverwrites    = c ^.. #permissionOverwrites . foldMap ix-          (map (coerceSnowflake @_ @Overwrite) . V.toList $ m ^. #roles)+        roleOverwriteIDs  = map (coerceSnowflake @_ @Overwrite) . V.toList $ m ^. #roles+        roleOverwrites    = catMaybes $ map (\oid -> c ^? field' @"permissionOverwrites" . ix oid) roleOverwriteIDs         roleAllow         = foldl' andFlags noFlags (roleOverwrites ^.. traverse . #allow)         roleDeny          = foldl' andFlags noFlags (roleOverwrites ^.. traverse . #deny)         p''               = p' .-. roleDeny .+. roleAllow-        memberOverwrite   = c ^. #permissionOverwrites . at (coerceSnowflake @_ @Overwrite $ getID @Member m)+        memberOverwrite   = c ^. field' @"permissionOverwrites" . at (coerceSnowflake @_ @Overwrite $ getID @Member m)         memberAllow       = maybe noFlags (^. #allow) memberOverwrite         memberDeny        = maybe noFlags (^. #deny) memberOverwrite         p'''              = p'' .-. memberDeny .+. memberAllow
ChangeLog.md view
@@ -1,5 +1,13 @@ # Changelog for Calamity +## 0.1.29.0+++ The minimum version of `base` has been upped to `4.13` as the library fails to+  build on ghc-8.6++ The minimum version of `polysemy` has been upped to 1.5++ The upper bound of `lens` has been bumped to 6++ The library now compiles with ghc-9+ ## 0.1.28.5  + Use the correct HTTP method for `ModifyChannel`
README.md view
@@ -35,13 +35,42 @@  You can find documentation on hackage at: https://hackage.haskell.org/package/calamity +There's also a good blog post that covers the fundamentals of writing a bot with+the library, you can read it here:+https://morrowm.github.io/posts/2021-04-29-calamity.html+ # Examples -Some example projects can be found at:+Here's a list of projects that use calamity: <!-- - [simmsb/calamity-example](https://github.com/simmsb/calamity-example): An extended example of the snippet below, shows use of metrics. -->-- [simmsb/calamity-bot](https://github.com/simmsb/calamity-bot): Uses a database, showing modularisation of groups/commands.+- [simmsb/calamity-bot](https://github.com/simmsb/calamity-bot): Uses a database, showing modularization of groups/commands.+- [MorrowM/pandabot-discord](https://github.com/MorrowM/pandabot-discord): Uses a database, performs member role management, etc.+- [MorrowM/calamity-tutorial](https://github.com/MorrowM/calamity-tutorial): A bare minimum bot. +(Feel free to contact me via the discord server, or email me via+ben@bensimms.moe if you've written a bot using calamity, or don't want your+project listed here)+ ``` haskell+#!/usr/bin/env cabal+{- cabal:+  build-depends:+     base >= 4.13 && < 5+     , calamity >= 0.1.28+     , text >= 1.2 && < 2+     , lens >= 4.18 && < 5+     , di-polysemy ^>= 0.2+     , di >= 1.3 && < 2+     , df1 >= 0.3 && < 0.5+     , di-core ^>= 1.0.4+     , polysemy ^>= 1.5+     , polysemy-plugin ^>= 0.3+     , stm ^>= 2.5+     , text-show ^>= 3.9+-}++{-# OPTIONS_GHC -fplugin=Polysemy.Plugin #-}+ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-}@@ -61,7 +90,7 @@ import           Calamity import           Calamity.Cache.InMemory import           Calamity.Commands-import qualified Calamity.Commands.Context                  as CommandContext+import qualified Calamity.Commands.Context   as CommandContext import           Calamity.Metrics.Noop  import           Control.Concurrent@@ -69,8 +98,7 @@ import           Control.Lens import           Control.Monad -import           Data.Text.Lazy              ( Text, fromStrict )-import           Data.Text.Strict.Lens+import qualified Data.Text.Lazy as L  import qualified Di import qualified DiPolysemy                  as DiP@@ -83,6 +111,8 @@  import           Prelude                     hiding ( error ) +import           System.Environment          (getEnv)+ import           TextShow  data Counter m a where@@ -99,19 +129,19 @@ handleFailByLogging m = do   r <- P.runFail m   case r of-    Left e -> DiP.error (e ^. packed)+    Left e -> DiP.error $ L.pack e     _      -> pure () -info, debug :: BotC r => Text -> P.Sem r ()+info, debug :: BotC r => L.Text -> P.Sem r () info = DiP.info debug = DiP.info -tellt :: (BotC r, Tellable t) => t -> Text -> P.Sem r (Either RestError Message)+tellt :: (BotC r, Tellable t) => t -> L.Text -> P.Sem r (Either RestError Message) tellt t m = tell t $ L.toStrict m  main :: IO () main = do-  token <- view packed <$> getEnv "BOT_TOKEN"+  token <- L.pack <$> getEnv "BOT_TOKEN"   Di.new $ \di ->     void . P.runFinal . P.embedToFinal . DiP.runDiToIO di . runCounterAtomic . runCacheInMemory . runMetricsNoop . useConstantPrefix "!"       $ runBotIO (BotToken token) defaultIntents $ do@@ -122,7 +152,7 @@         command @'[Named "u" User, Named "u1" User] "utest2" $ \ctx u u1 -> do           void $ tellt ctx $ "got user: " <> showtl u <> "\nand: " <> showtl u1         command @'[L.Text, Snowflake User] "test" $ \ctx something aUser -> do-          info $ "something = " <> showt something <> ", aUser = " <> showt aUser+          info $ "something = " <> showtl something <> ", aUser = " <> showtl aUser         command @'[] "hello" $ \ctx -> do           void $ tellt ctx "heya"         group "testgroup" $ do@@ -155,11 +185,11 @@           info "sleeping"           P.embed $ threadDelay (5 * 1000 * 1000)           info "slept"-          void . invoke $ EditMessage (msg ^. #channelID) msg' (Just "lol") Nothing+          void . invoke $ EditMessage (msg ^. #channelID) msg' (editMessageContent $ Just "lol")           info "edited"         _ -> pure ()       react @('CustomEvt "command-error" (CommandContext.Context, CommandError)) $ \(ctx, e) -> do-        info $ "Command failed with reason: " <> showt e+        info $ "Command failed with reason: " <> showtl e         case e of           ParseError n r -> void . tellt ctx $ "Failed to parse parameter: `" <> L.fromStrict n <> "`, with reason: ```\n" <> r <> "```"       react @('CustomEvt "my-event" (L.Text, Message)) $ \(s, m) ->@@ -172,13 +202,20 @@ can do something along the lines of:  ``` haskell+import qualified Di+import qualified Df1+import qualified Di.Core+import qualified DiPolysemy++filterDi :: Di.Core.Di l Di.Path m -> Di.Core.Di l Di.Path m+filterDi = Di.Core.filter (\_ p _ -> Df1.Push "calamity" `notElem` p)+ Di.new $ \di -> -- ...   . runDiToIO di-  -- disable logs emitted inside calamity-  . DiPolysemy.local (Di.Core.filter (\_ _ _ -> False))-  . runBotIO -- ...-  -- re-enable logs emitted inside your bot's code-  . DiPolysemy.local (const di)+  -- disable logs emitted by calamity+  . DiPolysemy.local filterDi+  . runBotIO+  -- ... ``` 
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: e75edd6f528871c8867bbd8aa43ae458a8b7c3f45bb7b7b64456611f988244a3+-- hash: 89740b43cb19ef8c4833319daf4096283256327512903f70f9f82463297c7d07  name:           calamity-version:        0.1.28.5+version:        0.1.29.0 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@@ -138,7 +138,7 @@   build-depends:       aeson >=1.4 && <2     , async >=2.2 && <3-    , base >=4.12 && <5+    , base >=4.13 && <5     , bytestring >=0.10 && <0.12     , colour >=2.3.5 && <2.4     , concurrent-extra >=0.7 && <0.8@@ -148,7 +148,7 @@     , data-flags >=0.0.3 && <0.1     , deepseq >=1.4.4.0 && <2     , deque >=0.4 && <0.5-    , df1 >=0.3 && <0.5+    , df1 >=0.4 && <0.5     , di-core >=1.0.4 && <1.1     , di-polysemy >=0.2 && <0.3     , exceptions >=0.10 && <0.11@@ -160,13 +160,13 @@     , http-client >=0.5 && <0.8     , http-date >=0.0.8 && <0.1     , http-types >=0.12 && <0.13-    , lens >=4.18 && <5+    , lens >=4.18 && <6     , lens-aeson >=1.1 && <2     , megaparsec >=8 && <10     , mime-types >=0.1 && <0.2     , mtl >=2.2 && <3-    , polysemy >=1.3 && <2-    , polysemy-plugin >=0.2 && <0.4+    , polysemy >=1.5 && <2+    , polysemy-plugin >=0.3 && <0.4     , reflection >=2.1 && <3     , req >=3.1 && <3.10     , safe-exceptions >=0.1 && <2