packages feed

calamity 0.1.21.0 → 0.1.22.0

raw patch · 14 files changed

+158/−120 lines, 14 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Calamity.Gateway.Intents: defaultIntents :: Intents
+ Calamity.Gateway.Intents: instance Data.Default.Class.Default Calamity.Gateway.Intents.Intents
+ Calamity.Types.Model.Channel.Message: ChannelFollowAdd :: MessageType
+ Calamity.Types.Model.Channel.Message: GuildDiscoveryDisqualified :: MessageType
+ Calamity.Types.Model.Channel.Message: GuildDiscoveryRequalified :: MessageType
+ Calamity.Types.Model.Channel.Message: UserPremiumGuildSubscription :: MessageType
+ Calamity.Types.Model.Channel.Message: UserPremiumGuildSubscriptionTier1 :: MessageType
+ Calamity.Types.Model.Channel.Message: UserPremiumGuildSubscriptionTier2 :: MessageType
+ Calamity.Types.Model.Channel.Message: UserPremiumGuildSubscriptionTier3 :: MessageType
- Calamity.Cache.Eff: delDM :: forall r_a9AtF. MemberWithError CacheEff r_a9AtF => Snowflake DMChannel -> Sem r_a9AtF ()
+ Calamity.Cache.Eff: delDM :: forall r_a9hxq. MemberWithError CacheEff r_a9hxq => Snowflake DMChannel -> Sem r_a9hxq ()
- Calamity.Cache.Eff: delGuild :: forall r_a9Aty. MemberWithError CacheEff r_a9Aty => Snowflake Guild -> Sem r_a9Aty ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9hxj. MemberWithError CacheEff r_a9hxj => Snowflake Guild -> Sem r_a9hxj ()
- Calamity.Cache.Eff: delMessage :: forall r_a9Au0. MemberWithError CacheEff r_a9Au0 => Snowflake Message -> Sem r_a9Au0 ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9hxL. MemberWithError CacheEff r_a9hxL => Snowflake Message -> Sem r_a9hxL ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9AtT. MemberWithError CacheEff r_a9AtT => Snowflake Guild -> Sem r_a9AtT ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9hxE. MemberWithError CacheEff r_a9hxE => Snowflake Guild -> Sem r_a9hxE ()
- Calamity.Cache.Eff: delUser :: forall r_a9AtM. MemberWithError CacheEff r_a9AtM => Snowflake User -> Sem r_a9AtM ()
+ Calamity.Cache.Eff: delUser :: forall r_a9hxx. MemberWithError CacheEff r_a9hxx => Snowflake User -> Sem r_a9hxx ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9Atq. MemberWithError CacheEff r_a9Atq => Sem r_a9Atq (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9hxb. MemberWithError CacheEff r_a9hxb => Sem r_a9hxb (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9AtC. MemberWithError CacheEff r_a9AtC => Snowflake DMChannel -> Sem r_a9AtC (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9hxn. MemberWithError CacheEff r_a9hxn => Snowflake DMChannel -> Sem r_a9hxn (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9AtE. MemberWithError CacheEff r_a9AtE => Sem r_a9AtE [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9hxp. MemberWithError CacheEff r_a9hxp => Sem r_a9hxp [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9Att. MemberWithError CacheEff r_a9Att => Snowflake Guild -> Sem r_a9Att (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9hxe. MemberWithError CacheEff r_a9hxe => Snowflake Guild -> Sem r_a9hxe (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_a9Atv. MemberWithError CacheEff r_a9Atv => Snowflake GuildChannel -> Sem r_a9Atv (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9hxg. MemberWithError CacheEff r_a9hxg => Snowflake GuildChannel -> Sem r_a9hxg (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_a9Atx. MemberWithError CacheEff r_a9Atx => Sem r_a9Atx [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9hxi. MemberWithError CacheEff r_a9hxi => Sem r_a9hxi [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9AtX. MemberWithError CacheEff r_a9AtX => Snowflake Message -> Sem r_a9AtX (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9hxI. MemberWithError CacheEff r_a9hxI => Snowflake Message -> Sem r_a9hxI (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9AtZ. MemberWithError CacheEff r_a9AtZ => Sem r_a9AtZ [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9hxK. MemberWithError CacheEff r_a9hxK => Sem r_a9hxK [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9AtS. MemberWithError CacheEff r_a9AtS => Sem r_a9AtS [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9hxD. MemberWithError CacheEff r_a9hxD => Sem r_a9hxD [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9AtJ. MemberWithError CacheEff r_a9AtJ => Snowflake User -> Sem r_a9AtJ (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9hxu. MemberWithError CacheEff r_a9hxu => Snowflake User -> Sem r_a9hxu (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9AtL. MemberWithError CacheEff r_a9AtL => Sem r_a9AtL [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9hxw. MemberWithError CacheEff r_a9hxw => Sem r_a9hxw [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9AtQ. MemberWithError CacheEff r_a9AtQ => Snowflake Guild -> Sem r_a9AtQ Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9hxB. MemberWithError CacheEff r_a9hxB => Snowflake Guild -> Sem r_a9hxB Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9Ato. MemberWithError CacheEff r_a9Ato => User -> Sem r_a9Ato ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9hx9. MemberWithError CacheEff r_a9hx9 => User -> Sem r_a9hx9 ()
- Calamity.Cache.Eff: setDM :: forall r_a9AtA. MemberWithError CacheEff r_a9AtA => DMChannel -> Sem r_a9AtA ()
+ Calamity.Cache.Eff: setDM :: forall r_a9hxl. MemberWithError CacheEff r_a9hxl => DMChannel -> Sem r_a9hxl ()
- Calamity.Cache.Eff: setGuild :: forall r_a9Atr. MemberWithError CacheEff r_a9Atr => Guild -> Sem r_a9Atr ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9hxc. MemberWithError CacheEff r_a9hxc => Guild -> Sem r_a9hxc ()
- Calamity.Cache.Eff: setMessage :: forall r_a9AtV. MemberWithError CacheEff r_a9AtV => Message -> Sem r_a9AtV ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9hxG. MemberWithError CacheEff r_a9hxG => Message -> Sem r_a9hxG ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9AtO. MemberWithError CacheEff r_a9AtO => Snowflake Guild -> Sem r_a9AtO ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9hxz. MemberWithError CacheEff r_a9hxz => Snowflake Guild -> Sem r_a9hxz ()
- Calamity.Cache.Eff: setUser :: forall r_a9AtH. MemberWithError CacheEff r_a9AtH => User -> Sem r_a9AtH ()
+ Calamity.Cache.Eff: setUser :: forall r_a9hxs. MemberWithError CacheEff r_a9hxs => User -> Sem r_a9hxs ()
- Calamity.Client.Client: runBotIO :: forall r a. (Members '[Embed IO, Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r)) => Token -> 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 -> 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 -> Maybe Session -> Maybe StatusUpdateData -> Maybe 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 Session -> Maybe StatusUpdateData -> Sem (SetupEff r) a -> Sem r (Maybe StartupError)
- Calamity.Client.ShardManager: shardBot :: BotC r => Maybe StatusUpdateData -> Maybe Intents -> Sem r (Either StartupError ())
+ Calamity.Client.ShardManager: shardBot :: BotC r => Maybe StatusUpdateData -> Intents -> Sem r (Either StartupError ())
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a7cbx. MemberWithError ParsePrefix r_a7cbx => Message -> Sem r_a7cbx (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a6UjU. MemberWithError ParsePrefix r_a6UjU => Message -> Sem r_a6UjU (Maybe (Text, Text))
- Calamity.Gateway.DispatchEvents: MessageCreate :: Message -> DispatchData
+ Calamity.Gateway.DispatchEvents: MessageCreate :: Message -> Maybe User -> DispatchData
- Calamity.Gateway.Shard: Shard :: Int -> Int -> Text -> InChan CalamityEvent -> OutChan ControlMessage -> IORef ShardState -> Text -> Maybe StatusUpdateData -> Maybe Intents -> Shard
+ Calamity.Gateway.Shard: Shard :: Int -> Int -> Text -> InChan CalamityEvent -> OutChan ControlMessage -> IORef ShardState -> Text -> Maybe StatusUpdateData -> Intents -> Shard
- Calamity.Gateway.Shard: [$sel:intents:Shard] :: Shard -> Maybe Intents
+ Calamity.Gateway.Shard: [$sel:intents:Shard] :: Shard -> Intents
- Calamity.Gateway.Shard: newShard :: Members '[LogEff, MetricEff, Embed IO, Final IO, Async] r => Text -> Int -> Int -> Token -> Maybe StatusUpdateData -> Maybe Intents -> InChan CalamityEvent -> Sem r (InChan ControlMessage, Async (Maybe ()))
+ Calamity.Gateway.Shard: newShard :: Members '[LogEff, MetricEff, Embed IO, Final IO, Async] r => Text -> Int -> Int -> Token -> Maybe StatusUpdateData -> Intents -> InChan CalamityEvent -> Sem r (InChan ControlMessage, Async (Maybe ()))
- Calamity.Gateway.Types: IdentifyData :: Text -> IdentifyProps -> Bool -> Int -> (Int, Int) -> Maybe StatusUpdateData -> Maybe Intents -> IdentifyData
+ Calamity.Gateway.Types: IdentifyData :: Text -> IdentifyProps -> Bool -> Int -> (Int, Int) -> Maybe StatusUpdateData -> Intents -> IdentifyData
- Calamity.Gateway.Types: Shard :: Int -> Int -> Text -> InChan CalamityEvent -> OutChan ControlMessage -> IORef ShardState -> Text -> Maybe StatusUpdateData -> Maybe Intents -> Shard
+ Calamity.Gateway.Types: Shard :: Int -> Int -> Text -> InChan CalamityEvent -> OutChan ControlMessage -> IORef ShardState -> Text -> Maybe StatusUpdateData -> Intents -> Shard
- Calamity.Gateway.Types: [$sel:intents:IdentifyData] :: IdentifyData -> Maybe Intents
+ Calamity.Gateway.Types: [$sel:intents:IdentifyData] :: IdentifyData -> Intents
- Calamity.Gateway.Types: [$sel:intents:Shard] :: Shard -> Maybe Intents
+ Calamity.Gateway.Types: [$sel:intents:Shard] :: Shard -> Intents
- Calamity.Internal.LocalWriter: llisten :: forall o_aEJY r_aEZY a_XEJY. MemberWithError (LocalWriter o_aEJY) r_aEZY => Sem r_aEZY a_XEJY -> Sem r_aEZY (o_aEJY, a_XEJY)
+ Calamity.Internal.LocalWriter: llisten :: forall o_arjZ r_arrw a_XrjZ. MemberWithError (LocalWriter o_arjZ) r_arrw => Sem r_arrw a_XrjZ -> Sem r_arrw (o_arjZ, a_XrjZ)
- Calamity.Internal.LocalWriter: ltell :: forall o_aEJU r_aEZW. MemberWithError (LocalWriter o_aEJU) r_aEZW => o_aEJU -> Sem r_aEZW ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_arjV r_arru. MemberWithError (LocalWriter o_arjV) r_arru => o_arjV -> Sem r_arru ()
- Calamity.Metrics.Eff: addCounter :: forall r_aKKx. MemberWithError MetricEff r_aKKx => Int -> Counter -> Sem r_aKKx Int
+ Calamity.Metrics.Eff: addCounter :: forall r_auWH. MemberWithError MetricEff r_auWH => Int -> Counter -> Sem r_auWH Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_aKKA. MemberWithError MetricEff r_aKKA => (Double -> Double) -> Gauge -> Sem r_aKKA Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_auWK. MemberWithError MetricEff r_auWK => (Double -> Double) -> Gauge -> Sem r_auWK Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_aKKD. MemberWithError MetricEff r_aKKD => Double -> Histogram -> Sem r_aKKD HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_auWN. MemberWithError MetricEff r_auWN => Double -> Histogram -> Sem r_auWN HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_aKKn. MemberWithError MetricEff r_aKKn => Text -> [(Text, Text)] -> Sem r_aKKn Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_auWx. MemberWithError MetricEff r_auWx => Text -> [(Text, Text)] -> Sem r_auWx Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_aKKq. MemberWithError MetricEff r_aKKq => Text -> [(Text, Text)] -> Sem r_aKKq Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_auWA. MemberWithError MetricEff r_auWA => Text -> [(Text, Text)] -> Sem r_auWA Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_aKKt. MemberWithError MetricEff r_aKKt => Text -> [(Text, Text)] -> [Double] -> Sem r_aKKt Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_auWD. MemberWithError MetricEff r_auWD => Text -> [(Text, Text)] -> [Double] -> Sem r_auWD Histogram
- Calamity.Types.Model.Guild.Overwrite: Overwrite :: Snowflake Overwrite -> Text -> Permissions -> Permissions -> Overwrite
+ Calamity.Types.Model.Guild.Overwrite: Overwrite :: Snowflake Overwrite -> Int -> Permissions -> Permissions -> Overwrite
- Calamity.Types.Model.Guild.Overwrite: [$sel:type_:Overwrite] :: Overwrite -> Text
+ Calamity.Types.Model.Guild.Overwrite: [$sel:type_:Overwrite] :: Overwrite -> Int

Files

ChangeLog.md view
@@ -1,8 +1,18 @@ # Changelog for Calamity +## 0.1.22.0++* Update to gateway/http endpoint v8.+* Updated the message types.+* Added `defaultIntents`, which is all but the privileged intents, also a+  Data.Default instance.+* `runBotIO` and `runBotIO'` now always take an `Intents` parameter.+* Users are cached from messages, as well as member create events.+* Fix `Overwrite`s having an incorrect `type_` field.+ ## 0.1.21.0 -- Fix ToJSON instance for `RawEmoji`+* Fix ToJSON instance for `RawEmoji`  ## 0.1.20.1 
README.md view
@@ -110,7 +110,7 @@   token <- view packed <$> getEnv "BOT_TOKEN"   Di.new $ \di ->     void . P.runFinal . P.embedToFinal . DiP.runDiToIO di . runCounterAtomic . runCacheInMemory . runMetricsNoop . useConstantPrefix "!"-      $ runBotIO (BotToken token) $ do+      $ runBotIO (BotToken token) defaultIntents $ do       addCommands $ do         helpCommand         command @'[User] "utest" $ \ctx u -> do
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 5fa37b5c8ac352c7170a1e67f6f1c722b1e1e041e5f49cd19058014ae1b1caf4+-- hash: b3783e8d7e7db062a2aa10f4642564dea368efe4f9130957aaa0259e2f96e54e  name:           calamity-version:        0.1.21.0+version:        0.1.22.0 synopsis:       A library for writing discord bots in haskell description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme> category:       Network, Web
src/Calamity/Client/Client.hs view
@@ -102,9 +102,11 @@ runBotIO :: forall r a.          (P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r))          => Token+         -> Intents+         -- ^ The intents the bot should use          -> P.Sem (SetupEff r) a          -> P.Sem r (Maybe StartupError)-runBotIO token setup = runBotIO' token Nothing Nothing Nothing setup+runBotIO token intents setup = runBotIO' token intents Nothing Nothing setup  resetDi :: BotC r => P.Sem r a -> P.Sem r a resetDi m = do@@ -117,15 +119,15 @@ runBotIO' :: forall r a.           (P.Members '[P.Embed IO, P.Final IO, CacheEff, MetricEff, LogEff] r, Typeable (SetupEff r))           => Token+          -> Intents+          -- ^ The intents the bot should use           -> Maybe Session           -- ^ The HTTP session to use, defaults to 'newAPISession'           -> Maybe StatusUpdateData           -- ^ The initial status to send to the gateway-          -> Maybe Intents-          -- ^ The intents to send to the gateway           -> P.Sem (SetupEff r) a           -> P.Sem r (Maybe StartupError)-runBotIO' token session status intents setup = do+runBotIO' token intents session status setup = do   initialDi <- Di.fetch   session' <- maybe (P.embed newAPISession) pure session   client <- P.embed $ newClient token session' initialDi@@ -517,7 +519,7 @@ handleEvent' eh (InviteDelete d) = do   pure $ map ($ d) (getEventHandlers @'InviteDeleteEvt eh) -handleEvent' eh evt@(MessageCreate msg) = do+handleEvent' eh evt@(MessageCreate msg _) = do   updateCache evt   pure $ map ($ msg) (getEventHandlers @'MessageCreateEvt eh) @@ -675,7 +677,9 @@ updateCache (GuildRoleDelete GuildRoleDeleteData { guildID, roleID }) =   updateGuild guildID (#roles %~ sans roleID) -updateCache (MessageCreate msg) = setMessage msg+updateCache (MessageCreate msg user) = do+  setMessage msg+  forM_ user setUser  updateCache (MessageUpdate msg) =   updateMessage (getID msg) (update msg)
src/Calamity/Client/ShardManager.hs view
@@ -26,7 +26,7 @@ mapLeft _ (Right b) = Right b  -- | Connects the bot to the gateway over n shards-shardBot :: BotC r => Maybe StatusUpdateData -> Maybe Intents -> Sem r (Either StartupError ())+shardBot :: BotC r => Maybe StatusUpdateData -> Intents -> Sem r (Either StartupError ()) shardBot initialStatus intents = (mapLeft StartupError <$>) . P.runFail $ do   numShardsVar <- P.asks numShards   shardsVar <- P.asks shards@@ -50,24 +50,3 @@    P.embed . atomically $ writeTVar shardsVar shards --- | Connects the bot to the gateway over 1 shard (userbot)--- shardUserBot :: BotM ()--- shardUserBot = do---   numShardsVar <- asks numShards---   shardsVar <- asks shards----   hasShards <- liftIO $ (not . null) <$> readTVarIO shardsVar---   when hasShards $ fail "don't use shardUserBot on an already running bot."----   token <- asks Calamity.Client.Types.token---   eventQueue <- asks eventQueue---   logEnv <- askLog----   gateway <- aa <$> invoke GetGateway----   let host = gateway ^. #url---   liftIO $ putMVar numShardsVar 1----   liftIO $ do---     shard <- newShard host 0 1 token logEnv eventQueue---     atomically $ writeTVar shardsVar [shard]
src/Calamity/Gateway/DispatchEvents.hs view
@@ -59,7 +59,7 @@   | GuildRoleDelete GuildRoleDeleteData   | InviteCreate InviteCreateData   | InviteDelete InviteDeleteData-  | MessageCreate Message+  | MessageCreate Message (Maybe User)   | MessageUpdate UpdatedMessage   | MessageDelete MessageDeleteData   | MessageDeleteBulk MessageDeleteBulkData
src/Calamity/Gateway/Intents.hs view
@@ -4,6 +4,7 @@ -- | Discord gateway intents module Calamity.Gateway.Intents     ( Intents(..)+    , defaultIntents     , intentGuilds     , intentGuildMembers     , intentGuildBans@@ -22,9 +23,10 @@  import           Data.Aeson    ( ToJSON ) import           Data.Bits-import           Data.Flags    ()+import           Data.Flags    (allBut, (.+.)) import           Data.Flags.TH import           Data.Word+import           Data.Default.Class  $(bitmaskWrapper "Intents" ''Word32 []    [ ("intentGuilds", 1 `shiftL` 0)@@ -44,3 +46,11 @@    , ("intentDirectMessageTyping", 1 `shiftL` 14)])  deriving via Word32 instance ToJSON Intents++-- | Default intents are all but the privileged intents: members and intents+defaultIntents :: Intents+defaultIntents = allBut (intentGuildMembers .+. intentGuildPresences)++-- | Default intents are all but the privileged intents: members and intents+instance Default Intents where+  def = defaultIntents
src/Calamity/Gateway/Shard.hs view
@@ -69,7 +69,7 @@          -> Int          -> Token          -> Maybe StatusUpdateData-         -> Maybe Intents+         -> Intents          -> UC.InChan CalamityEvent          -> Sem r (UC.InChan ControlMessage, Async (Maybe ())) newShard gateway id count token presence intents evtIn = do@@ -163,7 +163,7 @@     let host' =  fromMaybe host $ L.stripPrefix "wss://" host     info $ "starting up shard "+| (shard ^. #shardID) |+" of "+| (shard ^. #shardCount) |+"" -    innerLoopVal <- runWebsocket host' "/?v=6&encoding=json" innerloop+    innerLoopVal <- runWebsocket host' "/?v=8&encoding=json" innerloop      case innerLoopVal of       Just ShardFlowShutDown -> do
src/Calamity/Gateway/Types.hs view
@@ -44,6 +44,10 @@ import qualified Polysemy.AtomicState             as P import qualified TextShow.Generic as TSG import TextShow (TextShow)+import Control.Lens.Operators ((^?))+import Data.Aeson.Types (parseMaybe)+import Control.Lens (Ixed(ix))+import Data.Aeson.Lens  type ShardC r = (P.Members '[LogEff, P.AtomicState ShardState, P.Embed IO, P.Final IO,   P.Async, MetricEff] r)@@ -109,7 +113,10 @@ parseDispatchData GUILD_ROLE_DELETE data'           = GuildRoleDelete <$> parseJSON data' parseDispatchData INVITE_CREATE data'               = InviteCreate <$> parseJSON data' parseDispatchData INVITE_DELETE data'               = InviteDelete <$> parseJSON data'-parseDispatchData MESSAGE_CREATE data'              = MessageCreate <$> parseJSON data'+parseDispatchData MESSAGE_CREATE data'              = do+  message <- parseJSON data'+  let user = parseMaybe parseJSON =<< (data' ^? _Object . ix "author")+  pure $ MessageCreate message user parseDispatchData MESSAGE_UPDATE data'              = MessageUpdate <$> parseJSON data' parseDispatchData MESSAGE_DELETE data'              = MessageDelete <$> parseJSON data' parseDispatchData MESSAGE_DELETE_BULK data'         = MessageDeleteBulk <$> parseJSON data'@@ -205,7 +212,7 @@   , largeThreshold :: Int   , shard          :: (Int, Int)   , presence       :: Maybe StatusUpdateData-  , intents        :: Maybe Intents+  , intents        :: Intents   }   deriving ( Show, Generic )   deriving ToJSON via CalamityJSON IdentifyData@@ -268,7 +275,7 @@   , shardState    :: IORef ShardState   , token         :: Text   , initialStatus :: Maybe StatusUpdateData-  , intents       :: Maybe Intents+  , intents       :: Intents   }   deriving ( Generic ) 
src/Calamity/HTTP/Internal/Route.hs view
@@ -125,7 +125,7 @@   hashWithSalt s (Route _ ident c g) = hashWithSalt s (ident, c, g)  baseURL :: Text-baseURL = "https://discord.com/api/v7"+baseURL = "https://discord.com/api/v8"  buildRoute   :: forall (ids :: [(Type, RouteRequirement)])
src/Calamity/Types/Model/Channel/Message.hs view
@@ -65,6 +65,13 @@   | ChannelIconChange   | ChannelPinnedMessage   | GuildMemberJoin+  | UserPremiumGuildSubscription+  | UserPremiumGuildSubscriptionTier1+  | UserPremiumGuildSubscriptionTier2+  | UserPremiumGuildSubscriptionTier3+  | ChannelFollowAdd+  | GuildDiscoveryDisqualified+  | GuildDiscoveryRequalified   deriving ( Eq, Show, Enum, Generic )   deriving ( TextShow ) via TSG.FromGeneric MessageType @@ -79,5 +86,12 @@       5 -> pure ChannelIconChange       6 -> pure ChannelPinnedMessage       7 -> pure GuildMemberJoin+      8 -> pure UserPremiumGuildSubscription+      9 -> pure UserPremiumGuildSubscriptionTier1+      10 -> pure UserPremiumGuildSubscriptionTier2+      11 -> pure UserPremiumGuildSubscriptionTier3+      12 -> pure ChannelFollowAdd+      13 -> pure GuildDiscoveryDisqualified+      14 -> pure GuildDiscoveryRequalified       _ -> fail $ "Invalid MessageType: " <> show n     Nothing -> fail $ "Invalid MessageType: " <> show n
src/Calamity/Types/Model/Guild/Overwrite.hs view
@@ -7,7 +7,6 @@ import           Calamity.Types.Snowflake  import           Data.Aeson-import           Data.Text.Lazy                         ( Text )  import           GHC.Generics @@ -16,7 +15,7 @@  data Overwrite = Overwrite   { id    :: Snowflake Overwrite-  , type_ :: Text+  , type_ :: Int   , allow :: Permissions   , deny  :: Permissions   }
src/Calamity/Types/Model/Guild/Permissions.hs view
@@ -1,83 +1,98 @@-{-# LANGUAGE NoDeriveAnyClass #-} {-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE NoDeriveAnyClass #-}  -- | Guild permissions module Calamity.Types.Model.Guild.Permissions-    ( Permissions(..)-    , createInstantInvite-    , kickMembers-    , banMembers-    , administrator-    , manageChannels-    , manageGuild-    , addReactions-    , viewAuditLog-    , prioritySpeaker-    , stream-    , viewChannel-    , sendMessages-    , sendTtsMessages-    , manageMessages-    , embedLinks-    , attachFiles-    , readMessageHistory-    , mentionEveryone-    , useExternalEmojis-    , viewGuildInsights-    , connect-    , speak-    , muteMembers-    , deafenMembers-    , moveMembers-    , useVad-    , changeNickname-    , manageNicknames-    , manageRoles-    , manageWebhooks-    , manageEmojis ) where--import           Data.Aeson    ( FromJSON, ToJSON )-import           Data.Flags    ()-import           Data.Flags.TH-import           Data.Word+  ( Permissions (..),+    createInstantInvite,+    kickMembers,+    banMembers,+    administrator,+    manageChannels,+    manageGuild,+    addReactions,+    viewAuditLog,+    prioritySpeaker,+    stream,+    viewChannel,+    sendMessages,+    sendTtsMessages,+    manageMessages,+    embedLinks,+    attachFiles,+    readMessageHistory,+    mentionEveryone,+    useExternalEmojis,+    viewGuildInsights,+    connect,+    speak,+    muteMembers,+    deafenMembers,+    moveMembers,+    useVad,+    changeNickname,+    manageNicknames,+    manageRoles,+    manageWebhooks,+    manageEmojis,+  )+where -import           TextShow+import Data.Aeson (FromJSON (..), ToJSON (..))+import Data.Aeson.Types (parseFail)+import Data.Flags ()+import Data.Flags.TH+import Data.Text.Read (decimal)+import Data.Word+import TextShow -$(bitmaskWrapper "Permissions" ''Word64 []-  [ ("createInstantInvite", 0x00000001)-  , ("kickMembers", 0x00000002)-  , ("banMembers", 0x00000004)-  , ("administrator", 0x00000008)-  , ("manageChannels", 0x00000010)-  , ("manageGuild", 0x00000020)-  , ("addReactions", 0x00000040)-  , ("viewAuditLog", 0x00000080)-  , ("prioritySpeaker", 0x00000100)-  , ("stream", 0x00000200)-  , ("viewChannel", 0x00000400)-  , ("sendMessages", 0x00000800)-  , ("sendTtsMessages", 0x00001000)-  , ("manageMessages", 0x00002000)-  , ("embedLinks", 0x00004000)-  , ("attachFiles", 0x00008000)-  , ("readMessageHistory", 0x00010000)-  , ("mentionEveryone", 0x00020000)-  , ("useExternalEmojis", 0x00040000)-  , ("viewGuildInsights", 0x00080000)-  , ("connect", 0x00100000)-  , ("speak", 0x00200000)-  , ("muteMembers", 0x00400000)-  , ("deafenMembers", 0x00800000)-  , ("moveMembers", 0x01000000)-  , ("useVad", 0x02000000)-  , ("changeNickname", 0x04000000)-  , ("manageNicknames", 0x08000000)-  , ("manageRoles", 0x10000000)-  , ("manageWebhooks", 0x20000000)-  , ("manageEmojis", 0x4000000)])+$( bitmaskWrapper+     "Permissions"+     ''Word64+     []+     [ ("createInstantInvite", 0x00000001),+       ("kickMembers", 0x00000002),+       ("banMembers", 0x00000004),+       ("administrator", 0x00000008),+       ("manageChannels", 0x00000010),+       ("manageGuild", 0x00000020),+       ("addReactions", 0x00000040),+       ("viewAuditLog", 0x00000080),+       ("prioritySpeaker", 0x00000100),+       ("stream", 0x00000200),+       ("viewChannel", 0x00000400),+       ("sendMessages", 0x00000800),+       ("sendTtsMessages", 0x00001000),+       ("manageMessages", 0x00002000),+       ("embedLinks", 0x00004000),+       ("attachFiles", 0x00008000),+       ("readMessageHistory", 0x00010000),+       ("mentionEveryone", 0x00020000),+       ("useExternalEmojis", 0x00040000),+       ("viewGuildInsights", 0x00080000),+       ("connect", 0x00100000),+       ("speak", 0x00200000),+       ("muteMembers", 0x00400000),+       ("deafenMembers", 0x00800000),+       ("moveMembers", 0x01000000),+       ("useVad", 0x02000000),+       ("changeNickname", 0x04000000),+       ("manageNicknames", 0x08000000),+       ("manageRoles", 0x10000000),+       ("manageWebhooks", 0x20000000),+       ("manageEmojis", 0x4000000)+     ]+ ) -deriving via Word64 instance ToJSON Permissions+instance ToJSON Permissions where+  toJSON = toJSON . showt+  toEncoding = toEncoding . showt -deriving via Word64 instance FromJSON Permissions+instance FromJSON Permissions where+  parseJSON a = do+    asText <- parseJSON a+    case decimal asText of+      Right (n, _) -> pure $ Permissions n+      Left e -> parseFail e  deriving via FromStringShow Permissions instance TextShow Permissions
src/Calamity/Utils/Permissions.hs view
@@ -58,6 +58,11 @@ -- | Things that 'Member's have 'Permissions' in class PermissionsIn a where   -- | Calculate a 'Member'\'s 'Permissions' in something+  --+  -- If permissions could not be calculated because something couldn't be found+  -- in the cache, this will return an empty set of permissions. Use+  -- 'permissionsIn'' if you want to handle cases where something might not exist+  -- in cache.   permissionsIn :: a -> Member -> Permissions  -- | A 'Member'\'s 'Permissions' in a channel are their roles and overwrites@@ -71,11 +76,6 @@ -- | A variant of 'PermissionsIn' that will use the cache/http. class PermissionsIn' a where   -- | Calculate the permissions of something that has a 'User' id-  ---  -- If permissions could not be calculated because something couldn't be found-  -- in the cache, this will return an empty set of permissions. Use-  -- 'permissionsIn' if you want to handle cases where something might not exist-  -- in cache.   permissionsIn' :: (BotC r, HasID User u) => a -> u -> P.Sem r Permissions  -- | A 'User''s 'Permissions' in a channel are their roles and overwrites