packages feed

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 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 {..} =