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 +35/−2
- calamity.cabal +6/−4
- src/Calamity/Cache/Eff.hs +15/−0
- src/Calamity/Cache/InMemory.hs +29/−24
- src/Calamity/Client/Client.hs +13/−13
- src/Calamity/Client/Types.hs +1/−1
- src/Calamity/Gateway/DispatchEvents.hs +3/−9
- src/Calamity/HTTP/Channel.hs +26/−27
- src/Calamity/HTTP/Emoji.hs +4/−4
- src/Calamity/HTTP/Guild.hs +210/−7
- src/Calamity/HTTP/Internal/Request.hs +8/−0
- src/Calamity/HTTP/Internal/Route.hs +0/−1
- src/Calamity/HTTP/MiscRoutes.hs +1/−1
- src/Calamity/Internal/BoundedStore.hs +85/−0
- src/Calamity/Internal/MessageStore.hs +0/−84
- src/Calamity/Internal/SnowflakeMap.hs +1/−1
- src/Calamity/Types/Model/Channel.hs +4/−3
- src/Calamity/Types/Model/Guild.hs +3/−1
- src/Calamity/Types/Model/Guild/Ban.hs +26/−0
- src/Calamity/Types/Model/Voice.hs +3/−1
- src/Calamity/Types/Model/Voice/VoiceRegion.hs +26/−0
- src/Calamity/Types/Snowflake.hs +4/−4
README.md view
@@ -1,8 +1,41 @@-# Calamity+<h1 align="center">Calamity</h1> -A discord library for haskell+<!-- [](https://hackage.haskell.org/package/calamity) -->+<!-- [](https://gitlab.com/nitros12/calamity/pipelines) -->+<!-- [](https://github.com/nitros12/calamity/blob/master/LICENSE) -->+<!-- [](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