packages feed

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 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