packages feed

calamity 0.1.4.2 → 0.1.4.3

raw patch · 9 files changed

+182/−16 lines, 9 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Calamity.HTTP.Channel: instance Data.Default.Class.Default Calamity.HTTP.Channel.CreateChannelInviteOptions
+ Calamity.HTTP.Channel: instance Data.Default.Class.Default Calamity.HTTP.Channel.GetReactionsOptions
+ Calamity.HTTP.Channel: instance GHC.Generics.Generic Calamity.HTTP.Channel.GetReactionsOptions
+ Calamity.HTTP.Guild: instance Data.Default.Class.Default Calamity.HTTP.Guild.CreateGuildBanData
+ Calamity.HTTP.Guild: instance Data.Default.Class.Default Calamity.HTTP.Guild.ListMembersOptions
+ Calamity.HTTP.Guild: instance Data.Default.Class.Default Calamity.HTTP.Guild.ModifyGuildData
+ Calamity.HTTP.Guild: instance Data.Default.Class.Default Calamity.HTTP.Guild.ModifyGuildMemberData
+ Calamity.HTTP.Guild: instance Data.Default.Class.Default Calamity.HTTP.Guild.ModifyGuildRoleData
+ Calamity.HTTP.Invite: [DeleteInvite] :: Text -> InviteRequest ()
+ Calamity.HTTP.Invite: [GetInvite] :: Text -> InviteRequest Invite
+ Calamity.HTTP.Invite: data InviteRequest a
+ Calamity.HTTP.Invite: instance Calamity.HTTP.Internal.Request.Request (Calamity.HTTP.Invite.InviteRequest a) a
+ Calamity.HTTP.User: GetCurrentUserGuildsOptions :: Maybe (Snowflake Guild) -> Maybe (Snowflake Guild) -> Maybe Integer -> GetCurrentUserGuildsOptions
+ Calamity.HTTP.User: ModifyUserData :: Maybe Text -> Maybe Text -> ModifyUserData
+ Calamity.HTTP.User: [$sel:after:GetCurrentUserGuildsOptions] :: GetCurrentUserGuildsOptions -> Maybe (Snowflake Guild)
+ Calamity.HTTP.User: [$sel:avatar:ModifyUserData] :: ModifyUserData -> Maybe Text
+ Calamity.HTTP.User: [$sel:before:GetCurrentUserGuildsOptions] :: GetCurrentUserGuildsOptions -> Maybe (Snowflake Guild)
+ Calamity.HTTP.User: [$sel:limit:GetCurrentUserGuildsOptions] :: GetCurrentUserGuildsOptions -> Maybe Integer
+ Calamity.HTTP.User: [$sel:username:ModifyUserData] :: ModifyUserData -> Maybe Text
+ Calamity.HTTP.User: [CreateDM] :: HasID User u => u -> UserRequest DMChannel
+ Calamity.HTTP.User: [GetCurrentUserGuilds] :: GetCurrentUserGuildsOptions -> UserRequest [Partial Guild]
+ Calamity.HTTP.User: [GetCurrentUser] :: UserRequest User
+ Calamity.HTTP.User: [GetUser] :: HasID User u => u -> UserRequest User
+ Calamity.HTTP.User: [LeaveGuild] :: HasID Guild g => g -> UserRequest ()
+ Calamity.HTTP.User: [ModifyCurrentUser] :: ModifyUserData -> UserRequest User
+ Calamity.HTTP.User: data GetCurrentUserGuildsOptions
+ Calamity.HTTP.User: data ModifyUserData
+ Calamity.HTTP.User: data UserRequest a
+ Calamity.HTTP.User: instance Calamity.HTTP.Internal.Request.Request (Calamity.HTTP.User.UserRequest a) a
+ Calamity.HTTP.User: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.HTTP.User.ModifyUserData
+ Calamity.HTTP.User: instance Data.Default.Class.Default Calamity.HTTP.User.GetCurrentUserGuildsOptions
+ Calamity.HTTP.User: instance Data.Default.Class.Default Calamity.HTTP.User.ModifyUserData
+ Calamity.HTTP.User: instance GHC.Generics.Generic Calamity.HTTP.User.GetCurrentUserGuildsOptions
+ Calamity.HTTP.User: instance GHC.Generics.Generic Calamity.HTTP.User.ModifyUserData
+ Calamity.HTTP.User: instance GHC.Show.Show Calamity.HTTP.User.GetCurrentUserGuildsOptions
+ Calamity.HTTP.User: instance GHC.Show.Show Calamity.HTTP.User.ModifyUserData
+ Calamity.Types.Model.Channel.Webhook: Webhook :: Snowflake Webhook -> Integer -> Maybe (Snowflake Guild) -> Maybe (Snowflake Channel) -> Maybe (Snowflake User) -> Text -> Text -> Maybe Text -> Webhook
+ Calamity.Types.Model.Channel.Webhook: [$sel:avatar:Webhook] :: Webhook -> Text
+ Calamity.Types.Model.Channel.Webhook: [$sel:channelID:Webhook] :: Webhook -> Maybe (Snowflake Channel)
+ Calamity.Types.Model.Channel.Webhook: [$sel:guildID:Webhook] :: Webhook -> Maybe (Snowflake Guild)
+ Calamity.Types.Model.Channel.Webhook: [$sel:id:Webhook] :: Webhook -> Snowflake Webhook
+ Calamity.Types.Model.Channel.Webhook: [$sel:name:Webhook] :: Webhook -> Text
+ Calamity.Types.Model.Channel.Webhook: [$sel:token:Webhook] :: Webhook -> Maybe Text
+ Calamity.Types.Model.Channel.Webhook: [$sel:type_:Webhook] :: Webhook -> Integer
+ Calamity.Types.Model.Channel.Webhook: [$sel:user:Webhook] :: Webhook -> Maybe (Snowflake User)
+ Calamity.Types.Model.Channel.Webhook: data Webhook
+ Calamity.Types.Model.Channel.Webhook: instance Calamity.Types.Snowflake.HasID Calamity.Types.Model.Channel.Webhook.Webhook Calamity.Types.Model.Channel.Webhook.Webhook
+ Calamity.Types.Model.Channel.Webhook: instance Data.Aeson.Types.FromJSON.FromJSON Calamity.Types.Model.Channel.Webhook.Webhook
+ Calamity.Types.Model.Channel.Webhook: instance GHC.Classes.Eq Calamity.Types.Model.Channel.Webhook.Webhook
+ Calamity.Types.Model.Channel.Webhook: instance GHC.Generics.Generic Calamity.Types.Model.Channel.Webhook.Webhook
+ Calamity.Types.Model.Channel.Webhook: instance GHC.Show.Show Calamity.Types.Model.Channel.Webhook.Webhook
+ Calamity.Types.Model.Channel.Webhook: instance TextShow.Classes.TextShow Calamity.Types.Model.Channel.Webhook.Webhook
- Calamity.Cache.Eff: delDM :: forall r_a8WsO. MemberWithError CacheEff r_a8WsO => Snowflake DMChannel -> Sem r_a8WsO ()
+ Calamity.Cache.Eff: delDM :: forall r_a94Or. MemberWithError CacheEff r_a94Or => Snowflake DMChannel -> Sem r_a94Or ()
- Calamity.Cache.Eff: delGuild :: forall r_a8WsH. MemberWithError CacheEff r_a8WsH => Snowflake Guild -> Sem r_a8WsH ()
+ Calamity.Cache.Eff: delGuild :: forall r_a94Ok. MemberWithError CacheEff r_a94Ok => Snowflake Guild -> Sem r_a94Ok ()
- Calamity.Cache.Eff: delMessage :: forall r_a8Wt9. MemberWithError CacheEff r_a8Wt9 => Snowflake Message -> Sem r_a8Wt9 ()
+ Calamity.Cache.Eff: delMessage :: forall r_a94OM. MemberWithError CacheEff r_a94OM => Snowflake Message -> Sem r_a94OM ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a8Wt2. MemberWithError CacheEff r_a8Wt2 => Snowflake Guild -> Sem r_a8Wt2 ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a94OF. MemberWithError CacheEff r_a94OF => Snowflake Guild -> Sem r_a94OF ()
- Calamity.Cache.Eff: delUser :: forall r_a8WsV. MemberWithError CacheEff r_a8WsV => Snowflake User -> Sem r_a8WsV ()
+ Calamity.Cache.Eff: delUser :: forall r_a94Oy. MemberWithError CacheEff r_a94Oy => Snowflake User -> Sem r_a94Oy ()
- Calamity.Cache.Eff: getBotUser :: forall r_a8WsB. MemberWithError CacheEff r_a8WsB => Sem r_a8WsB (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a94Oe. MemberWithError CacheEff r_a94Oe => Sem r_a94Oe (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a8WsL. MemberWithError CacheEff r_a8WsL => Snowflake DMChannel -> Sem r_a8WsL (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a94Oo. MemberWithError CacheEff r_a94Oo => Snowflake DMChannel -> Sem r_a94Oo (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a8WsN. MemberWithError CacheEff r_a8WsN => Sem r_a8WsN [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a94Oq. MemberWithError CacheEff r_a94Oq => Sem r_a94Oq [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a8WsE. MemberWithError CacheEff r_a8WsE => Snowflake Guild -> Sem r_a8WsE (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a94Oh. MemberWithError CacheEff r_a94Oh => Snowflake Guild -> Sem r_a94Oh (Maybe Guild)
- Calamity.Cache.Eff: getGuilds :: forall r_a8WsG. MemberWithError CacheEff r_a8WsG => Sem r_a8WsG [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a94Oj. MemberWithError CacheEff r_a94Oj => Sem r_a94Oj [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a8Wt6. MemberWithError CacheEff r_a8Wt6 => Snowflake Message -> Sem r_a8Wt6 (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a94OJ. MemberWithError CacheEff r_a94OJ => Snowflake Message -> Sem r_a94OJ (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a8Wt8. MemberWithError CacheEff r_a8Wt8 => Sem r_a8Wt8 [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a94OL. MemberWithError CacheEff r_a94OL => Sem r_a94OL [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a8Wt1. MemberWithError CacheEff r_a8Wt1 => Sem r_a8Wt1 [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a94OE. MemberWithError CacheEff r_a94OE => Sem r_a94OE [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a8WsS. MemberWithError CacheEff r_a8WsS => Snowflake User -> Sem r_a8WsS (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a94Ov. MemberWithError CacheEff r_a94Ov => Snowflake User -> Sem r_a94Ov (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a8WsU. MemberWithError CacheEff r_a8WsU => Sem r_a8WsU [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a94Ox. MemberWithError CacheEff r_a94Ox => Sem r_a94Ox [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a8WsZ. MemberWithError CacheEff r_a8WsZ => Snowflake Guild -> Sem r_a8WsZ Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a94OC. MemberWithError CacheEff r_a94OC => Snowflake Guild -> Sem r_a94OC Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a8Wsz. MemberWithError CacheEff r_a8Wsz => User -> Sem r_a8Wsz ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a94Oc. MemberWithError CacheEff r_a94Oc => User -> Sem r_a94Oc ()
- Calamity.Cache.Eff: setDM :: forall r_a8WsJ. MemberWithError CacheEff r_a8WsJ => DMChannel -> Sem r_a8WsJ ()
+ Calamity.Cache.Eff: setDM :: forall r_a94Om. MemberWithError CacheEff r_a94Om => DMChannel -> Sem r_a94Om ()
- Calamity.Cache.Eff: setGuild :: forall r_a8WsC. MemberWithError CacheEff r_a8WsC => Guild -> Sem r_a8WsC ()
+ Calamity.Cache.Eff: setGuild :: forall r_a94Of. MemberWithError CacheEff r_a94Of => Guild -> Sem r_a94Of ()
- Calamity.Cache.Eff: setMessage :: forall r_a8Wt4. MemberWithError CacheEff r_a8Wt4 => Message -> Sem r_a8Wt4 ()
+ Calamity.Cache.Eff: setMessage :: forall r_a94OH. MemberWithError CacheEff r_a94OH => Message -> Sem r_a94OH ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a8WsX. MemberWithError CacheEff r_a8WsX => Snowflake Guild -> Sem r_a8WsX ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a94OA. MemberWithError CacheEff r_a94OA => Snowflake Guild -> Sem r_a94OA ()
- Calamity.Cache.Eff: setUser :: forall r_a8WsQ. MemberWithError CacheEff r_a8WsQ => User -> Sem r_a8WsQ ()
+ Calamity.Cache.Eff: setUser :: forall r_a94Ot. MemberWithError CacheEff r_a94Ot => User -> Sem r_a94Ot ()

Files

calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 25550840a8f69674317309aa4d238d683405902e21b6caa6045ebc08f359593d+-- hash: be510d66d49f55eee979f88e81ccd03d77fc73990d6f0cbc83c7242e64ddeec7  name:           calamity-version:        0.1.4.2+version:        0.1.4.3 synopsis:       A library for writing discord bots description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme> category:       Network, Web@@ -52,7 +52,9 @@       Calamity.HTTP.Internal.Request       Calamity.HTTP.Internal.Route       Calamity.HTTP.Internal.Types+      Calamity.HTTP.Invite       Calamity.HTTP.MiscRoutes+      Calamity.HTTP.User       Calamity.Internal.AesonThings       Calamity.Internal.BoundedStore       Calamity.Internal.SnowflakeMap@@ -76,6 +78,7 @@       Calamity.Types.Model.Channel.Guild.Voice       Calamity.Types.Model.Channel.Message       Calamity.Types.Model.Channel.Reaction+      Calamity.Types.Model.Channel.Webhook       Calamity.Types.Model.Guild       Calamity.Types.Model.Guild.Ban       Calamity.Types.Model.Guild.Emoji
src/Calamity/Client/Client.hs view
@@ -1,3 +1,5 @@+{-# OPTIONS_GHC -Wno-name-shadowing #-}+ -- | The client module Calamity.Client.Client     ( Client(..)@@ -30,7 +32,6 @@ import           Data.Dynamic import           Data.Foldable import           Data.Maybe-import           Data.Time.Clock import           Data.Time.Clock.POSIX import           Data.Traversable import qualified Data.TypeRepMap                  as TM@@ -156,7 +157,7 @@               => EventHandlers               -> DispatchData               -> P.Sem (P.Fail ': r) [P.Sem r ()]-handleEvent' eh evt@(Ready rd@ReadyData { user, guilds }) = do+handleEvent' eh evt@(Ready rd@ReadyData {}) = do   updateCache evt   pure $ map ($ rd) (unwrapEvent @"ready" eh) @@ -400,7 +401,7 @@  updateCache (GuildMemberUpdate GuildMemberUpdateData { guildID, roles, user, nick }) = do   setUser user-  updateGuild guildID (#members . at (getID user) . _Just %~ (#roles .~ roles) . (#nick .~ nick))+  updateGuild guildID (#members . ix (getID user) %~ (#roles .~ roles) . (#nick .~ nick))  updateCache (GuildMembersChunk GuildMembersChunkData { members }) =   traverse_ (updateCache . GuildMemberAdd) members@@ -439,4 +440,19 @@  updateCache (UserUpdate user) = setBotUser user -updateCache _data' = pure () -- TODO+-- we don't handle group channels currently+updateCache (ChannelCreate (GroupChannel' _)) = pure ()+updateCache (ChannelUpdate (GroupChannel' _)) = pure ()+updateCache (ChannelDelete (GroupChannel' _)) = pure ()++-- these don't modify state+updateCache (GuildBanAdd _) = pure ()+updateCache (GuildBanRemove _) = pure ()+updateCache (GuildIntegrationsUpdate _) = pure ()+updateCache (TypingStart _) = pure ()+updateCache (ChannelPinsUpdate _) = pure ()+updateCache (WebhooksUpdate _) = pure ()++-- we don't handle voice state currently+updateCache (VoiceStateUpdate _) = pure ()+updateCache (VoiceServerUpdate _) = pure ()
src/Calamity/HTTP.hs view
@@ -4,10 +4,14 @@     , module Calamity.HTTP.Channel     , module Calamity.HTTP.Emoji     , module Calamity.HTTP.Guild-    , module Calamity.HTTP.MiscRoutes ) where+    , module Calamity.HTTP.Invite+    , module Calamity.HTTP.MiscRoutes+    , module Calamity.HTTP.User ) where  import           Calamity.HTTP.Channel import           Calamity.HTTP.Emoji import           Calamity.HTTP.Guild import           Calamity.HTTP.Internal.Request ( invokeRequest )+import           Calamity.HTTP.Invite import           Calamity.HTTP.MiscRoutes+import           Calamity.HTTP.User
src/Calamity/HTTP/Channel.hs view
@@ -40,8 +40,7 @@   , permissionOverwrites :: Maybe [Overwrite]   , parentID             :: Maybe (Snowflake Channel)   }-  deriving ( Generic, Show )-  deriving anyclass ( Default )+  deriving ( Generic, Show, Default )   deriving ( ToJSON ) via CalamityJSON ChannelUpdate  data ChannelMessagesQuery@@ -65,7 +64,7 @@   , after  :: Maybe (Snowflake User)   , limit  :: Maybe Integer   }-  deriving ( Show )+  deriving ( Show, Generic, Default )  data CreateChannelInviteOptions = CreateChannelInviteOptions   { maxAge    :: Maybe Int@@ -73,7 +72,7 @@   , temporary :: Maybe Bool   , unique    :: Maybe Bool   }-  deriving ( Show, Generic )+  deriving ( Show, Generic, Default )   deriving ( ToJSON ) via CalamityJSON CreateChannelInviteOptions  data GroupDMAddRecipientOptions = GroupDMAddRecipientOptions
src/Calamity/HTTP/Guild.hs view
@@ -25,6 +25,7 @@ import           Control.Lens                   hiding ( (.=) )  import           Data.Aeson+import           Data.Default.Class import           Data.Maybe import           Data.Text                      ( Text ) @@ -61,7 +62,7 @@   , banner                      :: Maybe Text   , systemChannelID             :: Maybe (Snowflake GuildChannel)   }-  deriving ( Show, Generic )+  deriving ( Show, Generic, Default )   deriving ( ToJSON ) via CalamityJSON ModifyGuildData  data ChannelCreateData = ChannelCreateData@@ -90,7 +91,7 @@   { limit :: Maybe Integer   , after :: Maybe (Snowflake User)   }-  deriving ( Show, Generic )+  deriving ( Show, Generic, Default )  data AddGuildMemberData = AddGuildMemberData   { accessToken :: Text@@ -109,14 +110,14 @@   , deaf      :: Maybe Bool   , channelID :: Maybe (Snowflake VoiceChannel)   }-  deriving ( Show, Generic )+  deriving ( Show, Generic, Default )   deriving ( ToJSON ) via CalamityJSON ModifyGuildMemberData  data CreateGuildBanData = CreateGuildBanData   { deleteMessageDays :: Maybe Integer   , reason            :: Maybe Text   }-  deriving ( Show, Generic )+  deriving ( Show, Generic, Default )  data ModifyGuildRoleData = ModifyGuildRoleData   { name        :: Maybe Text@@ -125,7 +126,7 @@   , hoist       :: Maybe Bool   , mentionable :: Maybe Bool   }-  deriving ( Show, Generic )+  deriving ( Show, Generic, Default )   deriving ( ToJSON ) via CalamityJSON ModifyGuildRoleData  data ModifyGuildRolePositionsData = ModifyGuildRolePositionsData
+ src/Calamity/HTTP/Invite.hs view
@@ -0,0 +1,31 @@+-- | Invite endpoints+module Calamity.HTTP.Invite+    ( InviteRequest(..) ) where++import           Calamity.HTTP.Internal.Request+import           Calamity.HTTP.Internal.Route+import           Calamity.Types.Model.Guild++import           Control.Lens                   hiding ( (.=) )++import           Data.Text                      ( Text )++import           Network.Wreq++import           TextShow++data InviteRequest a where+  GetInvite    :: Text -> InviteRequest Invite+  DeleteInvite :: Text -> InviteRequest ()++baseRoute :: RouteBuilder _+baseRoute = mkRouteBuilder // S "invites"++instance Request (InviteRequest a) a where+  toRoute (GetInvite c) = baseRoute // S c+    & buildRoute+  toRoute (DeleteInvite c) = baseRoute // S c+    & buildRoute++  toAction (GetInvite _) = getWithP (param "with_counts" .~ [showt True])+  toAction (DeleteInvite _) = deleteWith
+ src/Calamity/HTTP/User.hs view
@@ -0,0 +1,78 @@+-- | User endpoints+module Calamity.HTTP.User+    ( UserRequest(..)+    , ModifyUserData(..)+    , GetCurrentUserGuildsOptions(..) ) where++import           Calamity.HTTP.Internal.Request+import           Calamity.HTTP.Internal.Route+import           Calamity.Internal.AesonThings+import           Calamity.Types.Model.Channel+import           Calamity.Types.Model.Guild+import           Calamity.Types.Model.User+import           Calamity.Types.Snowflake++import           Control.Arrow+import           Control.Lens                   hiding ( (.=) )++import           Data.Aeson+import           Data.Default.Class+import           Data.Maybe+import           Data.Text                      ( Text )++import           GHC.Generics++import           Network.Wreq++import           TextShow++data ModifyUserData = ModifyUserData+  { username :: Maybe Text+    -- | The avatar field should be in discord's image data format: https://discordapp.com/developers/docs/reference#image-data+  , avatar   :: Maybe Text+  }+  deriving ( Show, Generic, Default )+  deriving ( ToJSON ) via CalamityJSON ModifyUserData++data GetCurrentUserGuildsOptions = GetCurrentUserGuildsOptions+  { before :: Maybe (Snowflake Guild)+  , after  :: Maybe (Snowflake Guild)+  , limit  :: Maybe Integer+  }+  deriving ( Show, Generic, Default )++data UserRequest a where+  GetCurrentUser       ::                                UserRequest User+  GetUser              :: HasID User u => u ->           UserRequest User+  ModifyCurrentUser    :: ModifyUserData ->              UserRequest User+  GetCurrentUserGuilds :: GetCurrentUserGuildsOptions -> UserRequest [Partial Guild]+  LeaveGuild           :: HasID Guild g => g ->          UserRequest ()+  CreateDM             :: HasID User u => u ->           UserRequest DMChannel++baseRoute :: RouteBuilder _+baseRoute = mkRouteBuilder // S "users" // S "@me"++instance Request (UserRequest a) a where+  toRoute GetCurrentUser = baseRoute+    & buildRoute+  toRoute (GetUser (getID @User -> uid)) = mkRouteBuilder // S "users" // ID @User+    & giveID uid+    & buildRoute+  toRoute (ModifyCurrentUser _) = baseRoute+    & buildRoute+  toRoute (GetCurrentUserGuilds _) = baseRoute // S "guilds"+    & buildRoute+  toRoute (LeaveGuild (getID @Guild -> gid)) = baseRoute // S "guilds" // ID @Guild+    & giveID gid+    & buildRoute+  toRoute (CreateDM _) = baseRoute // S "channels"+    & buildRoute++  toAction GetCurrentUser = getWith+  toAction (GetUser _) = getWith+  toAction (ModifyCurrentUser o) = patchWith' (toJSON o)+  toAction (GetCurrentUserGuilds GetCurrentUserGuildsOptions { before, after, limit }) = getWithP+    (param "before" .~ maybeToList (showt <$> before) >>> param "after" .~ maybeToList (showt <$> after) >>> param+     "limit" .~ maybeToList (showt <$> limit))+  toAction (LeaveGuild _) = deleteWith+  toAction (CreateDM (getID @User -> uid)) = postWith' (object ["recipient_id" .= uid])
src/Calamity/Types/Model/Channel.hs view
@@ -7,6 +7,7 @@     , module Calamity.Types.Model.Channel.Guild     , module Calamity.Types.Model.Channel.Attachment     , module Calamity.Types.Model.Channel.Reaction+    , module Calamity.Types.Model.Channel.Webhook     , module Calamity.Types.Model.Channel.Embed     , module Calamity.Types.Model.Channel.ChannelType     , module Calamity.Types.Model.Channel.Message ) where@@ -20,6 +21,7 @@ import           Calamity.Types.Model.Channel.Guild import {-# SOURCE #-} Calamity.Types.Model.Channel.Message hiding ( UpdatedMessage ) import           Calamity.Types.Model.Channel.Reaction+import           Calamity.Types.Model.Channel.Webhook import           Calamity.Types.Partial import           Calamity.Types.Snowflake 
+ src/Calamity/Types/Model/Channel/Webhook.hs view
@@ -0,0 +1,32 @@+-- | Channel webhooks+module Calamity.Types.Model.Channel.Webhook+    ( Webhook(..) ) where++import           Calamity.Internal.AesonThings+import {-# SOURCE #-} Calamity.Types.Model.Channel+import {-# SOURCE #-} Calamity.Types.Model.Guild.Guild+import           Calamity.Types.Model.User+import           Calamity.Types.Snowflake++import           Data.Aeson+import           Data.Text.Lazy                       ( Text )++import           GHC.Generics++import           TextShow+import qualified TextShow.Generic                     as TSG++data Webhook = Webhook+  { id        :: Snowflake Webhook+  , type_     :: Integer+  , guildID   :: Maybe (Snowflake Guild)+  , channelID :: Maybe (Snowflake Channel)+  , user      :: Maybe (Snowflake User)+  , name      :: Text+  , avatar    :: Text+  , token     :: Maybe Text+  }+  deriving ( Eq, Show, Generic )+  deriving ( TextShow ) via TSG.FromGeneric Webhook+  deriving ( FromJSON ) via WithSpecialCases '["user" `ExtractField` "id"] Webhook+  deriving ( HasID Webhook ) via HasIDField "id" Webhook