calamity 0.1.27.0 → 0.1.28.0
raw patch · 9 files changed
+309/−164 lines, 9 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Calamity.HTTP.Channel: [$sel:messageReference:CreateMessageOptions] :: CreateMessageOptions -> Maybe MessageReference
+ Calamity.HTTP.Channel: [$sel:repliedUser:AllowedMentions] :: AllowedMentions -> Bool
+ Calamity.HTTP.Channel: [CrosspostMessage] :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest Message
+ Calamity.Internal.AesonThings: data DefaultToTrue
+ Calamity.Internal.AesonThings: instance Data.Reflection.Reifies Calamity.Internal.AesonThings.DefaultToTrue Data.Aeson.Types.Internal.Value
+ Calamity.Types.Model.Channel.Message: ApplicationCommmand :: MessageType
+ Calamity.Types.Model.Channel.Message: MessageReference :: Maybe (Snowflake Message) -> Maybe (Snowflake Channel) -> Maybe (Snowflake Guild) -> Bool -> MessageReference
+ Calamity.Types.Model.Channel.Message: Reply :: MessageType
+ Calamity.Types.Model.Channel.Message: [$sel:activity:Message] :: Message -> Maybe Object
+ Calamity.Types.Model.Channel.Message: [$sel:application:Message] :: Message -> Maybe Object
+ Calamity.Types.Model.Channel.Message: [$sel:channelID:MessageReference] :: MessageReference -> Maybe (Snowflake Channel)
+ Calamity.Types.Model.Channel.Message: [$sel:failIfNotExists:MessageReference] :: MessageReference -> Bool
+ Calamity.Types.Model.Channel.Message: [$sel:flags:Message] :: Message -> Word64
+ Calamity.Types.Model.Channel.Message: [$sel:guildID:MessageReference] :: MessageReference -> Maybe (Snowflake Guild)
+ Calamity.Types.Model.Channel.Message: [$sel:interaction:Message] :: Message -> Maybe Object
+ Calamity.Types.Model.Channel.Message: [$sel:messageID:MessageReference] :: MessageReference -> Maybe (Snowflake Message)
+ Calamity.Types.Model.Channel.Message: [$sel:messageReference:Message] :: Message -> Maybe MessageReference
+ Calamity.Types.Model.Channel.Message: [$sel:referencedMessage:Message] :: Message -> Maybe Message
+ Calamity.Types.Model.Channel.Message: [$sel:stickers:Message] :: Message -> Maybe [Object]
+ Calamity.Types.Model.Channel.Message: data MessageReference
+ Calamity.Types.Model.Channel.Message: instance Data.Aeson.Types.FromJSON.FromJSON Calamity.Types.Model.Channel.Message.MessageReference
+ Calamity.Types.Model.Channel.Message: instance Data.Aeson.Types.ToJSON.ToJSON Calamity.Types.Model.Channel.Message.MessageReference
+ Calamity.Types.Model.Channel.Message: instance GHC.Classes.Eq Calamity.Types.Model.Channel.Message.MessageReference
+ Calamity.Types.Model.Channel.Message: instance GHC.Generics.Generic Calamity.Types.Model.Channel.Message.MessageReference
+ Calamity.Types.Model.Channel.Message: instance GHC.Show.Show Calamity.Types.Model.Channel.Message.MessageReference
+ Calamity.Types.Model.Channel.Message: instance TextShow.Classes.TextShow Calamity.Types.Model.Channel.Message.MessageReference
+ Calamity.Types.Tellable: instance Calamity.Types.Tellable.ToMessage Calamity.Types.Model.Channel.Message.MessageReference
+ Calamity.Types.Tellable: reply :: forall msg r t. (BotC r, ToMessage msg, HasID Channel t, HasID Message t) => t -> msg -> Sem r (Either RestError Message)
+ Calamity.Utils.Message: asReference :: Message -> Bool -> MessageReference
- Calamity.Cache.Eff: delDM :: forall r_a9cSc. MemberWithError CacheEff r_a9cSc => Snowflake DMChannel -> Sem r_a9cSc ()
+ Calamity.Cache.Eff: delDM :: forall r_a9tvv. MemberWithError CacheEff r_a9tvv => Snowflake DMChannel -> Sem r_a9tvv ()
- Calamity.Cache.Eff: delGuild :: forall r_a9cS5. MemberWithError CacheEff r_a9cS5 => Snowflake Guild -> Sem r_a9cS5 ()
+ Calamity.Cache.Eff: delGuild :: forall r_a9tvo. MemberWithError CacheEff r_a9tvo => Snowflake Guild -> Sem r_a9tvo ()
- Calamity.Cache.Eff: delMessage :: forall r_a9cSx. MemberWithError CacheEff r_a9cSx => Snowflake Message -> Sem r_a9cSx ()
+ Calamity.Cache.Eff: delMessage :: forall r_a9tvQ. MemberWithError CacheEff r_a9tvQ => Snowflake Message -> Sem r_a9tvQ ()
- Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9cSq. MemberWithError CacheEff r_a9cSq => Snowflake Guild -> Sem r_a9cSq ()
+ Calamity.Cache.Eff: delUnavailableGuild :: forall r_a9tvJ. MemberWithError CacheEff r_a9tvJ => Snowflake Guild -> Sem r_a9tvJ ()
- Calamity.Cache.Eff: delUser :: forall r_a9cSj. MemberWithError CacheEff r_a9cSj => Snowflake User -> Sem r_a9cSj ()
+ Calamity.Cache.Eff: delUser :: forall r_a9tvC. MemberWithError CacheEff r_a9tvC => Snowflake User -> Sem r_a9tvC ()
- Calamity.Cache.Eff: getBotUser :: forall r_a9cRX. MemberWithError CacheEff r_a9cRX => Sem r_a9cRX (Maybe User)
+ Calamity.Cache.Eff: getBotUser :: forall r_a9tvg. MemberWithError CacheEff r_a9tvg => Sem r_a9tvg (Maybe User)
- Calamity.Cache.Eff: getDM :: forall r_a9cS9. MemberWithError CacheEff r_a9cS9 => Snowflake DMChannel -> Sem r_a9cS9 (Maybe DMChannel)
+ Calamity.Cache.Eff: getDM :: forall r_a9tvs. MemberWithError CacheEff r_a9tvs => Snowflake DMChannel -> Sem r_a9tvs (Maybe DMChannel)
- Calamity.Cache.Eff: getDMs :: forall r_a9cSb. MemberWithError CacheEff r_a9cSb => Sem r_a9cSb [DMChannel]
+ Calamity.Cache.Eff: getDMs :: forall r_a9tvu. MemberWithError CacheEff r_a9tvu => Sem r_a9tvu [DMChannel]
- Calamity.Cache.Eff: getGuild :: forall r_a9cS0. MemberWithError CacheEff r_a9cS0 => Snowflake Guild -> Sem r_a9cS0 (Maybe Guild)
+ Calamity.Cache.Eff: getGuild :: forall r_a9tvj. MemberWithError CacheEff r_a9tvj => Snowflake Guild -> Sem r_a9tvj (Maybe Guild)
- Calamity.Cache.Eff: getGuildChannel :: forall r_a9cS2. MemberWithError CacheEff r_a9cS2 => Snowflake GuildChannel -> Sem r_a9cS2 (Maybe GuildChannel)
+ Calamity.Cache.Eff: getGuildChannel :: forall r_a9tvl. MemberWithError CacheEff r_a9tvl => Snowflake GuildChannel -> Sem r_a9tvl (Maybe GuildChannel)
- Calamity.Cache.Eff: getGuilds :: forall r_a9cS4. MemberWithError CacheEff r_a9cS4 => Sem r_a9cS4 [Guild]
+ Calamity.Cache.Eff: getGuilds :: forall r_a9tvn. MemberWithError CacheEff r_a9tvn => Sem r_a9tvn [Guild]
- Calamity.Cache.Eff: getMessage :: forall r_a9cSu. MemberWithError CacheEff r_a9cSu => Snowflake Message -> Sem r_a9cSu (Maybe Message)
+ Calamity.Cache.Eff: getMessage :: forall r_a9tvN. MemberWithError CacheEff r_a9tvN => Snowflake Message -> Sem r_a9tvN (Maybe Message)
- Calamity.Cache.Eff: getMessages :: forall r_a9cSw. MemberWithError CacheEff r_a9cSw => Sem r_a9cSw [Message]
+ Calamity.Cache.Eff: getMessages :: forall r_a9tvP. MemberWithError CacheEff r_a9tvP => Sem r_a9tvP [Message]
- Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9cSp. MemberWithError CacheEff r_a9cSp => Sem r_a9cSp [Snowflake Guild]
+ Calamity.Cache.Eff: getUnavailableGuilds :: forall r_a9tvI. MemberWithError CacheEff r_a9tvI => Sem r_a9tvI [Snowflake Guild]
- Calamity.Cache.Eff: getUser :: forall r_a9cSg. MemberWithError CacheEff r_a9cSg => Snowflake User -> Sem r_a9cSg (Maybe User)
+ Calamity.Cache.Eff: getUser :: forall r_a9tvz. MemberWithError CacheEff r_a9tvz => Snowflake User -> Sem r_a9tvz (Maybe User)
- Calamity.Cache.Eff: getUsers :: forall r_a9cSi. MemberWithError CacheEff r_a9cSi => Sem r_a9cSi [User]
+ Calamity.Cache.Eff: getUsers :: forall r_a9tvB. MemberWithError CacheEff r_a9tvB => Sem r_a9tvB [User]
- Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9cSn. MemberWithError CacheEff r_a9cSn => Snowflake Guild -> Sem r_a9cSn Bool
+ Calamity.Cache.Eff: isUnavailableGuild :: forall r_a9tvG. MemberWithError CacheEff r_a9tvG => Snowflake Guild -> Sem r_a9tvG Bool
- Calamity.Cache.Eff: setBotUser :: forall r_a9cRV. MemberWithError CacheEff r_a9cRV => User -> Sem r_a9cRV ()
+ Calamity.Cache.Eff: setBotUser :: forall r_a9tve. MemberWithError CacheEff r_a9tve => User -> Sem r_a9tve ()
- Calamity.Cache.Eff: setDM :: forall r_a9cS7. MemberWithError CacheEff r_a9cS7 => DMChannel -> Sem r_a9cS7 ()
+ Calamity.Cache.Eff: setDM :: forall r_a9tvq. MemberWithError CacheEff r_a9tvq => DMChannel -> Sem r_a9tvq ()
- Calamity.Cache.Eff: setGuild :: forall r_a9cRY. MemberWithError CacheEff r_a9cRY => Guild -> Sem r_a9cRY ()
+ Calamity.Cache.Eff: setGuild :: forall r_a9tvh. MemberWithError CacheEff r_a9tvh => Guild -> Sem r_a9tvh ()
- Calamity.Cache.Eff: setMessage :: forall r_a9cSs. MemberWithError CacheEff r_a9cSs => Message -> Sem r_a9cSs ()
+ Calamity.Cache.Eff: setMessage :: forall r_a9tvL. MemberWithError CacheEff r_a9tvL => Message -> Sem r_a9tvL ()
- Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9cSl. MemberWithError CacheEff r_a9cSl => Snowflake Guild -> Sem r_a9cSl ()
+ Calamity.Cache.Eff: setUnavailableGuild :: forall r_a9tvE. MemberWithError CacheEff r_a9tvE => Snowflake Guild -> Sem r_a9tvE ()
- Calamity.Cache.Eff: setUser :: forall r_a9cSe. MemberWithError CacheEff r_a9cSe => User -> Sem r_a9cSe ()
+ Calamity.Cache.Eff: setUser :: forall r_a9tvx. MemberWithError CacheEff r_a9tvx => User -> Sem r_a9tvx ()
- Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a6THv. MemberWithError ParsePrefix r_a6THv => Message -> Sem r_a6THv (Maybe (Text, Text))
+ Calamity.Commands.ParsePrefix: parsePrefix :: forall r_a4Vif. MemberWithError ParsePrefix r_a4Vif => Message -> Sem r_a4Vif (Maybe (Text, Text))
- Calamity.HTTP.Channel: AllowedMentions :: [AllowedMentionType] -> [Snowflake Role] -> [Snowflake User] -> AllowedMentions
+ Calamity.HTTP.Channel: AllowedMentions :: [AllowedMentionType] -> [Snowflake Role] -> [Snowflake User] -> Bool -> AllowedMentions
- Calamity.HTTP.Channel: CreateMessageOptions :: Maybe Text -> Maybe Text -> Maybe Bool -> Maybe (Text, ByteString) -> Maybe Embed -> Maybe AllowedMentions -> CreateMessageOptions
+ Calamity.HTTP.Channel: CreateMessageOptions :: Maybe Text -> Maybe Text -> Maybe Bool -> Maybe (Text, ByteString) -> Maybe Embed -> Maybe AllowedMentions -> Maybe MessageReference -> CreateMessageOptions
- Calamity.Internal.LocalWriter: llisten :: forall o_arPK r_arXh a_XrPK. MemberWithError (LocalWriter o_arPK) r_arXh => Sem r_arXh a_XrPK -> Sem r_arXh (o_arPK, a_XrPK)
+ Calamity.Internal.LocalWriter: llisten :: forall o_arRe r_arYL a_XrRe. MemberWithError (LocalWriter o_arRe) r_arYL => Sem r_arYL a_XrRe -> Sem r_arYL (o_arRe, a_XrRe)
- Calamity.Internal.LocalWriter: ltell :: forall o_arPG r_arXf. MemberWithError (LocalWriter o_arPG) r_arXf => o_arPG -> Sem r_arXf ()
+ Calamity.Internal.LocalWriter: ltell :: forall o_arRa r_arYJ. MemberWithError (LocalWriter o_arRa) r_arYJ => o_arRa -> Sem r_arYJ ()
- Calamity.Metrics.Eff: addCounter :: forall r_avtG. MemberWithError MetricEff r_avtG => Int -> Counter -> Sem r_avtG Int
+ Calamity.Metrics.Eff: addCounter :: forall r_avva. MemberWithError MetricEff r_avva => Int -> Counter -> Sem r_avva Int
- Calamity.Metrics.Eff: modifyGauge :: forall r_avtJ. MemberWithError MetricEff r_avtJ => (Double -> Double) -> Gauge -> Sem r_avtJ Double
+ Calamity.Metrics.Eff: modifyGauge :: forall r_avvd. MemberWithError MetricEff r_avvd => (Double -> Double) -> Gauge -> Sem r_avvd Double
- Calamity.Metrics.Eff: observeHistogram :: forall r_avtM. MemberWithError MetricEff r_avtM => Double -> Histogram -> Sem r_avtM HistogramSample
+ Calamity.Metrics.Eff: observeHistogram :: forall r_avvg. MemberWithError MetricEff r_avvg => Double -> Histogram -> Sem r_avvg HistogramSample
- Calamity.Metrics.Eff: registerCounter :: forall r_avtw. MemberWithError MetricEff r_avtw => Text -> [(Text, Text)] -> Sem r_avtw Counter
+ Calamity.Metrics.Eff: registerCounter :: forall r_avv0. MemberWithError MetricEff r_avv0 => Text -> [(Text, Text)] -> Sem r_avv0 Counter
- Calamity.Metrics.Eff: registerGauge :: forall r_avtz. MemberWithError MetricEff r_avtz => Text -> [(Text, Text)] -> Sem r_avtz Gauge
+ Calamity.Metrics.Eff: registerGauge :: forall r_avv3. MemberWithError MetricEff r_avv3 => Text -> [(Text, Text)] -> Sem r_avv3 Gauge
- Calamity.Metrics.Eff: registerHistogram :: forall r_avtC. MemberWithError MetricEff r_avtC => Text -> [(Text, Text)] -> [Double] -> Sem r_avtC Histogram
+ Calamity.Metrics.Eff: registerHistogram :: forall r_avv6. MemberWithError MetricEff r_avv6 => Text -> [(Text, Text)] -> [Double] -> Sem r_avv6 Histogram
- Calamity.Types.Model.Channel.Message: Message :: Snowflake Message -> Snowflake Channel -> Maybe (Snowflake Guild) -> Snowflake User -> Text -> UTCTime -> Maybe UTCTime -> Bool -> Bool -> Vector (Snowflake User) -> Vector (Snowflake Role) -> Maybe (Vector (Snowflake Channel)) -> ![Attachment] -> ![Embed] -> ![Reaction] -> Maybe (Snowflake Message) -> Bool -> Maybe (Snowflake ()) -> !MessageType -> Message
+ Calamity.Types.Model.Channel.Message: Message :: Snowflake Message -> Snowflake Channel -> Maybe (Snowflake Guild) -> Snowflake User -> Text -> UTCTime -> Maybe UTCTime -> Bool -> Bool -> Vector (Snowflake User) -> Vector (Snowflake Role) -> Maybe (Vector (Snowflake Channel)) -> ![Attachment] -> ![Embed] -> ![Reaction] -> Maybe (Snowflake Message) -> Bool -> Maybe (Snowflake Webhook) -> !MessageType -> Maybe Object -> Maybe Object -> Maybe MessageReference -> Word64 -> Maybe [Object] -> Maybe Message -> Maybe Object -> Message
- Calamity.Types.Model.Channel.Message: [$sel:webhookID:Message] :: Message -> Maybe (Snowflake ())
+ Calamity.Types.Model.Channel.Message: [$sel:webhookID:Message] :: Message -> Maybe (Snowflake Webhook)
Files
- Calamity/HTTP/Channel.hs +16/−3
- Calamity/Internal/AesonThings.hs +6/−0
- Calamity/Types/Model/Channel.hs +1/−1
- Calamity/Types/Model/Channel/Message.hs +86/−49
- Calamity/Types/Model/Channel/Message.hs-boot +7/−1
- Calamity/Types/Tellable.hs +75/−45
- Calamity/Utils/Message.hs +100/−63
- ChangeLog.md +16/−0
- calamity.cabal +2/−2
Calamity/HTTP/Channel.hs view
@@ -46,6 +46,7 @@ , file :: Maybe (Text, ByteString) , embed :: Maybe Embed , allowedMentions :: Maybe AllowedMentions+ , messageReference :: Maybe MessageReference } deriving (Show, Generic, Default) @@ -64,13 +65,17 @@ { parse :: [AllowedMentionType] , roles :: [Snowflake Role] , users :: [Snowflake User]+ , repliedUser :: Bool }- deriving (Show, Generic, Default)+ deriving (Show, Generic) deriving (ToJSON) via CalamityJSON AllowedMentions +instance Default AllowedMentions where+ def = AllowedMentions def def def False+ instance Semigroup AllowedMentions where- AllowedMentions p0 r0 u0 <> AllowedMentions p1 r1 u1 =- AllowedMentions (p0 <> p1) (r0 <> r1) (u0 <> u1)+ AllowedMentions p0 r0 u0 ru0 <> AllowedMentions p1 r1 u1 ru1 =+ AllowedMentions (p0 <> p1) (r0 <> r1) (u0 <> u1) (ru0 || ru1) instance Monoid AllowedMentions where mempty = def@@ -80,6 +85,8 @@ , nonce :: Maybe Text , tts :: Maybe Bool , embed :: Maybe Embed+ , allowedMentions :: Maybe AllowedMentions+ , messageReference :: Maybe MessageReference } deriving (Show, Generic) deriving (ToJSON) via CalamityJSON CreateMessageJson@@ -167,6 +174,7 @@ data ChannelRequest a where CreateMessage :: (HasID Channel c) => c -> CreateMessageOptions -> ChannelRequest Message+ CrosspostMessage :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest Message GetMessage :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest Message EditMessage :: (HasID Channel c, HasID Message m) => c -> m -> EditMessageData -> ChannelRequest Message DeleteMessage :: (HasID Channel c, HasID Message m) => c -> m -> ChannelRequest ()@@ -202,6 +210,10 @@ route (CreateMessage (getID -> id) _) = baseRoute id // S "messages" & buildRoute+ route (CrosspostMessage (getID -> id) (getID @Message -> mid)) =+ baseRoute id // S "messages" // ID @Message+ & giveID mid+ & buildRoute route (GetChannel (getID -> id)) = baseRoute id & buildRoute@@ -298,6 +310,7 @@ } body <- reqBodyMultipart [filePart, partLBS "payload_json" (encode . upcast @CreateMessageJson $ cm)] postWith' body u o+ action (CrosspostMessage _ _) = postEmpty action (GetChannel _) = getWith action (ModifyChannel _ p) = putWith' (ReqBodyJson p) action (DeleteChannel _) = deleteWith
Calamity/Internal/AesonThings.hs view
@@ -8,6 +8,7 @@ , DefaultToEmptyArray , DefaultToZero , DefaultToFalse+ , DefaultToTrue , CalamityJSON(..) , CalamityJSONKeepNothing(..) , jsonOptions@@ -106,6 +107,11 @@ instance Reifies DefaultToFalse Value where reflect _ = Bool False++data DefaultToTrue++instance Reifies DefaultToTrue Value where+ reflect _ = Bool True newtype CalamityJSON a = CalamityJSON { unCalamityJSON :: a
Calamity/Types/Model/Channel.hs view
@@ -19,7 +19,7 @@ import Calamity.Types.Model.Channel.Embed import Calamity.Types.Model.Channel.Group import Calamity.Types.Model.Channel.Guild-import {-# SOURCE #-} Calamity.Types.Model.Channel.Message+import Calamity.Types.Model.Channel.Message import Calamity.Types.Model.Channel.Reaction import Calamity.Types.Model.Channel.Webhook import Calamity.Types.Partial
Calamity/Types/Model/Channel/Message.hs view
@@ -1,60 +1,93 @@ -- | A message from a channel-module Calamity.Types.Model.Channel.Message- ( Message(..)- , MessageType(..) ) where+module Calamity.Types.Model.Channel.Message (+ Message (..),+ MessageType (..),+ MessageReference (..),+) where -import Calamity.Internal.AesonThings-import Calamity.Internal.Utils ()-import Calamity.Types.Model.Channel+import Calamity.Internal.AesonThings+import Calamity.Internal.Utils ()+import {-# SOURCE #-} Calamity.Types.Model.Channel+import Calamity.Types.Model.Channel.Attachment+import Calamity.Types.Model.Channel.Embed+import Calamity.Types.Model.Channel.Reaction+import Calamity.Types.Model.Channel.Webhook import {-# SOURCE #-} Calamity.Types.Model.Guild.Guild-import Calamity.Types.Model.Guild.Role-import Calamity.Types.Model.User-import Calamity.Types.Snowflake+import Calamity.Types.Model.Guild.Role+import Calamity.Types.Model.User+import Calamity.Types.Snowflake -import Data.Aeson-import Data.Scientific-import Data.Text.Lazy ( Text )-import Data.Time-import qualified Data.Vector.Unboxing as UV+import Data.Aeson+import Data.Scientific+import Data.Text.Lazy (Text)+import Data.Time+import qualified Data.Vector.Unboxing as UV -import GHC.Generics+import GHC.Generics -import TextShow-import qualified TextShow.Generic as TSG+import Data.Word (Word64)+import TextShow+import qualified TextShow.Generic as TSG --- NOTE: make sure we fill in the guildID field when retrieving from REST data Message = Message- { id :: Snowflake Message- , channelID :: Snowflake Channel- , guildID :: Maybe (Snowflake Guild)- , author :: Snowflake User- , content :: Text- , timestamp :: UTCTime+ { id :: Snowflake Message+ , channelID :: Snowflake Channel+ , guildID :: Maybe (Snowflake Guild)+ , author :: Snowflake User+ , content :: Text+ , timestamp :: UTCTime , editedTimestamp :: Maybe UTCTime- , tts :: Bool+ , tts :: Bool , mentionEveryone :: Bool- , mentions :: UV.Vector (Snowflake User)- , mentionRoles :: UV.Vector (Snowflake Role)+ , mentions :: UV.Vector (Snowflake User)+ , mentionRoles :: UV.Vector (Snowflake Role) , mentionChannels :: Maybe (UV.Vector (Snowflake Channel))- , attachments :: ![Attachment]- , embeds :: ![Embed]- , reactions :: ![Reaction]- , nonce :: Maybe (Snowflake Message)- , pinned :: Bool- , webhookID :: Maybe (Snowflake ())- , type_ :: !MessageType+ , attachments :: ![Attachment]+ , embeds :: ![Embed]+ , reactions :: ![Reaction]+ , nonce :: Maybe (Snowflake Message)+ , pinned :: Bool+ , webhookID :: Maybe (Snowflake Webhook)+ , type_ :: !MessageType+ , activity :: Maybe Object+ , application :: Maybe Object+ , messageReference :: Maybe MessageReference+ , flags :: Word64+ , stickers :: Maybe [Object]+ , referencedMessage :: Maybe Message+ , interaction :: Maybe Object }- deriving ( Eq, Show, Generic )- deriving ( TextShow ) via TSG.FromGeneric Message- deriving ( FromJSON ) via WithSpecialCases- '["author" `ExtractFieldFrom` "id", "mentions" `ExtractArrayField` "id",- "mention_channels" `ExtractArrayField` "id",- "reactions" `IfNoneThen` DefaultToEmptyArray]- Message- deriving ( HasID Message ) via HasIDField "id" Message- deriving ( HasID Channel ) via HasIDField "channelID" Message- deriving ( HasID User ) via HasIDField "author" Message+ deriving (Eq, Show, Generic)+ deriving (TextShow) via TSG.FromGeneric Message+ deriving+ (FromJSON)+ via WithSpecialCases+ '[ "author" `ExtractFieldFrom` "id"+ , "mentions" `ExtractArrayField` "id"+ , "mention_channels" `ExtractArrayField` "id"+ , "reactions" `IfNoneThen` DefaultToEmptyArray+ ]+ Message+ deriving (HasID Message) via HasIDField "id" Message+ deriving (HasID Channel) via HasIDField "channelID" Message+ deriving (HasID User) via HasIDField "author" Message +data MessageReference = MessageReference+ { messageID :: Maybe (Snowflake Message)+ , channelID :: Maybe (Snowflake Channel)+ , guildID :: Maybe (Snowflake Guild)+ , failIfNotExists :: Bool+ }+ deriving (Eq, Show, Generic)+ deriving (TextShow) via TSG.FromGeneric MessageReference+ deriving+ (FromJSON)+ via WithSpecialCases+ '[ "fail_if_not_exists" `IfNoneThen` DefaultToTrue+ ]+ MessageReference+ deriving (ToJSON) via CalamityJSON MessageReference+ -- Thanks sbrg (https://github.com/saevarb/haskord/blob/d1bb07bcc4f3dbc29f2dfd3351ff9f16fc100c07/haskord-lib/src/Haskord/Types/Common.hs#L264) data MessageType = Default@@ -72,12 +105,14 @@ | ChannelFollowAdd | GuildDiscoveryDisqualified | GuildDiscoveryRequalified- deriving ( Eq, Show, Enum, Generic )- deriving ( TextShow ) via TSG.FromGeneric MessageType+ | Reply+ | ApplicationCommmand+ deriving (Eq, Show, Enum, Generic)+ deriving (TextShow) via TSG.FromGeneric MessageType instance FromJSON MessageType where parseJSON = withScientific "MessageType" $ \n -> case toBoundedInteger @Int n of- Just !v -> case v of+ Just !v -> case v of 0 -> pure Default 1 -> pure RecipientAdd 2 -> pure RecipientRemove@@ -91,7 +126,9 @@ 10 -> pure UserPremiumGuildSubscriptionTier2 11 -> pure UserPremiumGuildSubscriptionTier3 12 -> pure ChannelFollowAdd- 13 -> pure GuildDiscoveryDisqualified- 14 -> pure GuildDiscoveryRequalified+ 14 -> pure GuildDiscoveryDisqualified+ 15 -> pure GuildDiscoveryRequalified+ 19 -> pure Reply+ 20 -> pure ApplicationCommmand _ -> fail $ "Invalid MessageType: " <> show n Nothing -> fail $ "Invalid MessageType: " <> show n
Calamity/Types/Model/Channel/Message.hs-boot view
@@ -1,7 +1,8 @@ -- | A message from a channel module Calamity.Types.Model.Channel.Message ( Message- , MessageType ) where+ , MessageType+ , MessageReference ) where data Message @@ -12,3 +13,8 @@ instance Show MessageType instance Eq MessageType++data MessageReference++instance Show MessageReference+instance Eq MessageReference
Calamity/Types/Tellable.hs view
@@ -1,48 +1,54 @@ -- | Things that are messageable-module Calamity.Types.Tellable- ( ToMessage(..)- , Tellable(..)- , TFile(..)- , TMention(..)- , tell ) where+module Calamity.Types.Tellable (+ ToMessage (..),+ Tellable (..),+ TFile (..),+ TMention (..),+ tell,+ reply,+) where -import Calamity.Client.Types-import Calamity.HTTP-import Calamity.Types.Model.Channel-import Calamity.Types.Model.Guild-import Calamity.Types.Model.User-import Calamity.Types.Snowflake+import Calamity.Client.Types+import Calamity.HTTP+import Calamity.Types.Model.Channel+import Calamity.Types.Model.Guild+import Calamity.Types.Model.User+import Calamity.Types.Snowflake -import Control.Lens+import Control.Lens -import Data.ByteString.Lazy ( ByteString )-import Data.Default.Class-import Data.Monoid-import qualified Data.Text as S-import qualified Data.Text.Lazy as L+import Data.ByteString.Lazy (ByteString)+import Data.Default.Class+import Data.Monoid+import qualified Data.Text as S+import qualified Data.Text.Lazy as L -import GHC.Generics+import GHC.Generics -import qualified Polysemy as P-import qualified Polysemy.Error as P+import qualified Polysemy as P+import qualified Polysemy.Error as P -- | A wrapper type for sending files-data TFile = TFile- S.Text -- ^ The filename- ByteString -- ^ The content- deriving ( Show, Generic )+data TFile+ = TFile+ S.Text+ -- ^ The filename+ ByteString+ -- ^ The content+ deriving (Show, Generic) -- | A wrapper type for allowing mentions newtype TMention a = TMention (Snowflake a)- deriving ( Show, Generic )+ deriving (Show, Generic) --- | Things that can be used to send a message------ Can be used to compose text, embeds, and files. /e.g./------ @--- 'intoMsg' @'L.Text' "A message" '<>' 'intoMsg' @'Embed' ('def' '&' #description '?~' "Embed description")--- @+{- | Things that can be used to send a message++ Can be used to compose text, embeds, and files. /e.g./++ @+ 'intoMsg' @'L.Text' "A message" '<>' 'intoMsg' @'Embed' ('def' '&' #description '?~' "Embed description")+ @+-} class ToMessage a where -- | Turn @a@ into a 'CreateMessageOptions' builder intoMsg :: a -> Endo CreateMessageOptions@@ -83,6 +89,10 @@ instance ToMessage (TMention Role) where intoMsg (TMention s) = intoMsg (def @AllowedMentions & #roles <>~ [s]) +-- | Set a 'MessageReference' as the message to reply to+instance ToMessage MessageReference where+ intoMsg ref = Endo (#messageReference ?~ ref)+ instance ToMessage (Endo CreateMessageOptions) where intoMsg = Prelude.id @@ -98,22 +108,42 @@ runToMessage :: ToMessage a => a -> CreateMessageOptions runToMessage = flip appEndo def . intoMsg --- | Send a message to something that is messageable------ To send a string literal you'll probably want to use @TypeApplication@ to--- specify the type of @msg@------ ==== Examples------ Sending a string:------ @--- 'void' $ 'tell' @'Text' m ("Somebody told me to tell you about: " '<>' s)--- @+{- | Send a message to something that is messageable++ To send a string literal you'll probably want to use @TypeApplication@ to+ specify the type of @msg@++ ==== Examples++ Sending a string:++ @+ 'void' $ 'tell' @'Text' m ("Somebody told me to tell you about: " '<>' s)+ @+-} tell :: forall msg r t. (BotC r, ToMessage msg, Tellable t) => t -> msg -> P.Sem r (Either RestError Message) tell target (runToMessage -> msg) = P.runError $ do cid <- getChannel target r <- invoke $ CreateMessage cid msg+ P.fromEither r++{- | Create a reply to an existing message in the same channel++ To send a string literal you'll probably want to use @TypeApplication@ to+ specify the type of @msg@++ ==== Examples++ Sending a string:++ @+ 'void' $ 'reply' @'Text' msgToReplyTo ("Somebody told me to tell you about: " '<>' s)+ @+-}+reply :: forall msg r t. (BotC r, ToMessage msg, HasID Channel t, HasID Message t) => t -> msg -> P.Sem r (Either RestError Message)+reply target msg = P.runError $ do+ let msg' = runToMessage (intoMsg msg <> intoMsg (MessageReference (Just $ getID @Message target) (Just $ getID @Channel target) Nothing False))+ r <- invoke $ CreateMessage (getID @Channel target) msg' P.fromEither r instance Tellable DMChannel where
Calamity/Utils/Message.hs view
@@ -1,39 +1,48 @@ -- | Things for formatting things-module Calamity.Utils.Message- ( codeblock,- codeblock',- codeline,- escapeCodeblocks,- escapeCodelines,- escapeBold,- escapeStrike,- escapeUnderline,- escapeSpoilers,- escapeFormatting,- bold,- strike,- underline,- quote,- quoteAll,- spoiler,- zws,- fmtEmoji,- displayUser,- Mentionable (..),- )-where+module Calamity.Utils.Message (+ codeblock,+ codeblock',+ codeline,+ escapeCodeblocks,+ escapeCodelines,+ escapeBold,+ escapeStrike,+ escapeUnderline,+ escapeSpoilers,+ escapeFormatting,+ bold,+ strike,+ underline,+ quote,+ quoteAll,+ spoiler,+ zws,+ fmtEmoji,+ displayUser,+ Mentionable (..),+ asReference,+) where -import Calamity.Types.Model.Channel (Category, Channel, DMChannel, GuildChannel, TextChannel, VoiceChannel)-import Calamity.Types.Model.Guild (Emoji(..), Member, Role)+import Calamity.Types.Model.Channel (+ Category,+ Channel,+ DMChannel,+ GuildChannel,+ Message,+ MessageReference(MessageReference),+ TextChannel,+ VoiceChannel,+ )+import Calamity.Types.Model.Guild (Emoji (..), Member, Role) import Calamity.Types.Model.User (User) import Calamity.Types.Snowflake import Control.Lens+import Data.Foldable (Foldable (foldl')) import Data.Generics.Product.Fields import Data.Maybe (fromMaybe) import Data.String (IsString, fromString) import qualified Data.Text.Lazy as L import TextShow (TextShow (showtl))-import Data.Foldable (Foldable(foldl')) zws :: IsString s => s zws = fromString "\x200b"@@ -66,50 +75,63 @@ escapeFormatting :: L.Text -> L.Text escapeFormatting = foldl' (.) Prelude.id [escapeCodelines, escapeCodeblocks, escapeBold, escapeStrike, escapeUnderline, escapeSpoilers, escapeFormatting] --- | Formats a lang and content into a codeblock------ >>> codeblock "hs" "x = y"--- "```hs\nx = y\n```"------ Any codeblocks in the @content@ are escaped-codeblock :: L.Text -- ^ language- -> L.Text -- ^ content- -> L.Text+{- | Formats a lang and content into a codeblock++ >>> codeblock "hs" "x = y"+ "```hs\nx = y\n```"++ Any codeblocks in the @content@ are escaped+-}+codeblock ::+ -- | language+ L.Text ->+ -- | content+ L.Text ->+ L.Text codeblock lang = codeblock' (Just lang) --- | Formats an optional lang and content into a codeblock------ Any codeblocks in the @content@ are escaped-codeblock' :: Maybe L.Text -- ^ language- -> L.Text -- ^ content- -> L.Text-codeblock' lang content = "```" <> fromMaybe "" lang <> "\n" <>- escapeCodeblocks content <>- "\n```"+{- | Formats an optional lang and content into a codeblock --- | Formats some content into a code line------ This always uses @``@ code lines as they can be escaped------ Any code lines in the content are escaped+ Any codeblocks in the @content@ are escaped+-}+codeblock' ::+ -- | language+ Maybe L.Text ->+ -- | content+ L.Text ->+ L.Text+codeblock' lang content =+ "```" <> fromMaybe "" lang <> "\n"+ <> escapeCodeblocks content+ <> "\n```"++{- | Formats some content into a code line++ This always uses @``@ code lines as they can be escaped++ Any code lines in the content are escaped+-} codeline :: L.Text -> L.Text codeline content = "``" <> escapeCodelines content <> "``" --- | Formats some text into it's bolded form------ Any existing bolded text is escaped+{- | Formats some text into it's bolded form++ Any existing bolded text is escaped+-} bold :: L.Text -> L.Text bold content = "**" <> escapeBold content <> "**" --- | Formats some text into it's striked form------ Any existing striked text is escaped+{- | Formats some text into it's striked form++ Any existing striked text is escaped+-} strike :: L.Text -> L.Text strike content = "~~" <> escapeStrike content <> "~~" --- | Formats some text into it's underlined form------ Any existing underlined text is escaped+{- | Formats some text into it's underlined form++ Any existing underlined text is escaped+-} underline :: L.Text -> L.Text underline content = "__" <> escapeUnderline content <> "__" @@ -121,15 +143,17 @@ quoteAll :: L.Text -> L.Text quoteAll = (">> " <>) --- | Formats some text into it's spoilered form------ Any existing spoilers are escaped+{- | Formats some text into it's spoilered form++ Any existing spoilers are escaped+-} spoiler :: L.Text -> L.Text spoiler content = "||" <> escapeSpoilers content <> "||" fmtEmoji :: Emoji -> L.Text-fmtEmoji Emoji { id, name, animated } = "<" <> ifanim <> ":" <> name <> ":" <> showtl id <> ">"- where ifanim = if animated then "a" else ""+fmtEmoji Emoji{id, name, animated} = "<" <> ifanim <> ":" <> name <> ":" <> showtl id <> ">"+ where+ ifanim = if animated then "a" else "" -- | Format a 'User' or 'Member' into the format of @username#discriminator@ displayUser :: (HasField' "username" a L.Text, HasField' "discriminator" a L.Text) => a -> L.Text@@ -195,3 +219,16 @@ instance Mentionable Role where mention = mentionSnowflake "@&" . getID @Role++-- | Turn a regular 'Message' into a 'MessageReference'+asReference :: Message+ -- ^ The message to reply to+ -> Bool+ -- ^ If discord should error when replying to deleted messages+ -> MessageReference+asReference msg failIfNotExists =+ MessageReference+ (Just $ getID @Message msg)+ (Just $ getID @Channel msg)+ (msg ^. #guildID)+ failIfNotExists
ChangeLog.md view
@@ -1,5 +1,21 @@ # Changelog for Calamity +## 0.1.28.0+++ Added support for message types 19 (reply) and 20 (application command)++ Added the `MessageReference` type++ Changed the type of `Message.webhookID` to `Snowflake Webhook`++ Added the `activity`, `application`, `messageReference`, `flags`, `stickers`,+ `referencedMessage`, and `interaction` fields to messages.++ Added `messageReference` as a parameter of `CreateMessageOptions`++ Added `repliedUser` as a parameter of `AllowedMentions`++ Fixed `CreateMessage` not actually sending the `allowedMentions` key++ Added the `CrosspostMessage` route++ Added a `ToMessage` instance for `MessageReference`++ Added a `reply` function to `Calamity.Types.Tellable` that replies to a given+ message in the same channel as the message++ Added an `asReference` function to `Calamity.Utils.Message`+ ## 0.1.27.0 + Change the structure of `Reaction` to be `(count, me, emoji)`
calamity.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 40f996e3e284d2ed02f53b7bd8da0fa83fe1e3c156c0d0f71a46cc4afab91437+-- hash: 3c5b52b22636e00ca4b9cc43f1349fce19deee44cd599e47312642322256f9ab name: calamity-version: 0.1.27.0+version: 0.1.28.0 synopsis: A library for writing discord bots in haskell description: Please see the README on GitHub at <https://github.com/simmsb/calamity#readme> category: Network, Web