packages feed

calamity 0.1.4.1 → 0.1.4.2

raw patch · 22 files changed

+503/−187 lines, 22 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Calamity.Gateway.DispatchEvents: GuildBanData :: Snowflake Guild -> User -> GuildBanData
- Calamity.Gateway.DispatchEvents: [$sel:guildID:GuildBanData] :: GuildBanData -> Snowflake Guild
- Calamity.Gateway.DispatchEvents: [$sel:user:GuildBanData] :: GuildBanData -> User
- Calamity.Gateway.DispatchEvents: data GuildBanData
- Calamity.Gateway.DispatchEvents: instance Data.Aeson.Types.FromJSON.FromJSON Calamity.Gateway.DispatchEvents.GuildBanData
- Calamity.Gateway.DispatchEvents: instance GHC.Generics.Generic Calamity.Gateway.DispatchEvents.GuildBanData
- Calamity.Gateway.DispatchEvents: instance GHC.Show.Show Calamity.Gateway.DispatchEvents.GuildBanData
- Calamity.Internal.MessageStore: MessageStore :: Deque (Snowflake Message) -> HashMap (Snowflake Message) Message -> Int -> Int -> MessageStore
- Calamity.Internal.MessageStore: [$sel:limit:MessageStore] :: MessageStore -> Int
- Calamity.Internal.MessageStore: [$sel:messageQueue:MessageStore] :: MessageStore -> Deque (Snowflake Message)
- Calamity.Internal.MessageStore: [$sel:messages:MessageStore] :: MessageStore -> HashMap (Snowflake Message) Message
- Calamity.Internal.MessageStore: [$sel:size:MessageStore] :: MessageStore -> Int
- Calamity.Internal.MessageStore: addMessage :: Message -> MessageStore -> MessageStore
- Calamity.Internal.MessageStore: data MessageStore
- Calamity.Internal.MessageStore: dropMessage :: Snowflake Message -> MessageStore -> MessageStore
- Calamity.Internal.MessageStore: getMessage :: Snowflake Message -> MessageStore -> Maybe Message
- Calamity.Internal.MessageStore: instance Control.Lens.At.At Calamity.Internal.MessageStore.MessageStore
- Calamity.Internal.MessageStore: instance Control.Lens.At.Ixed Calamity.Internal.MessageStore.MessageStore
- Calamity.Internal.MessageStore: instance Data.Default.Class.Default Calamity.Internal.MessageStore.MessageStore
- Calamity.Internal.MessageStore: instance GHC.Generics.Generic Calamity.Internal.MessageStore.MessageStore
- Calamity.Internal.MessageStore: instance GHC.Show.Show Calamity.Internal.MessageStore.MessageStore
- Calamity.Types.Snowflake: instance forall k (field :: GHC.Types.Symbol) a (b :: k). Data.Generics.Product.Fields.HasField' field a (Calamity.Types.Snowflake.Snowflake b) => Calamity.Types.Snowflake.HasID b (Calamity.Types.Snowflake.HasIDField field a)
- Calamity.Types.Snowflake: instance forall k1 k2 (field :: GHC.Types.Symbol) a (c :: k1) (b :: k2). Data.Generics.Product.Fields.HasField' field a (Calamity.Types.Snowflake.Snowflake c) => Calamity.Types.Snowflake.HasID b (Calamity.Types.Snowflake.HasIDFieldCoerce field a c)
+ Calamity.Cache.Eff: [GetDMs] :: CacheEff m [DMChannel]
+ Calamity.Cache.Eff: [GetGuilds] :: CacheEff m [Guild]
+ Calamity.Cache.Eff: [GetMessages] :: CacheEff m [Message]
+ Calamity.Cache.Eff: [GetUnavailableGuilds] :: CacheEff m [Snowflake Guild]
+ Calamity.Cache.Eff: [GetUsers] :: CacheEff m [User]
+ Calamity.Cache.Eff: getDMs :: forall r_a8WsN. MemberWithError CacheEff r_a8WsN => Sem r_a8WsN [DMChannel]
+ Calamity.Cache.Eff: getGuilds :: forall r_a8WsG. MemberWithError CacheEff r_a8WsG => Sem r_a8WsG [Guild]
+ Calamity.Cache.Eff: getMessages :: forall r_a8Wt8. MemberWithError CacheEff r_a8Wt8 => Sem r_a8Wt8 [Message]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a8Wt1. MemberWithError CacheEff r_a8Wt1 => Sem r_a8Wt1 [Snowflake Guild]
+ Calamity.Cache.Eff: getUsers :: forall r_a8WsU. MemberWithError CacheEff r_a8WsU => Sem r_a8WsU [User]
+ Calamity.HTTP.Guild: AddGuildMemberData :: Text -> Maybe Text -> Maybe [Snowflake Role] -> Maybe Bool -> Maybe Bool -> AddGuildMemberData
+ Calamity.HTTP.Guild: ChannelCreateData :: Text -> Maybe ChannelType -> Maybe Text -> Maybe Integer -> Maybe Integer -> Maybe Integer -> Maybe Integer -> Maybe [Overwrite] -> Maybe (Snowflake Category) -> Maybe Bool -> ChannelCreateData
+ Calamity.HTTP.Guild: ChannelPosition :: Snowflake GuildChannel -> Maybe Integer -> ChannelPosition
+ Calamity.HTTP.Guild: CreateGuildBanData :: Maybe Integer -> Maybe Text -> CreateGuildBanData
+ Calamity.HTTP.Guild: ListMembersOptions :: Maybe Integer -> Maybe (Snowflake User) -> ListMembersOptions
+ Calamity.HTTP.Guild: ModifyGuildMemberData :: Maybe Text -> Maybe [Snowflake Role] -> Maybe Bool -> Maybe Bool -> Maybe (Snowflake VoiceChannel) -> ModifyGuildMemberData
+ Calamity.HTTP.Guild: ModifyGuildRoleData :: Maybe Text -> Maybe Integer -> Maybe Integer -> Maybe Bool -> Maybe Bool -> ModifyGuildRoleData
+ Calamity.HTTP.Guild: ModifyGuildRolePositionsData :: Snowflake Role -> Maybe Integer -> ModifyGuildRolePositionsData
+ Calamity.HTTP.Guild: [$sel:accessToken:AddGuildMemberData] :: AddGuildMemberData -> Text
+ Calamity.HTTP.Guild: [$sel:after:ListMembersOptions] :: ListMembersOptions -> Maybe (Snowflake User)
+ Calamity.HTTP.Guild: [$sel:bitrate:ChannelCreateData] :: ChannelCreateData -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:channelID:ModifyGuildMemberData] :: ModifyGuildMemberData -> Maybe (Snowflake VoiceChannel)
+ Calamity.HTTP.Guild: [$sel:color:ModifyGuildRoleData] :: ModifyGuildRoleData -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:deaf:AddGuildMemberData] :: AddGuildMemberData -> Maybe Bool
+ Calamity.HTTP.Guild: [$sel:deaf:ModifyGuildMemberData] :: ModifyGuildMemberData -> Maybe Bool
+ Calamity.HTTP.Guild: [$sel:deleteMessageDays:CreateGuildBanData] :: CreateGuildBanData -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:hoist:ModifyGuildRoleData] :: ModifyGuildRoleData -> Maybe Bool
+ Calamity.HTTP.Guild: [$sel:id:ChannelPosition] :: ChannelPosition -> Snowflake GuildChannel
+ Calamity.HTTP.Guild: [$sel:id:ModifyGuildRolePositionsData] :: ModifyGuildRolePositionsData -> Snowflake Role
+ Calamity.HTTP.Guild: [$sel:limit:ListMembersOptions] :: ListMembersOptions -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:mentionable:ModifyGuildRoleData] :: ModifyGuildRoleData -> Maybe Bool
+ Calamity.HTTP.Guild: [$sel:mute:AddGuildMemberData] :: AddGuildMemberData -> Maybe Bool
+ Calamity.HTTP.Guild: [$sel:mute:ModifyGuildMemberData] :: ModifyGuildMemberData -> Maybe Bool
+ Calamity.HTTP.Guild: [$sel:name:ChannelCreateData] :: ChannelCreateData -> Text
+ Calamity.HTTP.Guild: [$sel:name:ModifyGuildRoleData] :: ModifyGuildRoleData -> Maybe Text
+ Calamity.HTTP.Guild: [$sel:nick:AddGuildMemberData] :: AddGuildMemberData -> Maybe Text
+ Calamity.HTTP.Guild: [$sel:nick:ModifyGuildMemberData] :: ModifyGuildMemberData -> Maybe Text
+ Calamity.HTTP.Guild: [$sel:nsfw:ChannelCreateData] :: ChannelCreateData -> Maybe Bool
+ Calamity.HTTP.Guild: [$sel:parentID:ChannelCreateData] :: ChannelCreateData -> Maybe (Snowflake Category)
+ Calamity.HTTP.Guild: [$sel:permissionOverwrites:ChannelCreateData] :: ChannelCreateData -> Maybe [Overwrite]
+ Calamity.HTTP.Guild: [$sel:permissions:ModifyGuildRoleData] :: ModifyGuildRoleData -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:position:ChannelCreateData] :: ChannelCreateData -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:position:ChannelPosition] :: ChannelPosition -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:position:ModifyGuildRolePositionsData] :: ModifyGuildRolePositionsData -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:rateLimitPerUser:ChannelCreateData] :: ChannelCreateData -> Maybe Integer
+ Calamity.HTTP.Guild: [$sel:reason:CreateGuildBanData] :: CreateGuildBanData -> Maybe Text
+ Calamity.HTTP.Guild: [$sel:roles:AddGuildMemberData] :: AddGuildMemberData -> Maybe [Snowflake Role]
+ Calamity.HTTP.Guild: [$sel:roles:ModifyGuildMemberData] :: ModifyGuildMemberData -> Maybe [Snowflake Role]
+ Calamity.HTTP.Guild: [$sel:topic:ChannelCreateData] :: ChannelCreateData -> Maybe Text
+ Calamity.HTTP.Guild: [$sel:type_:ChannelCreateData] :: ChannelCreateData -> Maybe ChannelType
+ Calamity.HTTP.Guild: [$sel:userLimit:ChannelCreateData] :: ChannelCreateData -> Maybe Integer
+ Calamity.HTTP.Guild: [AddGuildMemberRole] :: (HasID Guild g, HasID User u, HasID Role r) => g -> u -> r -> GuildRequest ()
+ Calamity.HTTP.Guild: [AddGuildMember] :: (HasID Guild g, HasID User u) => g -> u -> AddGuildMemberData -> GuildRequest (Maybe Member)
+ Calamity.HTTP.Guild: [BeginGuildPrune] :: HasID Guild g => g -> Integer -> Bool -> GuildRequest (Maybe Integer)
+ Calamity.HTTP.Guild: [CreateGuildBan] :: (HasID Guild g, HasID User u) => g -> u -> CreateGuildBanData -> GuildRequest ()
+ Calamity.HTTP.Guild: [CreateGuildChannel] :: HasID Guild g => g -> ChannelCreateData -> GuildRequest Channel
+ Calamity.HTTP.Guild: [CreateGuildRole] :: HasID Guild g => g -> ModifyGuildRoleData -> GuildRequest Role
+ Calamity.HTTP.Guild: [DeleteGuildRole] :: (HasID Guild g, HasID Role r) => g -> r -> GuildRequest ()
+ Calamity.HTTP.Guild: [DeleteGuild] :: HasID Guild g => g -> GuildRequest ()
+ Calamity.HTTP.Guild: [GetGuildBan] :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest BanData
+ Calamity.HTTP.Guild: [GetGuildBans] :: HasID Guild g => g -> GuildRequest [BanData]
+ Calamity.HTTP.Guild: [GetGuildChannels] :: HasID Guild g => g -> GuildRequest [Channel]
+ Calamity.HTTP.Guild: [GetGuildInvites] :: HasID Guild g => g -> GuildRequest [Invite]
+ Calamity.HTTP.Guild: [GetGuildMember] :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest Member
+ Calamity.HTTP.Guild: [GetGuildPruneCount] :: HasID Guild g => g -> Integer -> GuildRequest Integer
+ Calamity.HTTP.Guild: [GetGuildRoles] :: HasID Guild g => g -> GuildRequest [Role]
+ Calamity.HTTP.Guild: [GetGuildVoiceRegions] :: HasID Guild g => g -> GuildRequest [VoiceRegion]
+ Calamity.HTTP.Guild: [ListGuildMembers] :: HasID Guild g => g -> ListMembersOptions -> GuildRequest [Member]
+ Calamity.HTTP.Guild: [ModifyCurrentUserNick] :: HasID Guild g => g -> Maybe Text -> GuildRequest ()
+ Calamity.HTTP.Guild: [ModifyGuildChannelPositions] :: HasID Guild g => g -> [ChannelPosition] -> GuildRequest ()
+ Calamity.HTTP.Guild: [ModifyGuildMember] :: (HasID Guild g, HasID User u) => g -> u -> ModifyGuildMemberData -> GuildRequest ()
+ Calamity.HTTP.Guild: [ModifyGuildRolePositions] :: HasID Guild g => g -> ModifyGuildRolePositionsData -> GuildRequest [Role]
+ Calamity.HTTP.Guild: [ModifyGuildRole] :: (HasID Guild g, HasID Role r) => g -> r -> ModifyGuildRoleData -> GuildRequest Role
+ Calamity.HTTP.Guild: [RemoveGuildBan] :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest ()
+ Calamity.HTTP.Guild: [RemoveGuildMemberRole] :: (HasID Guild g, HasID User u, HasID Role r) => g -> u -> r -> GuildRequest ()
+ Calamity.HTTP.Guild: [RemoveGuildMember] :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest ()
+ Calamity.HTTP.Guild: data AddGuildMemberData
+ Calamity.HTTP.Guild: data ChannelCreateData
+ Calamity.HTTP.Guild: data ChannelPosition
+ Calamity.HTTP.Guild: data CreateGuildBanData
+ Calamity.HTTP.Guild: data ListMembersOptions
+ Calamity.HTTP.Guild: data ModifyGuildMemberData
+ Calamity.HTTP.Guild: data ModifyGuildRoleData
+ Calamity.HTTP.Guild: data ModifyGuildRolePositionsData
+ Calamity.HTTP.Guild: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.HTTP.Guild.AddGuildMemberData
+ Calamity.HTTP.Guild: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.HTTP.Guild.ChannelCreateData
+ Calamity.HTTP.Guild: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.HTTP.Guild.ChannelPosition
+ Calamity.HTTP.Guild: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.HTTP.Guild.ModifyGuildMemberData
+ Calamity.HTTP.Guild: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.HTTP.Guild.ModifyGuildRoleData
+ Calamity.HTTP.Guild: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.HTTP.Guild.ModifyGuildRolePositionsData
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.AddGuildMemberData
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.ChannelCreateData
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.ChannelPosition
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.CreateGuildBanData
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.ListMembersOptions
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.ModifyGuildMemberData
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.ModifyGuildRoleData
+ Calamity.HTTP.Guild: instance GHC.Generics.Generic Calamity.HTTP.Guild.ModifyGuildRolePositionsData
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.AddGuildMemberData
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.ChannelCreateData
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.ChannelPosition
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.CreateGuildBanData
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.ListMembersOptions
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.ModifyGuildMemberData
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.ModifyGuildRoleData
+ Calamity.HTTP.Guild: instance GHC.Show.Show Calamity.HTTP.Guild.ModifyGuildRolePositionsData
+ Calamity.HTTP.Internal.Request: postEmptyP :: (Options -> Options) -> Options -> String -> IO (Response ByteString)
+ Calamity.HTTP.Internal.Request: putEmptyP :: (Options -> Options) -> Options -> String -> IO (Response ByteString)
+ Calamity.Internal.BoundedStore: BoundedStore :: Deque (Snowflake a) -> HashMap (Snowflake a) a -> Int -> Int -> BoundedStore a
+ Calamity.Internal.BoundedStore: [$sel:itemQueue:BoundedStore] :: BoundedStore a -> Deque (Snowflake a)
+ Calamity.Internal.BoundedStore: [$sel:items:BoundedStore] :: BoundedStore a -> HashMap (Snowflake a) a
+ Calamity.Internal.BoundedStore: [$sel:limit:BoundedStore] :: BoundedStore a -> Int
+ Calamity.Internal.BoundedStore: [$sel:size:BoundedStore] :: BoundedStore a -> Int
+ Calamity.Internal.BoundedStore: addItem :: HasID' a => a -> BoundedStore a -> BoundedStore a
+ Calamity.Internal.BoundedStore: data BoundedStore a
+ Calamity.Internal.BoundedStore: dropItem :: Snowflake a -> BoundedStore a -> BoundedStore a
+ Calamity.Internal.BoundedStore: getItem :: Snowflake a -> BoundedStore a -> Maybe a
+ Calamity.Internal.BoundedStore: instance Calamity.Types.Snowflake.HasID' a => Control.Lens.At.At (Calamity.Internal.BoundedStore.BoundedStore a)
+ Calamity.Internal.BoundedStore: instance Calamity.Types.Snowflake.HasID' a => Control.Lens.At.Ixed (Calamity.Internal.BoundedStore.BoundedStore a)
+ Calamity.Internal.BoundedStore: instance Data.Default.Class.Default (Calamity.Internal.BoundedStore.BoundedStore a)
+ Calamity.Internal.BoundedStore: instance Data.Foldable.Foldable Calamity.Internal.BoundedStore.BoundedStore
+ Calamity.Internal.BoundedStore: instance GHC.Generics.Generic (Calamity.Internal.BoundedStore.BoundedStore a)
+ Calamity.Internal.BoundedStore: instance GHC.Show.Show a => GHC.Show.Show (Calamity.Internal.BoundedStore.BoundedStore a)
+ Calamity.Types.Model.Guild.Ban: BanData :: Snowflake Guild -> User -> BanData
+ Calamity.Types.Model.Guild.Ban: [$sel:guildID:BanData] :: BanData -> Snowflake Guild
+ Calamity.Types.Model.Guild.Ban: [$sel:user:BanData] :: BanData -> User
+ Calamity.Types.Model.Guild.Ban: data BanData
+ Calamity.Types.Model.Guild.Ban: instance Calamity.Types.Snowflake.HasID Calamity.Types.Model.Guild.Guild.Guild Calamity.Types.Model.Guild.Ban.BanData
+ Calamity.Types.Model.Guild.Ban: instance Calamity.Types.Snowflake.HasID Calamity.Types.Model.User.User Calamity.Types.Model.Guild.Ban.BanData
+ Calamity.Types.Model.Guild.Ban: instance Data.Aeson.Types.FromJSON.FromJSON Calamity.Types.Model.Guild.Ban.BanData
+ Calamity.Types.Model.Guild.Ban: instance GHC.Generics.Generic Calamity.Types.Model.Guild.Ban.BanData
+ Calamity.Types.Model.Guild.Ban: instance GHC.Show.Show Calamity.Types.Model.Guild.Ban.BanData
+ Calamity.Types.Model.Guild.Ban: instance TextShow.Classes.TextShow Calamity.Types.Model.Guild.Ban.BanData
+ Calamity.Types.Model.Voice.VoiceRegion: VoiceRegion :: Snowflake VoiceRegion -> Text -> Bool -> Bool -> Bool -> Bool -> VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: [$sel:custom:VoiceRegion] :: VoiceRegion -> Bool
+ Calamity.Types.Model.Voice.VoiceRegion: [$sel:deprecated:VoiceRegion] :: VoiceRegion -> Bool
+ Calamity.Types.Model.Voice.VoiceRegion: [$sel:id:VoiceRegion] :: VoiceRegion -> Snowflake VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: [$sel:name:VoiceRegion] :: VoiceRegion -> Text
+ Calamity.Types.Model.Voice.VoiceRegion: [$sel:optimal:VoiceRegion] :: VoiceRegion -> Bool
+ Calamity.Types.Model.Voice.VoiceRegion: [$sel:vip:VoiceRegion] :: VoiceRegion -> Bool
+ Calamity.Types.Model.Voice.VoiceRegion: data VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: instance Data.Aeson.Types.FromJSON.FromJSON Calamity.Types.Model.Voice.VoiceRegion.VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.Types.Model.Voice.VoiceRegion.VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: instance GHC.Classes.Eq Calamity.Types.Model.Voice.VoiceRegion.VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: instance GHC.Generics.Generic Calamity.Types.Model.Voice.VoiceRegion.VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: instance GHC.Show.Show Calamity.Types.Model.Voice.VoiceRegion.VoiceRegion
+ Calamity.Types.Model.Voice.VoiceRegion: instance TextShow.Classes.TextShow Calamity.Types.Model.Voice.VoiceRegion.VoiceRegion
+ Calamity.Types.Snowflake: instance forall k (b :: k) c (field :: GHC.Types.Symbol) a. (Calamity.Types.Snowflake.HasID b c, Data.Generics.Product.Fields.HasField' field a c) => Calamity.Types.Snowflake.HasID b (Calamity.Types.Snowflake.HasIDField field a)
+ Calamity.Types.Snowflake: instance forall k1 k2 (c :: k1) d (field :: GHC.Types.Symbol) a (b :: k2). (Calamity.Types.Snowflake.HasID c d, Data.Generics.Product.Fields.HasField' field a d) => Calamity.Types.Snowflake.HasID b (Calamity.Types.Snowflake.HasIDFieldCoerce field a c)
- Calamity.Cache.Eff: delDM :: forall r_a8FR7. MemberWithError CacheEff r_a8FR7 => Snowflake DMChannel -> Sem r_a8FR7 ()
+ Calamity.Cache.Eff: delDM :: forall r_a8WsO. MemberWithError CacheEff r_a8WsO => Snowflake DMChannel -> Sem r_a8WsO ()
- Calamity.Cache.Eff: delGuild :: forall r_a8FR1. MemberWithError CacheEff r_a8FR1 => Snowflake Guild -> Sem r_a8FR1 ()
+ Calamity.Cache.Eff: delGuild :: forall r_a8WsH. MemberWithError CacheEff r_a8WsH => Snowflake Guild -> Sem r_a8WsH ()
- Calamity.Cache.Eff: delMessage :: forall r_a8FRp. MemberWithError CacheEff r_a8FRp => Snowflake Message -> Sem r_a8FRp ()
+ Calamity.Cache.Eff: delMessage :: forall r_a8Wt9. MemberWithError CacheEff r_a8Wt9 => Snowflake Message -> Sem r_a8Wt9 ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a8FRj. MemberWithError CacheEff r_a8FRj => Snowflake Guild -> Sem r_a8FRj ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a8Wt2. MemberWithError CacheEff r_a8Wt2 => Snowflake Guild -> Sem r_a8Wt2 ()
- Calamity.Cache.Eff: delUser :: forall r_a8FRd. MemberWithError CacheEff r_a8FRd => Snowflake User -> Sem r_a8FRd ()
+ Calamity.Cache.Eff: delUser :: forall r_a8WsV. MemberWithError CacheEff r_a8WsV => Snowflake User -> Sem r_a8WsV ()
- Calamity.Cache.Eff: getBotUser :: forall r_a8FQW. MemberWithError CacheEff r_a8FQW => Sem r_a8FQW (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a8WsB. MemberWithError CacheEff r_a8WsB => Sem r_a8WsB (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a8FR5. MemberWithError CacheEff r_a8FR5 => Snowflake DMChannel -> Sem r_a8FR5 (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a8WsL. MemberWithError CacheEff r_a8WsL => Snowflake DMChannel -> Sem r_a8WsL (Maybe DMChannel)
- Calamity.Cache.Eff: getGuild :: forall r_a8FQZ. MemberWithError CacheEff r_a8FQZ => Snowflake Guild -> Sem r_a8FQZ (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a8WsE. MemberWithError CacheEff r_a8WsE => Snowflake Guild -> Sem r_a8WsE (Maybe Guild)
- Calamity.Cache.Eff: getMessage :: forall r_a8FRn. MemberWithError CacheEff r_a8FRn => Snowflake Message -> Sem r_a8FRn (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a8Wt6. MemberWithError CacheEff r_a8Wt6 => Snowflake Message -> Sem r_a8Wt6 (Maybe Message)
- Calamity.Cache.Eff: getUser :: forall r_a8FRb. MemberWithError CacheEff r_a8FRb => Snowflake User -> Sem r_a8FRb (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a8WsS. MemberWithError CacheEff r_a8WsS => Snowflake User -> Sem r_a8WsS (Maybe User)
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a8FRh. MemberWithError CacheEff r_a8FRh => Snowflake Guild -> Sem r_a8FRh Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a8WsZ. MemberWithError CacheEff r_a8WsZ => Snowflake Guild -> Sem r_a8WsZ Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a8FQU. MemberWithError CacheEff r_a8FQU => User -> Sem r_a8FQU ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a8Wsz. MemberWithError CacheEff r_a8Wsz => User -> Sem r_a8Wsz ()
- Calamity.Cache.Eff: setDM :: forall r_a8FR3. MemberWithError CacheEff r_a8FR3 => DMChannel -> Sem r_a8FR3 ()
+ Calamity.Cache.Eff: setDM :: forall r_a8WsJ. MemberWithError CacheEff r_a8WsJ => DMChannel -> Sem r_a8WsJ ()
- Calamity.Cache.Eff: setGuild :: forall r_a8FQX. MemberWithError CacheEff r_a8FQX => Guild -> Sem r_a8FQX ()
+ Calamity.Cache.Eff: setGuild :: forall r_a8WsC. MemberWithError CacheEff r_a8WsC => Guild -> Sem r_a8WsC ()
- Calamity.Cache.Eff: setMessage :: forall r_a8FRl. MemberWithError CacheEff r_a8FRl => Message -> Sem r_a8FRl ()
+ Calamity.Cache.Eff: setMessage :: forall r_a8Wt4. MemberWithError CacheEff r_a8Wt4 => Message -> Sem r_a8Wt4 ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a8FRf. MemberWithError CacheEff r_a8FRf => Snowflake Guild -> Sem r_a8FRf ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a8WsX. MemberWithError CacheEff r_a8WsX => Snowflake Guild -> Sem r_a8WsX ()
- Calamity.Cache.Eff: setUser :: forall r_a8FR9. MemberWithError CacheEff r_a8FR9 => User -> Sem r_a8FR9 ()
+ Calamity.Cache.Eff: setUser :: forall r_a8WsQ. MemberWithError CacheEff r_a8WsQ => User -> Sem r_a8WsQ ()
- Calamity.Gateway.DispatchEvents: GuildBanAdd :: GuildBanData -> DispatchData
+ Calamity.Gateway.DispatchEvents: GuildBanAdd :: BanData -> DispatchData
- Calamity.Gateway.DispatchEvents: GuildBanRemove :: GuildBanData -> DispatchData
+ Calamity.Gateway.DispatchEvents: GuildBanRemove :: BanData -> DispatchData
- Calamity.HTTP.Guild: ModifyGuildData :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe Integer -> Maybe Integer -> Maybe Integer -> Maybe (Snowflake Channel) -> Maybe Integer -> Maybe (Snowflake User) -> Maybe Text -> Maybe Text -> Maybe (Snowflake Channel) -> ModifyGuildData
+ Calamity.HTTP.Guild: ModifyGuildData :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe Integer -> Maybe Integer -> Maybe Integer -> Maybe (Snowflake GuildChannel) -> Maybe Integer -> Maybe (Snowflake User) -> Maybe Text -> Maybe Text -> Maybe (Snowflake GuildChannel) -> ModifyGuildData
- Calamity.HTTP.Guild: [$sel:afkChannelID:ModifyGuildData] :: ModifyGuildData -> Maybe (Snowflake Channel)
+ Calamity.HTTP.Guild: [$sel:afkChannelID:ModifyGuildData] :: ModifyGuildData -> Maybe (Snowflake GuildChannel)
- Calamity.HTTP.Guild: [$sel:systemChannelID:ModifyGuildData] :: ModifyGuildData -> Maybe (Snowflake Channel)
+ Calamity.HTTP.Guild: [$sel:systemChannelID:ModifyGuildData] :: ModifyGuildData -> Maybe (Snowflake GuildChannel)

Files

README.md view
@@ -1,8 +1,41 @@-# Calamity+<h1 align="center">Calamity</h1> -A discord library for haskell+<!-- [![Hackage](https://img.shields.io/hackage/v/calamity)](https://hackage.haskell.org/package/calamity) -->+<!-- [![Gitlab pipeline status](https://img.shields.io/gitlab/pipeline/nitros12/calamity)](https://gitlab.com/nitros12/calamity/pipelines) -->+<!-- [![License](https://img.shields.io/github/license/nitros12/calamity)](https://github.com/nitros12/calamity/blob/master/LICENSE) -->+<!-- [![Hackage-Deps](https://img.shields.io/hackage-deps/v/calamity)](https://hackage.haskell.org/package/calamity) --> +<p align="center">+  <a href="https://hackage.haskell.org/package/calamity"><img src="https://img.shields.io/hackage/v/calamity" alt="Hackage"></a>+  <a href="https://gitlab.com/nitros12/calamity/pipelines"><img src="https://img.shields.io/gitlab/pipeline/nitros12/calamity" alt="Gitlab pipeline status"></a>+  <a href="https://github.com/nitros12/calamity/blob/master/LICENSE"><img src="https://img.shields.io/github/license/nitros12/calamity" alt="License"></a>+  <a href="https://hackage.haskell.org/package/calamity"><img src="https://img.shields.io/hackage-deps/v/calamity" alt="Hackage-Deps"></a>+</p>++Calamity is a Haskell library for writing discord bots, it uses+[Polysemy](https://hackage.haskell.org/package/polysemy) as the core library for+handling effects, allowing you to pick and choose how to handle certain features+of the library.++The current customisable effects are:++* Cache: The default cache handler keeps the cache in memory, however you could+  write a cache handler that stores cache in a database for example.++* Metrics: The library has counters, gauges, and histograms installed to measure+  useful things, by default these are not used (and cost nothing), but could be+  combined with [Prometheus](https://hackage.haskell.org/package/prometheus). An+  example of using prometheus as the metrics handler can be found+  [here](https://github.com/nitros12/calamity-example).++# Docs++You can find documentation on hackage: [here](https://hackage.haskell.org/package/calamity)+ # Example++An example project can be found at:+[nitros12/calamity-example](https://github.com/nitros12/calamity-example)  ``` haskell {-# LANGUAGE DataKinds #-}
calamity.cabal view
@@ -1,13 +1,13 @@ cabal-version: 1.18 --- This file has been generated from package.yaml by hpack version 0.31.2.+-- This file has been generated from package.yaml by hpack version 0.33.0. -- -- see: https://github.com/sol/hpack ----- hash: 7abac2efea437078125c5a92e9a9d5f3bef88949e3c3f3625cc91919091950b8+-- hash: 25550840a8f69674317309aa4d238d683405902e21b6caa6045ebc08f359593d  name:           calamity-version:        0.1.4.1+version:        0.1.4.2 synopsis:       A library for writing discord bots description:    Please see the README on GitHub at <https://github.com/nitros12/calamity#readme> category:       Network, Web@@ -54,7 +54,7 @@       Calamity.HTTP.Internal.Types       Calamity.HTTP.MiscRoutes       Calamity.Internal.AesonThings-      Calamity.Internal.MessageStore+      Calamity.Internal.BoundedStore       Calamity.Internal.SnowflakeMap       Calamity.Internal.Updateable       Calamity.Internal.Utils@@ -77,6 +77,7 @@       Calamity.Types.Model.Channel.Message       Calamity.Types.Model.Channel.Reaction       Calamity.Types.Model.Guild+      Calamity.Types.Model.Guild.Ban       Calamity.Types.Model.Guild.Emoji       Calamity.Types.Model.Guild.Guild       Calamity.Types.Model.Guild.Invite@@ -89,6 +90,7 @@       Calamity.Types.Model.Presence.Presence       Calamity.Types.Model.User       Calamity.Types.Model.Voice+      Calamity.Types.Model.Voice.VoiceRegion       Calamity.Types.Model.Voice.VoiceState       Calamity.Types.Partial       Calamity.Types.Snowflake
src/Calamity/Cache/Eff.hs view
@@ -9,10 +9,12 @@     , setGuild     , updateGuild     , getGuild+    , getGuilds     , delGuild     , setDM     , updateDM     , getDM+    , getDMs     , delDM       -- , setGuildChannel       -- , getGuildChannel@@ -20,13 +22,16 @@     , setUser     , updateUser     , getUser+    , getUsers     , delUser     , setUnavailableGuild     , isUnavailableGuild+    , getUnavailableGuilds     , delUnavailableGuild     , setMessage     , updateMessage     , getMessage+    , getMessages     , delMessage ) where  import           Calamity.Internal.Utils@@ -48,6 +53,8 @@   SetGuild :: Guild -> CacheEff m ()   -- | Get a 'Guild' from the cache   GetGuild :: Snowflake Guild -> CacheEff m (Maybe Guild)+  -- | Get all 'Guild's from the cache+  GetGuilds :: CacheEff m [Guild]   -- | Delete a 'Guild' from the cache   DelGuild :: Snowflake Guild -> CacheEff m () @@ -55,6 +62,8 @@   SetDM :: DMChannel -> CacheEff m ()   -- | Get a 'DMChannel' from the cache   GetDM :: Snowflake DMChannel -> CacheEff m (Maybe DMChannel)+  -- | Get all 'DM's from the cache+  GetDMs :: CacheEff m [DMChannel]   -- | Delete a 'DMChannel' from the cache   DelDM :: Snowflake DMChannel -> CacheEff m () @@ -68,6 +77,8 @@   SetUser :: User -> CacheEff m ()   -- | Get a 'User' from the cache   GetUser :: Snowflake User -> CacheEff m (Maybe User)+  -- | Get all 'User's from the cache+  GetUsers :: CacheEff m [User]   -- | Delete a 'User' from the cache   DelUser :: Snowflake User -> CacheEff m () @@ -75,6 +86,8 @@   SetUnavailableGuild :: Snowflake Guild -> CacheEff m ()   -- | Test if a 'Guild' is flagged as unavailable   IsUnavailableGuild :: Snowflake Guild -> CacheEff m Bool+  -- | Get all 'UnavailableGuild's from the cache+  GetUnavailableGuilds :: CacheEff m [Snowflake Guild]   -- | Unflag a 'Guild' from being unavailable   DelUnavailableGuild :: Snowflake Guild -> CacheEff m () @@ -82,6 +95,8 @@   SetMessage :: Message -> CacheEff m ()   -- | Get a 'Message' from the cache   GetMessage :: Snowflake Message -> CacheEff m (Maybe Message)+  -- | Get all 'Message's from the cache+  GetMessages :: CacheEff m [Message]   -- | Delete a 'Message' from the cache   DelMessage :: Snowflake Message -> CacheEff m () 
src/Calamity/Cache/InMemory.hs view
@@ -3,7 +3,7 @@     ( runCacheInMemory ) where  import           Calamity.Cache.Eff-import           Calamity.Internal.MessageStore+import           Calamity.Internal.BoundedStore import qualified Calamity.Internal.SnowflakeMap as SM import           Calamity.Internal.Utils import           Calamity.Types.Model.Channel@@ -15,6 +15,7 @@ import           Control.Monad.State.Strict  import           Data.Default.Class+import           Data.Foldable import qualified Data.HashSet                   as LS import           Data.IORef @@ -30,7 +31,7 @@   , channels          :: SM.SnowflakeMap GuildChannel   , users             :: SM.SnowflakeMap User   , unavailableGuilds :: LS.HashSet (Snowflake Guild)-  , messages          :: MessageStore+  , messages          :: BoundedStore Message   }   deriving ( Generic, Show ) @@ -40,33 +41,37 @@ runCacheInMemory :: P.Member (P.Embed IO) r => P.Sem (CacheEff ': r) a -> P.Sem r a runCacheInMemory m = do   var <- P.embed $ newIORef emptyCache-  P.runAtomicStateIORef var $ P.reinterpret updateCache' m--updateCache' :: P.Member (P.AtomicState Cache) r => CacheEff m a -> P.Sem r a-updateCache' act = P.atomicState' ((swap .) . runState $ updateCache act)+  P.runAtomicStateIORef var $ P.reinterpret runCache' m -updateCache :: CacheEff m a -> State Cache a+runCache' :: P.Member (P.AtomicState Cache) r => CacheEff m a -> P.Sem r a+runCache' act = P.atomicState' ((swap .) . runState $ runCache act) -updateCache (SetBotUser u) = #user ?= u-updateCache GetBotUser     = use #user+runCache :: CacheEff m a -> State Cache a -updateCache (SetGuild g)   = #guilds %= SM.insert g-updateCache (GetGuild gid) = use (#guilds . at gid)-updateCache (DelGuild gid) = #guilds %= sans gid+runCache (SetBotUser u) = #user ?= u+runCache GetBotUser     = use #user +runCache (SetGuild g)   = #guilds %= SM.insert g+runCache (GetGuild gid) = use (#guilds . at gid)+runCache GetGuilds      = SM.elems <$> use #guilds+runCache (DelGuild gid) = #guilds %= sans gid -updateCache (SetDM dm)   = #dms %= SM.insert dm-updateCache (GetDM did) = use (#dms . at did)-updateCache (DelDM did) = #dms %= sans did+runCache (SetDM dm)  = #dms %= SM.insert dm+runCache (GetDM did) = use (#dms . at did)+runCache GetDMs      = SM.elems <$> use #dms+runCache (DelDM did) = #dms %= sans did -updateCache (SetUser u)   = #users %= SM.insert u-updateCache (GetUser uid) = use (#users . at uid)-updateCache (DelUser uid) = #users %= sans uid+runCache (SetUser u)   = #users %= SM.insert u+runCache (GetUser uid) = use (#users . at uid)+runCache GetUsers      = SM.elems <$> use #users+runCache (DelUser uid) = #users %= sans uid -updateCache (SetUnavailableGuild gid) = #unavailableGuilds %= LS.insert gid-updateCache (IsUnavailableGuild gid) = use (#unavailableGuilds . contains gid)-updateCache (DelUnavailableGuild gid) = #unavailableGuilds %= sans gid+runCache (SetUnavailableGuild gid) = #unavailableGuilds %= LS.insert gid+runCache (IsUnavailableGuild gid)  = use (#unavailableGuilds . contains gid)+runCache GetUnavailableGuilds      = LS.toList <$> use #unavailableGuilds+runCache (DelUnavailableGuild gid) = #unavailableGuilds %= sans gid -updateCache (SetMessage m)   = #messages %= addMessage m-updateCache (GetMessage mid) = use (#messages . at mid)-updateCache (DelMessage mid) = #messages %= sans mid+runCache (SetMessage m)   = #messages %= addItem m+runCache (GetMessage mid) = use (#messages . at mid)+runCache GetMessages      = toList <$> use #messages+runCache (DelMessage mid) = #messages %= sans mid
src/Calamity/Client/Client.hs view
@@ -11,13 +11,13 @@ import           Calamity.Gateway.DispatchEvents import           Calamity.Gateway.Types import           Calamity.HTTP.Internal.Ratelimit-import qualified Calamity.Internal.SnowflakeMap              as SM+import qualified Calamity.Internal.SnowflakeMap   as SM import           Calamity.Internal.Updateable import           Calamity.Internal.Utils import           Calamity.Metrics.Eff import           Calamity.Types.Model.Channel-import           Calamity.Types.Model.Guild.UnavailableGuild-import           Calamity.Types.Model.Presence               ( Presence(..) )+import           Calamity.Types.Model.Guild+import           Calamity.Types.Model.Presence    ( Presence(..) ) import           Calamity.Types.Snowflake import           Calamity.Types.Token @@ -33,20 +33,20 @@ import           Data.Time.Clock import           Data.Time.Clock.POSIX import           Data.Traversable-import qualified Data.TypeRepMap                             as TM+import qualified Data.TypeRepMap                  as TM -import qualified DiPolysemy                                  as Di+import qualified DiPolysemy                       as Di  import           Fmt  import           GHC.TypeLits -import qualified Polysemy                                    as P-import qualified Polysemy.Async                              as P-import qualified Polysemy.AtomicState                        as P-import qualified Polysemy.Error                              as P-import qualified Polysemy.Fail                               as P-import qualified Polysemy.Reader                             as P+import qualified Polysemy                         as P+import qualified Polysemy.Async                   as P+import qualified Polysemy.AtomicState             as P+import qualified Polysemy.Error                   as P+import qualified Polysemy.Fail                    as P+import qualified Polysemy.Reader                  as P   timeA :: P.Member (P.Embed IO) r => P.Sem r a -> P.Sem r (Double, a)@@ -219,12 +219,12 @@   updateCache evt   pure $ map (\f -> f oldGuild unavailable) (unwrapEvent @"guilddelete" eh) -handleEvent' eh evt@(GuildBanAdd GuildBanData { guildID, user }) = do+handleEvent' eh evt@(GuildBanAdd BanData { guildID, user }) = do   Just guild <- getGuild guildID   updateCache evt   pure $ map (\f -> f guild user) (unwrapEvent @"guildbanadd" eh) -handleEvent' eh evt@(GuildBanRemove GuildBanData { guildID, user }) = do+handleEvent' eh evt@(GuildBanRemove BanData { guildID, user }) = do   Just guild <- getGuild guildID   updateCache evt   pure $ map (\f -> f guild user) (unwrapEvent @"guildbanremove" eh)
src/Calamity/Client/Types.hs view
@@ -41,7 +41,7 @@ import qualified Polysemy.Reader                 as P  data Client = Client-  { shards        :: TVar [(Shard, Async (Maybe ()))] -- TODO: migrate this to a set of Shard (make Shard hash to it's shardThread)+  { shards        :: TVar [(Shard, Async (Maybe ()))]   , numShards     :: MVar Int   , token         :: Token   , rlState       :: RateLimitState
src/Calamity/Gateway/DispatchEvents.hs view
@@ -5,6 +5,7 @@ import           Calamity.Internal.Utils                     () import           Calamity.Types.Model.Channel import           Calamity.Types.Model.Channel.Message+import           Calamity.Types.Model.Guild.Ban import           Calamity.Types.Model.Guild.Emoji import           Calamity.Types.Model.Guild.Guild import           Calamity.Types.Model.Guild.Member@@ -36,8 +37,8 @@   | GuildCreate Guild   | GuildUpdate UpdatedGuild   | GuildDelete UnavailableGuild-  | GuildBanAdd GuildBanData-  | GuildBanRemove GuildBanData+  | GuildBanAdd BanData+  | GuildBanRemove BanData   | GuildEmojisUpdate GuildEmojisUpdateData   | GuildIntegrationsUpdate GuildIntegrationsUpdateData   | GuildMemberAdd Member@@ -77,13 +78,6 @@   }   deriving ( Show, Generic )   deriving FromJSON via CalamityJSON ChannelPinsUpdateData--data GuildBanData = GuildBanData-  { guildID :: Snowflake Guild-  , user    :: User-  }-  deriving ( Show, Generic )-  deriving FromJSON via CalamityJSON GuildBanData  data GuildEmojisUpdateData = GuildEmojisUpdateData   { guildID :: Snowflake Guild
src/Calamity/HTTP/Channel.hs view
@@ -1,8 +1,8 @@ -- | Channel endpoints module Calamity.HTTP.Channel-    ( ChannelUpdate(..)+    ( ChannelRequest(..)+    , ChannelUpdate(..)     , ChannelMessagesQuery(..)-    , ChannelRequest(..)     , GetReactionsOptions(..)     , CreateChannelInviteOptions(..)     , GroupDMAddRecipientOptions(..) ) where@@ -12,7 +12,6 @@ import           Calamity.Internal.AesonThings import           Calamity.Types.Model.Channel import           Calamity.Types.Model.Guild-import           Calamity.Types.Model.Guild.Overwrite import           Calamity.Types.Model.User import           Calamity.Types.Snowflake @@ -85,30 +84,30 @@   deriving ( ToJSON ) via CalamityJSON GroupDMAddRecipientOptions  data ChannelRequest a where-  CreateMessage            :: (HasID Channel c) => c -> Text -> ChannelRequest Message-  GetMessage               :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest Message-  EditMessage              :: (HasID Channel c, HasID Message m) => c -> m -> Maybe Text -> Maybe Embed -> ChannelRequest Message-  DeleteMessage            :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest ()-  BulkDeleteMessages       :: (HasID Channel c, HasID Message m) => c -> [m] -> ChannelRequest ()-  GetChannel               :: (HasID Channel c) => c -> ChannelRequest Channel-  ModifyChannel            :: (HasID Channel c) => c -> ChannelUpdate -> ChannelRequest Channel-  DeleteChannel            :: (HasID Channel c) => c -> ChannelRequest ()-  GetChannelMessages       :: (HasID Channel c) => c -> Maybe ChannelMessagesQuery -> ChannelRequest [Message]-  CreateReaction           :: (HasID Channel c, HasID Message m) => c -> m -> RawEmoji -> ChannelRequest ()-  DeleteOwnReaction        :: (HasID Channel c, HasID Message m) => c -> m -> RawEmoji -> ChannelRequest ()-  DeleteUserReaction       :: (HasID Channel c, HasID Message m, HasID User u) => c -> m -> RawEmoji -> u -> ChannelRequest ()-  GetReactions             :: (HasID Channel c, HasID Message m) => c -> m -> RawEmoji -> GetReactionsOptions -> ChannelRequest [User]-  DeleteAllReactions       :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest ()-  GetChannelInvites        :: (HasID Channel c) => c -> ChannelRequest [Invite]-  CreateChannelInvite      :: (HasID Channel c) => c -> CreateChannelInviteOptions -> ChannelRequest Invite-  EditChannelPermissions   :: (HasID Channel c) => c -> Overwrite -> ChannelRequest ()-  DeleteChannelPermission  :: (HasID Channel c, HasID Overwrite o) => c -> o -> ChannelRequest ()-  TriggerTyping            :: (HasID Channel c) => c -> ChannelRequest ()-  GetPinnedMessages        :: (HasID Channel c) => c -> ChannelRequest [Message]-  AddPinnedMessage         :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest ()-  DeletePinnedMessage      :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest ()-  GroupDMAddRecipient      :: (HasID Channel c, HasID User u) => c -> u -> GroupDMAddRecipientOptions -> ChannelRequest ()-  GroupDMRemoveRecipient   :: (HasID Channel c, HasID User u) => c -> u -> ChannelRequest ()+  CreateMessage            :: (HasID Channel c) =>                                c -> Text ->                                 ChannelRequest Message+  GetMessage               :: (HasID Channel c, HasID Message m) =>               c -> m ->                                    ChannelRequest Message+  EditMessage              :: (HasID Channel c, HasID Message m) =>               c -> m -> Maybe Text -> Maybe Embed ->       ChannelRequest Message+  DeleteMessage            :: (HasID Channel c, HasID Message m) =>               c -> m ->                                    ChannelRequest ()+  BulkDeleteMessages       :: (HasID Channel c, HasID Message m) =>               c -> [m] ->                                  ChannelRequest ()+  GetChannel               :: (HasID Channel c) =>                                c ->                                         ChannelRequest Channel+  ModifyChannel            :: (HasID Channel c) =>                                c -> ChannelUpdate ->                        ChannelRequest Channel+  DeleteChannel            :: (HasID Channel c) =>                                c ->                                         ChannelRequest ()+  GetChannelMessages       :: (HasID Channel c) =>                                c -> Maybe ChannelMessagesQuery ->           ChannelRequest [Message]+  CreateReaction           :: (HasID Channel c, HasID Message m) =>               c -> m -> RawEmoji ->                        ChannelRequest ()+  DeleteOwnReaction        :: (HasID Channel c, HasID Message m) =>               c -> m -> RawEmoji ->                        ChannelRequest ()+  DeleteUserReaction       :: (HasID Channel c, HasID Message m, HasID User u) => c -> m -> RawEmoji -> u ->                   ChannelRequest ()+  GetReactions             :: (HasID Channel c, HasID Message m) =>               c -> m -> RawEmoji -> GetReactionsOptions -> ChannelRequest [User]+  DeleteAllReactions       :: (HasID Channel c, HasID Message m) =>               c -> m ->                                    ChannelRequest ()+  GetChannelInvites        :: (HasID Channel c) =>                                c ->                                         ChannelRequest [Invite]+  CreateChannelInvite      :: (HasID Channel c) =>                                c -> CreateChannelInviteOptions ->           ChannelRequest Invite+  EditChannelPermissions   :: (HasID Channel c) =>                                c -> Overwrite ->                            ChannelRequest ()+  DeleteChannelPermission  :: (HasID Channel c, HasID Overwrite o) =>             c -> o ->                                    ChannelRequest ()+  TriggerTyping            :: (HasID Channel c) =>                                c ->                                         ChannelRequest ()+  GetPinnedMessages        :: (HasID Channel c) =>                                c ->                                         ChannelRequest [Message]+  AddPinnedMessage         :: (HasID Channel c, HasID Message m) =>               c -> m ->                                    ChannelRequest ()+  DeletePinnedMessage      :: (HasID Channel c, HasID Message m) =>               c -> m ->                                    ChannelRequest ()+  GroupDMAddRecipient      :: (HasID Channel c, HasID User u) =>                  c -> u -> GroupDMAddRecipientOptions ->      ChannelRequest ()+  GroupDMRemoveRecipient   :: (HasID Channel c, HasID User u) =>                  c -> u ->                                    ChannelRequest ()   baseRoute :: Snowflake Channel -> RouteBuilder _
src/Calamity/HTTP/Emoji.hs view
@@ -36,11 +36,11 @@   deriving ( ToJSON ) via CalamityJSON ModifyGuildEmojiOptions  data EmojiRequest a where-  ListGuildEmojis :: (HasID Guild g) => g -> EmojiRequest [Emoji]-  GetGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e -> EmojiRequest Emoji-  CreateGuildEmoji :: (HasID Guild g) => g -> CreateGuildEmojiOptions -> EmojiRequest Emoji+  ListGuildEmojis  :: (HasID Guild g) =>                g ->                                 EmojiRequest [Emoji]+  GetGuildEmoji    :: (HasID Guild g, HasID Emoji e) => g -> e ->                            EmojiRequest Emoji+  CreateGuildEmoji :: (HasID Guild g) =>                g -> CreateGuildEmojiOptions ->      EmojiRequest Emoji   ModifyGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e -> ModifyGuildEmojiOptions -> EmojiRequest Emoji-  DeleteGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e -> EmojiRequest ()+  DeleteGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e ->                            EmojiRequest ()  baseRoute :: Snowflake Guild -> RouteBuilder _ baseRoute id = mkRouteBuilder // S "guilds" // ID @Guild // S "emojis" & giveID id
src/Calamity/HTTP/Guild.hs view
@@ -2,7 +2,15 @@ module Calamity.HTTP.Guild     ( GuildRequest(..)     , CreateGuildData(..)-    , ModifyGuildData(..) ) where+    , ModifyGuildData(..)+    , ChannelCreateData(..)+    , ChannelPosition(..)+    , ListMembersOptions(..)+    , AddGuildMemberData(..)+    , ModifyGuildMemberData(..)+    , CreateGuildBanData(..)+    , ModifyGuildRoleData(..)+    , ModifyGuildRolePositionsData(..) ) where  import           Calamity.HTTP.Internal.Request import           Calamity.HTTP.Internal.Route@@ -10,16 +18,22 @@ import           Calamity.Types.Model.Channel import           Calamity.Types.Model.Guild import           Calamity.Types.Model.User+import           Calamity.Types.Model.Voice import           Calamity.Types.Snowflake +import           Control.Arrow+import           Control.Lens                   hiding ( (.=) )+ import           Data.Aeson-import           Data.Function+import           Data.Maybe import           Data.Text                      ( Text )  import           GHC.Generics  import           Network.Wreq +import           TextShow+ data CreateGuildData = CreateGuildData   { name                        :: Text   , region                      :: Text@@ -40,20 +54,116 @@   , verificationLevel           :: Maybe Integer -- TODO: enums for these   , defaultMessageNotifications :: Maybe Integer   , explicitContentFilter       :: Maybe Integer-  , afkChannelID                :: Maybe (Snowflake Channel)+  , afkChannelID                :: Maybe (Snowflake GuildChannel)   , afkTimeout                  :: Maybe Integer   , ownerID                     :: Maybe (Snowflake User)   , splash                      :: Maybe Text   , banner                      :: Maybe Text-  , systemChannelID             :: Maybe (Snowflake Channel)+  , systemChannelID             :: Maybe (Snowflake GuildChannel)   }   deriving ( Show, Generic )   deriving ( ToJSON ) via CalamityJSON ModifyGuildData +data ChannelCreateData = ChannelCreateData+  { name                 :: Text+  , type_                :: Maybe ChannelType+  , topic                :: Maybe Text+  , bitrate              :: Maybe Integer+  , userLimit            :: Maybe Integer+  , rateLimitPerUser     :: Maybe Integer+  , position             :: Maybe Integer+  , permissionOverwrites :: Maybe [Overwrite]+  , parentID             :: Maybe (Snowflake Category)+  , nsfw                 :: Maybe Bool+  }+  deriving ( Show, Generic )+  deriving ( ToJSON ) via CalamityJSON ChannelCreateData++data ChannelPosition = ChannelPosition+  { id       :: Snowflake GuildChannel+  , position :: Maybe Integer+  }+  deriving ( Show, Generic )+  deriving ( ToJSON ) via CalamityJSON ChannelPosition++data ListMembersOptions = ListMembersOptions+  { limit :: Maybe Integer+  , after :: Maybe (Snowflake User)+  }+  deriving ( Show, Generic )++data AddGuildMemberData = AddGuildMemberData+  { accessToken :: Text+  , nick        :: Maybe Text+  , roles       :: Maybe [Snowflake Role]+  , mute        :: Maybe Bool+  , deaf        :: Maybe Bool+  }+  deriving ( Show, Generic )+  deriving ( ToJSON ) via CalamityJSON AddGuildMemberData++data ModifyGuildMemberData = ModifyGuildMemberData+  { nick      :: Maybe Text+  , roles     :: Maybe [Snowflake Role]+  , mute      :: Maybe Bool+  , deaf      :: Maybe Bool+  , channelID :: Maybe (Snowflake VoiceChannel)+  }+  deriving ( Show, Generic )+  deriving ( ToJSON ) via CalamityJSON ModifyGuildMemberData++data CreateGuildBanData = CreateGuildBanData+  { deleteMessageDays :: Maybe Integer+  , reason            :: Maybe Text+  }+  deriving ( Show, Generic )++data ModifyGuildRoleData = ModifyGuildRoleData+  { name        :: Maybe Text+  , permissions :: Maybe Integer+  , color       :: Maybe Integer+  , hoist       :: Maybe Bool+  , mentionable :: Maybe Bool+  }+  deriving ( Show, Generic )+  deriving ( ToJSON ) via CalamityJSON ModifyGuildRoleData++data ModifyGuildRolePositionsData = ModifyGuildRolePositionsData+  { id       :: Snowflake Role+  , position :: Maybe Integer+  }+  deriving ( Show, Generic )+  deriving ( ToJSON ) via CalamityJSON ModifyGuildRolePositionsData+ data GuildRequest a where-  CreateGuild :: CreateGuildData -> GuildRequest Guild-  GetGuild    :: HasID Guild g => g -> GuildRequest Guild-  ModifyGuild :: HasID Guild g => g -> ModifyGuildData -> GuildRequest Guild+  CreateGuild                 :: CreateGuildData ->                                                                  GuildRequest Guild+  GetGuild                    :: HasID Guild g =>                               g ->                                 GuildRequest Guild+  ModifyGuild                 :: HasID Guild g =>                               g -> ModifyGuildData ->              GuildRequest Guild+  DeleteGuild                 :: HasID Guild g =>                               g ->                                 GuildRequest ()+  GetGuildChannels            :: HasID Guild g =>                               g ->                                 GuildRequest [Channel]+  CreateGuildChannel          :: HasID Guild g =>                               g -> ChannelCreateData ->            GuildRequest Channel+  ModifyGuildChannelPositions :: HasID Guild g =>                               g -> [ChannelPosition] ->            GuildRequest ()+  GetGuildMember              :: (HasID Guild g, HasID User u) =>               g -> u ->                            GuildRequest Member+  ListGuildMembers            :: HasID Guild g =>                               g -> ListMembersOptions ->           GuildRequest [Member]+  AddGuildMember              :: (HasID Guild g, HasID User u) =>               g -> u -> AddGuildMemberData ->      GuildRequest (Maybe Member)+  ModifyGuildMember           :: (HasID Guild g, HasID User u) =>               g -> u -> ModifyGuildMemberData ->   GuildRequest ()+  ModifyCurrentUserNick       :: HasID Guild g =>                               g -> Maybe Text ->                   GuildRequest ()+  AddGuildMemberRole          :: (HasID Guild g, HasID User u, HasID Role r) => g -> u -> r ->                       GuildRequest ()+  RemoveGuildMemberRole       :: (HasID Guild g, HasID User u, HasID Role r) => g -> u -> r ->                       GuildRequest ()+  RemoveGuildMember           :: (HasID Guild g, HasID User u) =>               g -> u ->                            GuildRequest ()+  GetGuildBans                :: HasID Guild g =>                               g ->                                 GuildRequest [BanData]+  GetGuildBan                 :: (HasID Guild g, HasID User u) =>               g -> u ->                            GuildRequest BanData+  CreateGuildBan              :: (HasID Guild g, HasID User u) =>               g -> u -> CreateGuildBanData ->      GuildRequest ()+  RemoveGuildBan              :: (HasID Guild g, HasID User u) =>               g -> u ->                            GuildRequest ()+  GetGuildRoles               :: HasID Guild g =>                               g ->                                 GuildRequest [Role]+  CreateGuildRole             :: HasID Guild g =>                               g -> ModifyGuildRoleData ->          GuildRequest Role+  ModifyGuildRolePositions    :: HasID Guild g =>                               g -> ModifyGuildRolePositionsData -> GuildRequest [Role]+  ModifyGuildRole             :: (HasID Guild g, HasID Role r) =>               g -> r -> ModifyGuildRoleData ->     GuildRequest Role+  DeleteGuildRole             :: (HasID Guild g, HasID Role r) =>               g -> r ->                            GuildRequest ()+  GetGuildPruneCount          :: HasID Guild g =>                               g -> Integer ->                      GuildRequest Integer+  BeginGuildPrune             :: HasID Guild g =>                               g -> Integer -> Bool ->              GuildRequest (Maybe Integer)+  GetGuildVoiceRegions        :: HasID Guild g =>                               g ->                                 GuildRequest [VoiceRegion]+  GetGuildInvites             :: HasID Guild g =>                               g ->                                 GuildRequest [Invite]  baseRoute :: Snowflake Guild -> RouteBuilder _ baseRoute id = mkRouteBuilder // S "guilds" // ID @Guild@@ -66,7 +176,100 @@     & buildRoute   toRoute (ModifyGuild (getID -> gid) _) = baseRoute gid     & buildRoute+  toRoute (DeleteGuild (getID -> gid)) = baseRoute gid+    & buildRoute+  toRoute (GetGuildChannels (getID -> gid)) = baseRoute gid // S "channels"+    & buildRoute+  toRoute (CreateGuildChannel (getID -> gid) _) = baseRoute gid // S "channels"+    & buildRoute+  toRoute (ModifyGuildChannelPositions (getID -> gid) _) = baseRoute gid // S "channels"+    & buildRoute+  toRoute (GetGuildMember (getID -> gid) (getID @User -> uid)) = baseRoute gid // S "members" // ID @User+    & giveID uid+    & buildRoute+  toRoute (ListGuildMembers (getID -> gid) _) = baseRoute gid // S "members"+    & buildRoute+  toRoute (AddGuildMember (getID -> gid) (getID @User -> uid) _) = baseRoute gid // S "members" // ID @User+    & giveID uid+    & buildRoute+  toRoute (ModifyGuildMember (getID -> gid) (getID @User -> uid) _) = baseRoute gid // S "members" // ID @User+    & giveID uid+    & buildRoute+  toRoute (ModifyCurrentUserNick (getID -> gid) _) = baseRoute gid // S "members" // S "@me" // S "nick"+    & buildRoute+  toRoute (AddGuildMemberRole (getID -> gid) (getID @User -> uid) (getID @Role -> rid)) =+    baseRoute gid // S "members" // ID @User // S "roles" // ID @Role+    & giveID uid+    & giveID rid+    & buildRoute+  toRoute (RemoveGuildMemberRole (getID -> gid) (getID @User -> uid) (getID @Role -> rid)) =+    baseRoute gid // S "members" // ID @User // S "roles" // ID @Role+    & giveID uid+    & giveID rid+    & buildRoute+  toRoute (RemoveGuildMember (getID -> gid) (getID @User -> uid)) = baseRoute gid // S "members" // ID @User+    & giveID uid+    & buildRoute+  toRoute (GetGuildBans (getID -> gid)) = baseRoute gid // S "bans"+    & buildRoute+  toRoute (GetGuildBan (getID -> gid) (getID @User -> uid)) = baseRoute gid // S "bans" // ID @User+    & giveID uid+    & buildRoute+  toRoute (CreateGuildBan (getID -> gid) (getID @User -> uid) _) = baseRoute gid // S "bans" // ID @User+    & giveID uid+    & buildRoute+  toRoute (RemoveGuildBan (getID -> gid) (getID @User -> uid)) = baseRoute gid // S "bans" // ID @User+    & giveID uid+    & buildRoute+  toRoute (GetGuildRoles (getID -> gid)) = baseRoute gid // S "roles"+    & buildRoute+  toRoute (CreateGuildRole (getID -> gid) _) = baseRoute gid // S "roles"+    & buildRoute+  toRoute (ModifyGuildRolePositions (getID -> gid) _) = baseRoute gid // S "roles"+    & buildRoute+  toRoute (ModifyGuildRole (getID -> gid) (getID @Role -> rid) _) = baseRoute gid // S "roles" // ID @Role+    & giveID rid+    & buildRoute+  toRoute (DeleteGuildRole (getID -> gid) (getID @Role -> rid)) = baseRoute gid // S "roles" // ID @Role+    & giveID rid+    & buildRoute+  toRoute (GetGuildPruneCount (getID -> gid) _) = baseRoute gid // S "prune"+    & buildRoute+  toRoute (BeginGuildPrune (getID -> gid) _ _) = baseRoute gid // S "prune"+    & buildRoute+  toRoute (GetGuildVoiceRegions (getID -> gid)) = baseRoute gid // S "regions"+    & buildRoute+  toRoute (GetGuildInvites (getID -> gid)) = baseRoute gid // S "invites"+    & buildRoute    toAction (CreateGuild o) = postWith' (toJSON o)   toAction (GetGuild _) = getWith   toAction (ModifyGuild _ o) = patchWith' (toJSON o)+  toAction (DeleteGuild _) = deleteWith+  toAction (GetGuildChannels _) = getWith+  toAction (CreateGuildChannel _ o) = postWith' (toJSON o)+  toAction (ModifyGuildChannelPositions _ o) = postWith' (toJSON o)+  toAction (GetGuildMember _ _) = getWith+  toAction (ListGuildMembers _ ListMembersOptions { limit, after }) = getWithP+    (param "limit" .~ maybeToList (showt <$> limit) >>> param "after" .~ maybeToList (showt <$> after))+  toAction (AddGuildMember _ _ o) = putWith' (toJSON o)+  toAction (ModifyGuildMember _ _ o) = patchWith' (toJSON o)+  toAction (ModifyCurrentUserNick _ nick) = patchWith' (object ["nick" .= nick])+  toAction (AddGuildMemberRole {}) = putEmpty+  toAction (RemoveGuildMemberRole {}) = deleteWith+  toAction (RemoveGuildMember _ _) = deleteWith+  toAction (GetGuildBans _) = getWith+  toAction (GetGuildBan _ _) = getWith+  toAction (CreateGuildBan _ _ CreateGuildBanData { deleteMessageDays, reason }) = putEmptyP+    (param "delete-message-days" .~ maybeToList (showt <$> deleteMessageDays) >>> param "reason" .~ maybeToList+     (showt <$> reason))+  toAction (RemoveGuildBan _ _) = deleteWith+  toAction (GetGuildRoles _) = getWith+  toAction (CreateGuildRole _ o) = postWith' (toJSON o)+  toAction (ModifyGuildRolePositions _ o) = patchWith' (toJSON o)+  toAction (ModifyGuildRole _ _ o) = patchWith' (toJSON o)+  toAction (DeleteGuildRole _ _) = deleteWith+  toAction (GetGuildPruneCount _ d) = getWithP (param "days" .~ [showt d])+  toAction (BeginGuildPrune _ d r) = postEmptyP (param "days" .~ [showt d] >>> param "compute_prune_count" .~ [showt r])+  toAction (GetGuildVoiceRegions _) = getWith+  toAction (GetGuildInvites _) = getWith
src/Calamity/HTTP/Internal/Request.hs view
@@ -5,7 +5,9 @@     , putWith'     , patchWith'     , putEmpty+    , putEmptyP     , postEmpty+    , postEmptyP     , getWithP ) where  import           Calamity.Client.Types@@ -115,6 +117,12 @@  putEmpty :: Options -> String -> IO (Response LB.ByteString) putEmpty o s = putWith o s ("" :: ByteString)++putEmptyP :: (Options -> Options) -> Options -> String -> IO (Response LB.ByteString)+putEmptyP = (putEmpty .)++postEmptyP :: (Options -> Options) -> Options -> String -> IO (Response LB.ByteString)+postEmptyP = (postEmpty .)  getWithP :: (Options -> Options) -> Options -> String -> IO (Response LB.ByteString) getWithP oF o = getWith (oF o)
src/Calamity/HTTP/Internal/Route.hs view
@@ -19,7 +19,6 @@  import           Data.Hashable import           Data.Kind-import           Data.List                    ( lookup ) import           Data.Maybe                   ( fromJust ) import           Data.Text                    ( Text ) import qualified Data.Text                    as T
src/Calamity/HTTP/MiscRoutes.hs view
@@ -10,7 +10,7 @@ import           Network.Wreq  data MiscRequest a where-  GetGateway :: MiscRequest GatewayResponse+  GetGateway    :: MiscRequest GatewayResponse   GetGatewayBot :: MiscRequest BotGatewayResponse  instance Request (MiscRequest a) a where
+ src/Calamity/Internal/BoundedStore.hs view
@@ -0,0 +1,85 @@+-- | A thing for storing the last N things with IDs+module Calamity.Internal.BoundedStore+    ( BoundedStore(..)+    , addItem+    , getItem+    , dropItem ) where++import           Calamity.Internal.Utils+import           Calamity.Types.Snowflake++import           Control.Lens+import           Control.Monad.State.Lazy++import           Data.Default.Class+import           Data.Generics.Labels                 ()+import           Data.HashMap.Lazy                    ( HashMap )+import qualified Data.HashMap.Lazy                    as H++import qualified Deque.Lazy                           as DQ+import           Deque.Lazy                           ( Deque )++import           GHC.Generics++data BoundedStore a = BoundedStore+  { itemQueue :: Deque (Snowflake a)+  , items     :: HashMap (Snowflake a) a+  , limit        :: Int+  , size         :: Int+  }+  deriving ( Show, Generic )++instance Foldable BoundedStore where+  foldr f i = foldr f i . H.elems . items++instance Default (BoundedStore a) where+  def = BoundedStore mempty H.empty 1000 0++type instance (Index (BoundedStore a)) = Snowflake a+type instance (IxValue (BoundedStore a)) = a++instance HasID' a => Ixed (BoundedStore a)++instance HasID' a => At (BoundedStore a) where+  at k f m = f mv <&> \case+    Nothing -> maybe m (const (dropItem k m)) mv+    Just v  -> addItem v m+    where+      mv = getItem k m++  {-# INLINE at #-}++addItem :: HasID' a => a -> BoundedStore a -> BoundedStore a+addItem m = execState $ do+  unlessM (H.member (getID m) <$> use #items) do+    #itemQueue %= DQ.cons (getID m)+    #size += 1++  size <- use #size+  limit <- use #limit++  when (size > limit) do+    q <- use #itemQueue+    let Just (rid, q') = DQ.unsnoc q+    #itemQueue .= q'+    #items %= sans rid+    #size -= 1++  #items %= H.insert (getID m) m++{-# INLINE addItem #-}++getItem :: Snowflake a -> BoundedStore a -> Maybe a+getItem id s = H.lookup id (s ^. #items)++{-# INLINE getItem #-}++dropItem :: Snowflake a -> BoundedStore a -> BoundedStore a+dropItem id = execState $ do+  whenM (H.member id <$> use #items) do+    #size -= 1++  #itemQueue %= DQ.filter (/= id)+  #items %= H.delete id++{-# INLINE dropItem #-}
− src/Calamity/Internal/MessageStore.hs
@@ -1,84 +0,0 @@--- | A thing for storing the last N messages-module Calamity.Internal.MessageStore-    ( MessageStore(..)-    , addMessage-    , getMessage-    , dropMessage ) where--import           Calamity.Internal.Utils-import           Calamity.Types.Model.Channel.Message-import           Calamity.Types.Snowflake--import           Control.Lens-import           Control.Lens.Operators               ( (.=) )-import           Control.Monad.State.Lazy--import           Data.Default.Class-import           Data.Generics.Labels                 ()-import           Data.HashMap.Lazy                    ( HashMap )-import qualified Data.HashMap.Lazy                    as H--import qualified Deque.Lazy                           as DQ-import           Deque.Lazy                           ( Deque )--import           GHC.Generics--data MessageStore = MessageStore-  { messageQueue :: Deque (Snowflake Message)-  , messages     :: HashMap (Snowflake Message) Message-  , limit        :: Int-  , size         :: Int-  }-  deriving ( Show, Generic )--instance Default MessageStore where-  def = MessageStore mempty H.empty 1000 0--type instance (Index MessageStore) = Snowflake Message-type instance (IxValue MessageStore) = Message--instance Ixed MessageStore--instance At MessageStore where-  at k f m = f mv <&> \case-    Nothing -> maybe m (const (dropMessage k m)) mv-    Just v  -> addMessage v m-    where-      mv = getMessage k m--  {-# INLINE at #-}--addMessage :: Message -> MessageStore -> MessageStore-addMessage m = execState $ do-  unlessM (H.member (m ^. #id) <$> use #messages) do-    #messageQueue %= DQ.cons (getID m)-    #size += 1--  size <- use #size-  limit <- use #limit--  when (size > limit) do-    q <- use #messageQueue-    let Just (rid, q') = DQ.unsnoc q-    #messageQueue .= q'-    #messages %= sans rid-    #size -= 1--  #messages %= H.insert (getID m) m--{-# INLINE addMessage #-}--getMessage :: Snowflake Message -> MessageStore -> Maybe Message-getMessage id s = H.lookup id (s ^. #messages)--{-# INLINE getMessage #-}--dropMessage :: Snowflake Message -> MessageStore -> MessageStore-dropMessage id = execState $ do-  whenM (H.member id <$> use #messages) do-    #size -= 1--  #messageQueue %= DQ.filter (/= id)-  #messages %= H.delete id--{-# INLINE dropMessage #-}
src/Calamity/Internal/SnowflakeMap.hs view
@@ -69,7 +69,7 @@ over f =  SnowflakeMap . f . unSnowflakeMap {-# INLINABLE over #-} --- I guess I could just do this by unwrapping everything and using coerceSnowflake+-- SAFETY: 'Snowflake' always uses the underlying hash function (Word64) coerceSnowflakeMap :: HashMap (Snowflake a) v -> HashMap (Snowflake b) v coerceSnowflakeMap = unsafeCoerce {-# INLINABLE coerceSnowflakeMap #-}
src/Calamity/Types/Model/Channel.hs view
@@ -55,9 +55,10 @@       GroupDMType       -> GroupChannel' <$> parseJSON (Object v)  data instance Partial Channel = PartialChannel-  { id    :: Snowflake Channel-  , name  :: Text-  , type_ :: ChannelType+  { id       :: Snowflake Channel+  , name     :: Text+  , type_    :: ChannelType+  , parentID :: Maybe (Snowflake Category)   }   deriving ( Show, Eq, Generic )   deriving ( TextShow ) via TSG.FromGeneric (Partial Channel)
src/Calamity/Types/Model/Guild.hs view
@@ -1,6 +1,7 @@ -- | Discord Guilds module Calamity.Types.Model.Guild-    ( module Calamity.Types.Model.Guild.Emoji+    ( module Calamity.Types.Model.Guild.Ban+    , module Calamity.Types.Model.Guild.Emoji     , module Calamity.Types.Model.Guild.Guild     , module Calamity.Types.Model.Guild.Member     , module Calamity.Types.Model.Guild.Overwrite@@ -8,6 +9,7 @@     , module Calamity.Types.Model.Guild.Role     , module Calamity.Types.Model.Guild.UnavailableGuild ) where +import           Calamity.Types.Model.Guild.Ban import           Calamity.Types.Model.Guild.Emoji import           Calamity.Types.Model.Guild.Guild            hiding ( UpdatedGuild(..) ) import           Calamity.Types.Model.Guild.Invite
+ src/Calamity/Types/Model/Guild/Ban.hs view
@@ -0,0 +1,26 @@+-- | Guild ban objects+module Calamity.Types.Model.Guild.Ban+    ( BanData(..) ) where++import           Calamity.Internal.AesonThings+import           Calamity.Internal.Utils          ()+import           Calamity.Types.Model.Guild.Guild+import           Calamity.Types.Model.User+import           Calamity.Types.Snowflake++import           Data.Aeson++import           GHC.Generics++import           TextShow+import qualified TextShow.Generic                 as TSG++data BanData = BanData+  { guildID :: Snowflake Guild+  , user    :: User+  }+  deriving ( Show, Generic )+  deriving ( FromJSON ) via CalamityJSON BanData+  deriving ( TextShow ) via TSG.FromGeneric BanData+  deriving ( HasID Guild ) via HasIDField "guildID" BanData+  deriving ( HasID User ) via HasIDField "user" BanData
src/Calamity/Types/Model/Voice.hs view
@@ -1,5 +1,7 @@ -- | Voice data types module Calamity.Types.Model.Voice-    ( module Calamity.Types.Model.Voice.VoiceState ) where+    ( module Calamity.Types.Model.Voice.VoiceState+    , module Calamity.Types.Model.Voice.VoiceRegion ) where +import           Calamity.Types.Model.Voice.VoiceRegion import           Calamity.Types.Model.Voice.VoiceState
+ src/Calamity/Types/Model/Voice/VoiceRegion.hs view
@@ -0,0 +1,26 @@+-- | Voice regions+module Calamity.Types.Model.Voice.VoiceRegion+    ( VoiceRegion(..) ) where++import           Calamity.Internal.AesonThings+import           Calamity.Types.Snowflake++import           Data.Aeson+import           Data.Text.Lazy                ( Text )++import           GHC.Generics++import           TextShow+import qualified TextShow.Generic              as TSG++data VoiceRegion = VoiceRegion+  { id         :: Snowflake VoiceRegion+  , name       :: Text+  , vip        :: Bool+  , optimal    :: Bool+  , deprecated :: Bool+  , custom     :: Bool+  }+  deriving ( Show, Eq, Generic )+  deriving ( TextShow ) via TSG.FromGeneric VoiceRegion+  deriving ( ToJSON, FromJSON ) via CalamityJSON VoiceRegion
src/Calamity/Types/Snowflake.hs view
@@ -60,8 +60,8 @@ -- | A newtype wrapper for deriving HasID generically newtype HasIDField field a = HasIDField a -instance HasField' field a (Snowflake b) => HasID b (HasIDField field a) where-  getID (HasIDField a) = a ^. field' @field+instance (HasID b c, HasField' field a c) => HasID b (HasIDField field a) where+  getID (HasIDField a) = getID $ a ^. field' @field  -- | A data `a` which contains an ID of type `Snowflake c` --   which should be swapped with `Snowflake b` upon fetching@@ -69,8 +69,8 @@  type HasIDFieldCoerce' field a = HasIDFieldCoerce field a a -instance HasField' field a (Snowflake c) => HasID b (HasIDFieldCoerce field a c) where-  getID (HasIDFieldCoerce a) = coerceSnowflake $ a ^. field' @field+instance (HasID c d, HasField' field a d) => HasID b (HasIDFieldCoerce field a c) where+  getID (HasIDFieldCoerce a) = coerceSnowflake . getID @c $ a ^. field' @field  instance HasID a (Snowflake a) where   getID = id