discord-haskell 1.16.0 → 1.16.1
raw patch · 9 files changed
+85/−14 lines, 9 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Discord.Internal.Rest.Channel: AfterReaction :: MessageId -> ReactionTiming
- Discord.Internal.Rest.Channel: BeforeReaction :: MessageId -> ReactionTiming
- Discord.Internal.Rest.Channel: LatestReaction :: ReactionTiming
+ Discord.Internal.Rest.Channel: AfterUser :: UserId -> ReactionTiming
+ Discord.Internal.Rest.Channel: FirstUsers :: ReactionTiming
+ Discord.Internal.Rest.Channel: instance Data.Default.Class.Default Discord.Internal.Rest.Channel.StartThreadOpts
+ Discord.Internal.Rest.Guild: ListActiveThreads :: [Channel] -> [ThreadMember] -> ListActiveThreads
+ Discord.Internal.Rest.Guild: [ListActiveGuildThreads] :: GuildId -> GuildRequest ListActiveThreads
+ Discord.Internal.Rest.Guild: [listActiveThreadsMembers] :: ListActiveThreads -> [ThreadMember]
+ Discord.Internal.Rest.Guild: [listActiveThreadsThreads] :: ListActiveThreads -> [Channel]
+ Discord.Internal.Rest.Guild: data ListActiveThreads
+ Discord.Internal.Rest.Guild: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Rest.Guild.ListActiveThreads
+ Discord.Internal.Rest.Guild: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Rest.Guild.ListActiveThreads
+ Discord.Internal.Rest.Guild: instance GHC.Classes.Eq Discord.Internal.Rest.Guild.ListActiveThreads
+ Discord.Internal.Rest.Guild: instance GHC.Classes.Ord Discord.Internal.Rest.Guild.ListActiveThreads
+ Discord.Internal.Rest.Guild: instance GHC.Read.Read Discord.Internal.Rest.Guild.ListActiveThreads
+ Discord.Internal.Rest.Guild: instance GHC.Show.Show Discord.Internal.Rest.Guild.ListActiveThreads
+ Discord.Internal.Types.Channel: ThreadMemberUpdateFields :: Maybe ChannelId -> Maybe UserId -> UTCTime -> Integer -> GuildId -> ThreadMemberUpdateFields
+ Discord.Internal.Types.Channel: [threadMemberUpdateFieldsFlags] :: ThreadMemberUpdateFields -> Integer
+ Discord.Internal.Types.Channel: [threadMemberUpdateFieldsGuildId] :: ThreadMemberUpdateFields -> GuildId
+ Discord.Internal.Types.Channel: [threadMemberUpdateFieldsJoinTime] :: ThreadMemberUpdateFields -> UTCTime
+ Discord.Internal.Types.Channel: [threadMemberUpdateFieldsThreadId] :: ThreadMemberUpdateFields -> Maybe ChannelId
+ Discord.Internal.Types.Channel: [threadMemberUpdateFieldsUserId] :: ThreadMemberUpdateFields -> Maybe UserId
+ Discord.Internal.Types.Channel: data ThreadMemberUpdateFields
+ Discord.Internal.Types.Channel: instance Data.Aeson.Types.FromJSON.FromJSON Discord.Internal.Types.Channel.ThreadMemberUpdateFields
+ Discord.Internal.Types.Channel: instance Data.Aeson.Types.ToJSON.ToJSON Discord.Internal.Types.Channel.ThreadMemberUpdateFields
+ Discord.Internal.Types.Channel: instance GHC.Classes.Eq Discord.Internal.Types.Channel.ThreadMemberUpdateFields
+ Discord.Internal.Types.Channel: instance GHC.Classes.Ord Discord.Internal.Types.Channel.ThreadMemberUpdateFields
+ Discord.Internal.Types.Channel: instance GHC.Read.Read Discord.Internal.Types.Channel.ThreadMemberUpdateFields
+ Discord.Internal.Types.Channel: instance GHC.Show.Show Discord.Internal.Types.Channel.ThreadMemberUpdateFields
+ Discord.Internal.Types.Events: InternalThreadMemberUpdate :: ThreadMemberUpdateFields -> EventInternalParse
+ Discord.Internal.Types.Events: ThreadMemberUpdate :: ThreadMemberUpdateFields -> Event
+ Discord.Internal.Types.Interactions: instance Data.Default.Class.Default Discord.Internal.Types.Interactions.InteractionResponseMessage
+ Discord.Types: ThreadMemberUpdate :: ThreadMemberUpdateFields -> Event
+ Discord.Types: ThreadMemberUpdateFields :: Maybe ChannelId -> Maybe UserId -> UTCTime -> Integer -> GuildId -> ThreadMemberUpdateFields
+ Discord.Types: [threadMemberUpdateFieldsFlags] :: ThreadMemberUpdateFields -> Integer
+ Discord.Types: [threadMemberUpdateFieldsGuildId] :: ThreadMemberUpdateFields -> GuildId
+ Discord.Types: [threadMemberUpdateFieldsJoinTime] :: ThreadMemberUpdateFields -> UTCTime
+ Discord.Types: [threadMemberUpdateFieldsThreadId] :: ThreadMemberUpdateFields -> Maybe ChannelId
+ Discord.Types: [threadMemberUpdateFieldsUserId] :: ThreadMemberUpdateFields -> Maybe UserId
+ Discord.Types: data ThreadMemberUpdateFields
- Discord: class FromJSON a
+ Discord: class () => FromJSON a
- Discord.Internal.Types: class ToJSON a
+ Discord.Internal.Types: class () => ToJSON a
- Discord.Internal.Types: data UTCTime
+ Discord.Internal.Types: data () => UTCTime
- Discord.Types: class ToJSON a
+ Discord.Types: class () => ToJSON a
- Discord.Types: data UTCTime
+ Discord.Types: data () => UTCTime
Files
- changelog.md +6/−0
- discord-haskell.cabal +1/−1
- src/Discord/Internal/Rest/Channel.hs +10/−6
- src/Discord/Internal/Rest/Guild.hs +28/−5
- src/Discord/Internal/Types.hs +1/−0
- src/Discord/Internal/Types/Channel.hs +26/−1
- src/Discord/Internal/Types/Embed.hs +2/−0
- src/Discord/Internal/Types/Events.hs +5/−1
- src/Discord/Internal/Types/Interactions.hs +6/−0
changelog.md view
@@ -8,6 +8,12 @@ - +## 1.16.1++- [julmb](https://github.com/discord-haskell/discord-haskell/pull/200) Default instance for InteractionResponseMessage++- [S3NP41-v](https://github.com/discord-haskell/discord-haskell/pull/199) Adding ThreadMemberUpdate event, and a StartThreadOpts Default instance+ ## 1.16.0 - [L0neGamer](https://github.com/discord-haskell/discord-haskell/pull/187) Switched StatusOpts to a list of activities
discord-haskell.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.0 name: discord-haskell-version: 1.16.0+version: 1.16.1 description: Functions and data types to write discord bots. Official discord docs <https://discord.com/developers/docs/reference>. .
src/Discord/Internal/Rest/Channel.hs view
@@ -159,16 +159,14 @@ } -- | Data constructor for `GetReactions` requests-data ReactionTiming = BeforeReaction MessageId- | AfterReaction MessageId- | LatestReaction+data ReactionTiming = AfterUser UserId+ | FirstUsers deriving (Show, Read, Eq, Ord) reactionTimingToQuery :: ReactionTiming -> R.Option 'R.Https reactionTimingToQuery t = case t of- (BeforeReaction snow) -> "before" R.=: show snow- (AfterReaction snow) -> "after" R.=: show snow- LatestReaction -> mempty+ (AfterUser snow) -> "after" R.=: show snow+ FirstUsers -> mempty -- | Data constructor for `GetChannelMessages` requests. -- @@ -309,6 +307,12 @@ , "auto_archive_duration" .=? startThreadAutoArchive , "rate_limit_per_user" .=? startThreadRateLimit ]++instance Default StartThreadOpts where+ def = StartThreadOpts { startThreadName = "New Thread"+ , startThreadAutoArchive = Nothing+ , startThreadRateLimit = Nothing+ } -- | Options for `StartThreadNoMessage` request data StartThreadNoMessageOpts = StartThreadNoMessageOpts
src/Discord/Internal/Rest/Guild.hs view
@@ -15,6 +15,7 @@ , ModifyGuildRoleOpts(..) , CreateGuildIntegrationOpts(..) , ModifyGuildIntegrationOpts(..)+ , ListActiveThreads (..) ) where @@ -53,6 +54,8 @@ -- 'MANAGE_CHANNELS' permission. Returns a list of all of the guild's 'Channel' -- objects on success. Fires multiple Channel Update 'Event's. ModifyGuildChannelPositions :: GuildId -> [(ChannelId,Int)] -> GuildRequest [Channel]+ -- | Returns a list of active threads in a guild+ ListActiveGuildThreads :: GuildId -> GuildRequest ListActiveThreads -- | Returns a guild 'Member' object for the specified user GetGuildMember :: GuildId -> UserId -> GuildRequest GuildMember -- | Returns a list of guild 'Member' objects that are members of the guild.@@ -61,14 +64,13 @@ -- for the user with the guilds.join scope. Returns the guild 'Member' as the body. -- Fires a Guild Member Add 'Event'. Requires the bot to have the -- CREATE_INSTANT_INVITE permission.- AddGuildMember :: GuildId -> UserId -> AddGuildMemberOpts- -> GuildRequest ()+ AddGuildMember :: GuildId -> UserId -> AddGuildMemberOpts -> GuildRequest () -- | Modify attributes of a guild 'Member'. Fires a Guild Member Update 'Event'. ModifyGuildMember :: GuildId -> UserId -> ModifyGuildMemberOpts -> GuildRequest GuildMember -- | Modify the nickname of the current user ModifyCurrentUserNick :: GuildId -> T.Text -> GuildRequest () -- | Add a member to a guild role. Requires 'MANAGE_ROLES' permission.- AddGuildMemberRole :: GuildId -> UserId -> RoleId -> GuildRequest ()+ AddGuildMemberRole :: GuildId -> UserId -> RoleId -> GuildRequest () -- | Remove a member from a guild role. Requires 'MANAGE_ROLES' permission. RemoveGuildMemberRole :: GuildId -> UserId -> RoleId -> GuildRequest () -- | Remove a member from a guild. Requires 'KICK_MEMBER' permission. Fires a@@ -132,11 +134,11 @@ -- | Sync an 'Integration'. Requires the 'MANAGE_GUILD' permission. SyncGuildIntegration :: GuildId -> IntegrationId -> GuildRequest () -- | Returns the 'GuildWidget' object. Requires the 'MANAGE_GUILD' permission.- GetGuildWidget :: GuildId -> GuildRequest GuildWidget+ GetGuildWidget :: GuildId -> GuildRequest GuildWidget -- | Modify a 'GuildWidget' object for the guild. All attributes may be passed in with -- JSON and modified. Requires the 'MANAGE_GUILD' permission. Returns the updated -- 'GuildWidget' object.- ModifyGuildWidget :: GuildId -> GuildWidget -> GuildRequest GuildWidget+ ModifyGuildWidget :: GuildId -> GuildWidget -> GuildRequest GuildWidget -- | Vanity URL GetGuildVanityURL :: GuildId -> GuildRequest T.Text @@ -301,6 +303,23 @@ , guildMembersTimingAfter :: Maybe UserId } deriving (Show, Read, Eq, Ord) +-- | result for `ListGuildActiveThreads`+data ListActiveThreads = ListActiveThreads+ { listActiveThreadsThreads :: [Channel]+ , listActiveThreadsMembers :: [ThreadMember]+ } deriving (Show, Read, Eq, Ord)++instance ToJSON ListActiveThreads where+ toJSON ListActiveThreads{..} = object+ [ ("threads", toJSON listActiveThreadsThreads)+ , ("members", toJSON listActiveThreadsMembers)+ ]++instance FromJSON ListActiveThreads where+ parseJSON = withObject "ListActiveThreads" $ \o ->+ ListActiveThreads <$> o .: "threads"+ <*> o .: "members"+ guildMembersTimingToQuery :: GuildMembersTiming -> R.Option 'R.Https guildMembersTimingToQuery (GuildMembersTiming mLimit mAfter) = let limit = case mLimit of@@ -319,6 +338,7 @@ (GetGuildChannels g) -> "guild_chan " <> show g (CreateGuildChannel g _ _ _) -> "guild_chan " <> show g (ModifyGuildChannelPositions g _) -> "guild_chan " <> show g+ (ListActiveGuildThreads g) -> "guild_chan " <> show g (GetGuildMember g _) -> "guild_memb " <> show g (ListGuildMembers g _) -> "guild_membs " <> show g (AddGuildMember g _ _) -> "guild_membs " <> show g@@ -375,6 +395,9 @@ let patch = map (\(a, b) -> object [("id", toJSON a) ,("position", toJSON b)]) newlocs in Patch (guilds /~ guild /: "channels") (pure (R.ReqBodyJson patch)) mempty++ (ListActiveGuildThreads guild) ->+ Get (guilds /~ guild /: "threads" /: "active") mempty (GetGuildMember guild member) -> Get (guilds /~ guild /: "members" /~ member) mempty
src/Discord/Internal/Types.hs view
@@ -43,6 +43,7 @@ InternalChannelDelete a -> ChannelDelete a InternalThreadCreate a -> ThreadCreate a InternalThreadUpdate a -> ThreadUpdate a+ InternalThreadMemberUpdate a -> ThreadMemberUpdate a InternalThreadDelete a -> ThreadDelete a InternalThreadListSync a -> ThreadListSync a InternalThreadMembersUpdate a -> ThreadMembersUpdate a
src/Discord/Internal/Types/Channel.hs view
@@ -9,6 +9,7 @@ , Overwrite (..) , ThreadMetadata (..) , ThreadMember (..)+ , ThreadMemberUpdateFields (..) , ThreadListSyncFields (..) , ThreadMembersUpdateFields (..) , Message (..)@@ -23,7 +24,7 @@ , MessageFlag (..) , MessageFlags (..) , MessageInteraction (..)-+ , ChannelTypeOption (..) ) where @@ -453,6 +454,30 @@ , "flags" .== threadMemberFlags ] +data ThreadMemberUpdateFields = ThreadMemberUpdateFields+ { threadMemberUpdateFieldsThreadId :: Maybe ChannelId -- ^ id of the thread+ , threadMemberUpdateFieldsUserId :: Maybe UserId -- ^ id of the user+ , threadMemberUpdateFieldsJoinTime :: UTCTime -- ^ time the current user last joined the thread+ , threadMemberUpdateFieldsFlags :: Integer -- ^ user-thread settings+ , threadMemberUpdateFieldsGuildId :: GuildId -- ^ id of the guild+ } deriving (Show, Read, Eq, Ord)++instance FromJSON ThreadMemberUpdateFields where+ parseJSON = withObject "ThreadMemberUpdateFields" $ \o ->+ ThreadMemberUpdateFields <$> o .:? "id"+ <*> o .:? "user_id"+ <*> o .: "join_timestamp"+ <*> o .: "flags"+ <*> o .: "guild_id"++instance ToJSON ThreadMemberUpdateFields where+ toJSON ThreadMemberUpdateFields{..} = objectFromMaybes+ [ "id" .=? threadMemberUpdateFieldsThreadId+ , "user_id" .=? threadMemberUpdateFieldsUserId+ , "join_timestamp" .== threadMemberUpdateFieldsJoinTime+ , "flags" .== threadMemberUpdateFieldsFlags+ , "guild_id" .== threadMemberUpdateFieldsGuildId+ ] data ThreadListSyncFields = ThreadListSyncFields { threadListSyncFieldsGuildId :: GuildId
src/Discord/Internal/Types/Embed.hs view
@@ -56,6 +56,8 @@ , embedProvider = Nothing } +-- | The 'Default' instance of this type yields a 'def' value whose fields are all empty.+-- As such, the 'def' value is not a valid embed and needs to be adjusted before being used. data CreateEmbed = CreateEmbed { createEmbedAuthorName :: T.Text , createEmbedAuthorUrl :: T.Text
src/Discord/Internal/Types/Events.hs view
@@ -41,11 +41,13 @@ | ThreadCreate Channel -- | thread was updated | ThreadUpdate Channel+ -- | thread member for the current user was updated+ | ThreadMemberUpdate ThreadMemberUpdateFields -- | thread was deleted | ThreadDelete Channel -- | sent when gaining access to a channel, contains all active threads in that channel | ThreadListSync ThreadListSyncFields- -- | thread member for the current user was updated+ -- | member or the current user was added or removed from a thread | ThreadMembersUpdate ThreadMembersUpdateFields -- | message was pinned or unpinned | ChannelPinsUpdate ChannelId (Maybe UTCTime)@@ -118,6 +120,7 @@ | InternalChannelDelete Channel | InternalThreadCreate Channel | InternalThreadUpdate Channel+ | InternalThreadMemberUpdate ThreadMemberUpdateFields | InternalThreadDelete Channel | InternalThreadListSync ThreadListSyncFields | InternalThreadMembersUpdate ThreadMembersUpdateFields @@ -278,6 +281,7 @@ "CHANNEL_DELETE" -> InternalChannelDelete <$> reparse o "THREAD_CREATE" -> InternalThreadCreate <$> reparse o "THREAD_UPDATE" -> InternalThreadUpdate <$> reparse o+ "THREAD_MEMBER_UPDATE" -> InternalThreadMemberUpdate <$> reparse o "THREAD_DELETE" -> InternalThreadDelete <$> reparse o "THREAD_LIST_SYNC" -> InternalThreadListSync <$> reparse o "THREAD_MEMBERS_UPDATE" -> InternalThreadMembersUpdate <$> reparse o
src/Discord/Internal/Types/Interactions.hs view
@@ -32,6 +32,7 @@ import Control.Applicative (Alternative ((<|>))) import Control.Monad (join)+import Data.Default import Data.Aeson import Data.Aeson.Types (Parser) import Data.Bits (Bits (shift, (.|.)))@@ -603,6 +604,8 @@ toJSON (InteractionResponseAutocompleteNumber cs) = object [("choices", toJSON cs)] -- | A cut down message structure.+-- The 'Default' instance of this type yields a 'def' value whose fields are all empty.+-- As such, the 'def' value is not a valid response message and needs to be adjusted before being used. data InteractionResponseMessage = InteractionResponseMessage { interactionResponseMessageTTS :: Maybe Bool, interactionResponseMessageContent :: Maybe T.Text,@@ -618,6 +621,9 @@ -- effectively a helper function. interactionResponseMessageBasic :: T.Text -> InteractionResponseMessage interactionResponseMessageBasic t = InteractionResponseMessage Nothing (Just t) Nothing Nothing Nothing Nothing Nothing++instance Default InteractionResponseMessage where+ def = InteractionResponseMessage Nothing Nothing Nothing Nothing Nothing Nothing Nothing instance ToJSON InteractionResponseMessage where toJSON InteractionResponseMessage {..} =