{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

-- | Data structures pertaining to Discord Channels
module Discord.Internal.Types.Channel where

import Control.Applicative (empty)
import Data.Aeson
import Data.Aeson.Types (Parser)
import Data.Text (Text)
import Data.Time.Clock
import qualified Data.Text as T

import Discord.Internal.Types.Prelude
import Discord.Internal.Types.User (User(..))
import Discord.Internal.Types.Embed

-- | Guild channels represent an isolated set of users and messages in a Guild (Server)
data Channel
  -- | A text channel in a guild.
  = ChannelText
      { Channel -> ChannelId
channelId          :: ChannelId   -- ^ The id of the channel (Will be equal to
                                          --   the guild if it's the "general" channel).
      , Channel -> ChannelId
channelGuild       :: GuildId     -- ^ The id of the guild.
      , Channel -> Text
channelName        :: T.Text      -- ^ The name of the guild (2 - 1000 characters).
      , Channel -> Integer
channelPosition    :: Integer     -- ^ The storing position of the channel.
      , Channel -> [Overwrite]
channelPermissions :: [Overwrite] -- ^ An array of permission 'Overwrite's
      , Channel -> Integer
channelUserRateLimit :: Integer   -- ^ Seconds before a user can speak again
      , Channel -> Bool
channelNSFW        :: Bool        -- ^ Is not-safe-for-work
      , Channel -> Text
channelTopic       :: T.Text      -- ^ The topic of the channel. (0 - 1024 chars).
      , Channel -> Maybe ChannelId
channelLastMessage :: Maybe MessageId   -- ^ The id of the last message sent in the
                                                --   channel
      , Channel -> Maybe ChannelId
parentId           :: Maybe ParentId    -- ^ The id of the parent channel (category)
      }
  | ChannelNews
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , channelName        :: T.Text
      , channelPosition    :: Integer
      , channelPermissions :: [Overwrite]
      , channelNSFW        :: Bool
      , channelTopic       :: T.Text
      , channelLastMessage :: Maybe MessageId
      }
  | ChannelStorePage
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , channelName        :: T.Text
      , channelPosition    :: Integer
      , channelNSFW        :: Bool
      , channelPermissions :: [Overwrite]
      }
  -- | A voice channel in a guild.
  | ChannelVoice
      { channelId          :: ChannelId
      , channelGuild       :: GuildId
      , channelName        :: T.Text
      , channelPosition    :: Integer
      , channelPermissions :: [Overwrite]
      , channelNSFW        :: Bool
      , Channel -> Integer
channelBitRate     :: Integer     -- ^ The bitrate (in bits) of the channel.
      , Channel -> Integer
channelUserLimit   :: Integer     -- ^ The user limit of the voice channel.
      , parentId           :: Maybe ParentId
      }
  -- | DM Channels represent a one-to-one conversation between two users, outside the scope
  --   of guilds
  | ChannelDirectMessage
      { channelId          :: ChannelId
      , Channel -> [User]
channelRecipients  :: [User]      -- ^ The 'User' object(s) of the DM recipient(s).
      , channelLastMessage :: Maybe MessageId
      }
  | ChannelGroupDM
      { channelId          :: ChannelId
      , channelRecipients  :: [User]
      , channelLastMessage :: Maybe MessageId
      }
  | ChannelGuildCategory
      { channelId          :: ChannelId
      , channelName        :: T.Text
      , channelGuild       :: GuildId
      } deriving (Int -> Channel -> ShowS
[Channel] -> ShowS
Channel -> String
(Int -> Channel -> ShowS)
-> (Channel -> String) -> ([Channel] -> ShowS) -> Show Channel
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Channel] -> ShowS
$cshowList :: [Channel] -> ShowS
show :: Channel -> String
$cshow :: Channel -> String
showsPrec :: Int -> Channel -> ShowS
$cshowsPrec :: Int -> Channel -> ShowS
Show, Channel -> Channel -> Bool
(Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool) -> Eq Channel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Channel -> Channel -> Bool
$c/= :: Channel -> Channel -> Bool
== :: Channel -> Channel -> Bool
$c== :: Channel -> Channel -> Bool
Eq, Eq Channel
Eq Channel
-> (Channel -> Channel -> Ordering)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Bool)
-> (Channel -> Channel -> Channel)
-> (Channel -> Channel -> Channel)
-> Ord Channel
Channel -> Channel -> Bool
Channel -> Channel -> Ordering
Channel -> Channel -> Channel
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Channel -> Channel -> Channel
$cmin :: Channel -> Channel -> Channel
max :: Channel -> Channel -> Channel
$cmax :: Channel -> Channel -> Channel
>= :: Channel -> Channel -> Bool
$c>= :: Channel -> Channel -> Bool
> :: Channel -> Channel -> Bool
$c> :: Channel -> Channel -> Bool
<= :: Channel -> Channel -> Bool
$c<= :: Channel -> Channel -> Bool
< :: Channel -> Channel -> Bool
$c< :: Channel -> Channel -> Bool
compare :: Channel -> Channel -> Ordering
$ccompare :: Channel -> Channel -> Ordering
$cp1Ord :: Eq Channel
Ord)

instance FromJSON Channel where
  parseJSON :: Value -> Parser Channel
parseJSON = String -> (Object -> Parser Channel) -> Value -> Parser Channel
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Channel" ((Object -> Parser Channel) -> Value -> Parser Channel)
-> (Object -> Parser Channel) -> Value -> Parser Channel
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    Int
type' <- (Object
o Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"type") :: Parser Int
    case Int
type' of
      Int
0 ->
        ChannelId
-> ChannelId
-> Text
-> Integer
-> [Overwrite]
-> Integer
-> Bool
-> Text
-> Maybe ChannelId
-> Maybe ChannelId
-> Channel
ChannelText  (ChannelId
 -> ChannelId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Integer
 -> Bool
 -> Text
 -> Maybe ChannelId
 -> Maybe ChannelId
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                     Parser
  (ChannelId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                     Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                     Parser
  (Integer
   -> [Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Integer
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                     Parser
  ([Overwrite]
   -> Integer
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Maybe ChannelId
   -> Channel)
-> Parser [Overwrite]
-> Parser
     (Integer
      -> Bool -> Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
                     Parser
  (Integer
   -> Bool -> Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
-> Parser Integer
-> Parser
     (Bool -> Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"rate_limit_per_user"
                     Parser
  (Bool -> Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
-> Parser Bool
-> Parser (Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                     Parser (Text -> Maybe ChannelId -> Maybe ChannelId -> Channel)
-> Parser Text
-> Parser (Maybe ChannelId -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"topic" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
""
                     Parser (Maybe ChannelId -> Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser (Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
                     Parser (Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
      Int
1 ->
        ChannelId -> [User] -> Maybe ChannelId -> Channel
ChannelDirectMessage (ChannelId -> [User] -> Maybe ChannelId -> Channel)
-> Parser ChannelId
-> Parser ([User] -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                             Parser ([User] -> Maybe ChannelId -> Channel)
-> Parser [User] -> Parser (Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [User]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"recipients"
                             Parser (Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
      Int
2 ->
        ChannelId
-> ChannelId
-> Text
-> Integer
-> [Overwrite]
-> Bool
-> Integer
-> Integer
-> Maybe ChannelId
-> Channel
ChannelVoice (ChannelId
 -> ChannelId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Bool
 -> Integer
 -> Integer
 -> Maybe ChannelId
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                     Parser
  (ChannelId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ChannelId
   -> Channel)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                     Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ChannelId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite]
      -> Bool
      -> Integer
      -> Integer
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                     Parser
  (Integer
   -> [Overwrite]
   -> Bool
   -> Integer
   -> Integer
   -> Maybe ChannelId
   -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite]
      -> Bool -> Integer -> Integer -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                     Parser
  ([Overwrite]
   -> Bool -> Integer -> Integer -> Maybe ChannelId -> Channel)
-> Parser [Overwrite]
-> Parser
     (Bool -> Integer -> Integer -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
                     Parser (Bool -> Integer -> Integer -> Maybe ChannelId -> Channel)
-> Parser Bool
-> Parser (Integer -> Integer -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                     Parser (Integer -> Integer -> Maybe ChannelId -> Channel)
-> Parser Integer -> Parser (Integer -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"bitrate"
                     Parser (Integer -> Maybe ChannelId -> Channel)
-> Parser Integer -> Parser (Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"user_limit"
                     Parser (Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"parent_id"
      Int
3 ->
        ChannelId -> [User] -> Maybe ChannelId -> Channel
ChannelGroupDM (ChannelId -> [User] -> Maybe ChannelId -> Channel)
-> Parser ChannelId
-> Parser ([User] -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                       Parser ([User] -> Maybe ChannelId -> Channel)
-> Parser [User] -> Parser (Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [User]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"recipients"
                       Parser (Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
      Int
4 ->
        ChannelId -> Text -> ChannelId -> Channel
ChannelGuildCategory (ChannelId -> Text -> ChannelId -> Channel)
-> Parser ChannelId -> Parser (Text -> ChannelId -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
                             Parser (Text -> ChannelId -> Channel)
-> Parser Text -> Parser (ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                             Parser (ChannelId -> Channel) -> Parser ChannelId -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
      Int
5 ->
        ChannelId
-> ChannelId
-> Text
-> Integer
-> [Overwrite]
-> Bool
-> Text
-> Maybe ChannelId
-> Channel
ChannelNews (ChannelId
 -> ChannelId
 -> Text
 -> Integer
 -> [Overwrite]
 -> Bool
 -> Text
 -> Maybe ChannelId
 -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                    Parser
  (ChannelId
   -> Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Channel)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer
      -> [Overwrite]
      -> Bool
      -> Text
      -> Maybe ChannelId
      -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                    Parser
  (Text
   -> Integer
   -> [Overwrite]
   -> Bool
   -> Text
   -> Maybe ChannelId
   -> Channel)
-> Parser Text
-> Parser
     (Integer
      -> [Overwrite] -> Bool -> Text -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                    Parser
  (Integer
   -> [Overwrite] -> Bool -> Text -> Maybe ChannelId -> Channel)
-> Parser Integer
-> Parser
     ([Overwrite] -> Bool -> Text -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                    Parser ([Overwrite] -> Bool -> Text -> Maybe ChannelId -> Channel)
-> Parser [Overwrite]
-> Parser (Bool -> Text -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
                    Parser (Bool -> Text -> Maybe ChannelId -> Channel)
-> Parser Bool -> Parser (Text -> Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                    Parser (Text -> Maybe ChannelId -> Channel)
-> Parser Text -> Parser (Maybe ChannelId -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"topic" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
""
                    Parser (Maybe ChannelId -> Channel)
-> Parser (Maybe ChannelId) -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"last_message_id"
      Int
6 ->
        ChannelId
-> ChannelId -> Text -> Integer -> Bool -> [Overwrite] -> Channel
ChannelStorePage (ChannelId
 -> ChannelId -> Text -> Integer -> Bool -> [Overwrite] -> Channel)
-> Parser ChannelId
-> Parser
     (ChannelId -> Text -> Integer -> Bool -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
                         Parser
  (ChannelId -> Text -> Integer -> Bool -> [Overwrite] -> Channel)
-> Parser ChannelId
-> Parser (Text -> Integer -> Bool -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe ChannelId) -> ChannelId -> Parser ChannelId
forall a. Parser (Maybe a) -> a -> Parser a
.!= ChannelId
0
                         Parser (Text -> Integer -> Bool -> [Overwrite] -> Channel)
-> Parser Text
-> Parser (Integer -> Bool -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
                         Parser (Integer -> Bool -> [Overwrite] -> Channel)
-> Parser Integer -> Parser (Bool -> [Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"position"
                         Parser (Bool -> [Overwrite] -> Channel)
-> Parser Bool -> Parser ([Overwrite] -> Channel)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nsfw" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
                         Parser ([Overwrite] -> Channel)
-> Parser [Overwrite] -> Parser Channel
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Overwrite]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"permission_overwrites"
      Int
_ -> String -> Parser Channel
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Unknown channel type:" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Int -> String
forall a. Show a => a -> String
show Int
type')

instance ToJSON Channel where
  toJSON :: Channel -> Value
toJSON ChannelText{Bool
Integer
[Overwrite]
Maybe ChannelId
Text
ChannelId
parentId :: Maybe ChannelId
channelLastMessage :: Maybe ChannelId
channelTopic :: Text
channelNSFW :: Bool
channelUserRateLimit :: Integer
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
parentId :: Channel -> Maybe ChannelId
channelLastMessage :: Channel -> Maybe ChannelId
channelTopic :: Channel -> Text
channelNSFW :: Channel -> Bool
channelUserRateLimit :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"rate_limit_per_user", Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelUserRateLimit)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              , (Text
"topic",   Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelTopic)
              , (Text
"last_message_id",  ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId
channelLastMessage)
              , (Text
"parent_id",  Maybe ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (Maybe ChannelId -> Value)
-> Maybe (Maybe ChannelId) -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId -> Maybe (Maybe ChannelId)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ChannelId
parentId)
              ] ]
  toJSON ChannelNews{Bool
Integer
[Overwrite]
Maybe ChannelId
Text
ChannelId
channelLastMessage :: Maybe ChannelId
channelTopic :: Text
channelNSFW :: Bool
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
channelLastMessage :: Channel -> Maybe ChannelId
channelTopic :: Channel -> Text
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"topic",   Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelTopic)
              , (Text
"last_message_id",  ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId
channelLastMessage)
              ] ]
  toJSON ChannelStorePage{Bool
Integer
[Overwrite]
Text
ChannelId
channelPermissions :: [Overwrite]
channelNSFW :: Bool
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              ] ]
  toJSON ChannelDirectMessage{[User]
Maybe ChannelId
ChannelId
channelLastMessage :: Maybe ChannelId
channelRecipients :: [User]
channelId :: ChannelId
channelRecipients :: Channel -> [User]
channelLastMessage :: Channel -> Maybe ChannelId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"recipients",   [User] -> Value
forall a. ToJSON a => a -> Value
toJSON ([User] -> Value) -> Maybe [User] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [User] -> Maybe [User]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [User]
channelRecipients)
              , (Text
"last_message_id",  ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId
channelLastMessage)
              ] ]
  toJSON ChannelVoice{Bool
Integer
[Overwrite]
Maybe ChannelId
Text
ChannelId
parentId :: Maybe ChannelId
channelUserLimit :: Integer
channelBitRate :: Integer
channelNSFW :: Bool
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
channelUserLimit :: Channel -> Integer
channelBitRate :: Channel -> Integer
parentId :: Channel -> Maybe ChannelId
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"guild_id", ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelGuild)
              , (Text
"name",  Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"position",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelPosition)
              , (Text
"nsfw", Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value) -> Maybe Bool -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> Maybe Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
channelNSFW)
              , (Text
"permission_overwrites",   [Overwrite] -> Value
forall a. ToJSON a => a -> Value
toJSON ([Overwrite] -> Value) -> Maybe [Overwrite] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Overwrite] -> Maybe [Overwrite]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Overwrite]
channelPermissions)
              , (Text
"bitrate",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelBitRate)
              , (Text
"user_limit",  Integer -> Value
forall a. ToJSON a => a -> Value
toJSON (Integer -> Value) -> Maybe Integer -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Integer -> Maybe Integer
forall (f :: * -> *) a. Applicative f => a -> f a
pure Integer
channelUserLimit)
              ] ]
  toJSON ChannelGroupDM{[User]
Maybe ChannelId
ChannelId
channelLastMessage :: Maybe ChannelId
channelRecipients :: [User]
channelId :: ChannelId
channelRecipients :: Channel -> [User]
channelLastMessage :: Channel -> Maybe ChannelId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"recipients",   [User] -> Value
forall a. ToJSON a => a -> Value
toJSON ([User] -> Value) -> Maybe [User] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [User] -> Maybe [User]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [User]
channelRecipients)
              , (Text
"last_message_id",  ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ChannelId
channelLastMessage)
              ] ]
  toJSON ChannelGuildCategory{Text
ChannelId
channelGuild :: ChannelId
channelName :: Text
channelId :: ChannelId
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..} = [Pair] -> Value
object [(Text
name,Value
value) | (Text
name, Just Value
value) <-
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelId)
              , (Text
"name", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Maybe Text
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
channelName)
              , (Text
"guild_id", ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON (ChannelId -> Value) -> Maybe ChannelId -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ChannelId -> Maybe ChannelId
forall (f :: * -> *) a. Applicative f => a -> f a
pure ChannelId
channelGuild)
              ] ]

-- | If the channel is part of a guild (has a guild id field)
channelIsInGuild :: Channel -> Bool
channelIsInGuild :: Channel -> Bool
channelIsInGuild Channel
c = case Channel
c of
        ChannelGuildCategory{Text
ChannelId
channelGuild :: ChannelId
channelName :: Text
channelId :: ChannelId
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..} -> Bool
True
        ChannelText{Bool
Integer
[Overwrite]
Maybe ChannelId
Text
ChannelId
parentId :: Maybe ChannelId
channelLastMessage :: Maybe ChannelId
channelTopic :: Text
channelNSFW :: Bool
channelUserRateLimit :: Integer
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
parentId :: Channel -> Maybe ChannelId
channelLastMessage :: Channel -> Maybe ChannelId
channelTopic :: Channel -> Text
channelNSFW :: Channel -> Bool
channelUserRateLimit :: Channel -> Integer
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..} -> Bool
True
        ChannelVoice{Bool
Integer
[Overwrite]
Maybe ChannelId
Text
ChannelId
parentId :: Maybe ChannelId
channelUserLimit :: Integer
channelBitRate :: Integer
channelNSFW :: Bool
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
channelUserLimit :: Channel -> Integer
channelBitRate :: Channel -> Integer
parentId :: Channel -> Maybe ChannelId
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..}  -> Bool
True
        ChannelNews{Bool
Integer
[Overwrite]
Maybe ChannelId
Text
ChannelId
channelLastMessage :: Maybe ChannelId
channelTopic :: Text
channelNSFW :: Bool
channelPermissions :: [Overwrite]
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
channelLastMessage :: Channel -> Maybe ChannelId
channelTopic :: Channel -> Text
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..}  -> Bool
True
        ChannelStorePage{Bool
Integer
[Overwrite]
Text
ChannelId
channelPermissions :: [Overwrite]
channelNSFW :: Bool
channelPosition :: Integer
channelName :: Text
channelGuild :: ChannelId
channelId :: ChannelId
channelNSFW :: Channel -> Bool
channelPermissions :: Channel -> [Overwrite]
channelPosition :: Channel -> Integer
channelName :: Channel -> Text
channelGuild :: Channel -> ChannelId
channelId :: Channel -> ChannelId
..}  -> Bool
True
        Channel
_ -> Bool
False

-- | Permission overwrites for a channel.
data Overwrite = Overwrite
  { Overwrite -> ChannelId
overwriteId    :: OverwriteId -- ^ 'Role' or 'User' id
  , Overwrite -> Text
overwriteType  :: T.Text    -- ^ Either "role" or "member
  , Overwrite -> Integer
overwriteAllow :: Integer   -- ^ Allowed permission bit set
  , Overwrite -> Integer
overwriteDeny  :: Integer   -- ^ Denied permission bit set
  } deriving (Int -> Overwrite -> ShowS
[Overwrite] -> ShowS
Overwrite -> String
(Int -> Overwrite -> ShowS)
-> (Overwrite -> String)
-> ([Overwrite] -> ShowS)
-> Show Overwrite
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Overwrite] -> ShowS
$cshowList :: [Overwrite] -> ShowS
show :: Overwrite -> String
$cshow :: Overwrite -> String
showsPrec :: Int -> Overwrite -> ShowS
$cshowsPrec :: Int -> Overwrite -> ShowS
Show, Overwrite -> Overwrite -> Bool
(Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool) -> Eq Overwrite
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Overwrite -> Overwrite -> Bool
$c/= :: Overwrite -> Overwrite -> Bool
== :: Overwrite -> Overwrite -> Bool
$c== :: Overwrite -> Overwrite -> Bool
Eq, Eq Overwrite
Eq Overwrite
-> (Overwrite -> Overwrite -> Ordering)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Bool)
-> (Overwrite -> Overwrite -> Overwrite)
-> (Overwrite -> Overwrite -> Overwrite)
-> Ord Overwrite
Overwrite -> Overwrite -> Bool
Overwrite -> Overwrite -> Ordering
Overwrite -> Overwrite -> Overwrite
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Overwrite -> Overwrite -> Overwrite
$cmin :: Overwrite -> Overwrite -> Overwrite
max :: Overwrite -> Overwrite -> Overwrite
$cmax :: Overwrite -> Overwrite -> Overwrite
>= :: Overwrite -> Overwrite -> Bool
$c>= :: Overwrite -> Overwrite -> Bool
> :: Overwrite -> Overwrite -> Bool
$c> :: Overwrite -> Overwrite -> Bool
<= :: Overwrite -> Overwrite -> Bool
$c<= :: Overwrite -> Overwrite -> Bool
< :: Overwrite -> Overwrite -> Bool
$c< :: Overwrite -> Overwrite -> Bool
compare :: Overwrite -> Overwrite -> Ordering
$ccompare :: Overwrite -> Overwrite -> Ordering
$cp1Ord :: Eq Overwrite
Ord)

instance FromJSON Overwrite where
  parseJSON :: Value -> Parser Overwrite
parseJSON = String -> (Object -> Parser Overwrite) -> Value -> Parser Overwrite
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Overwrite" ((Object -> Parser Overwrite) -> Value -> Parser Overwrite)
-> (Object -> Parser Overwrite) -> Value -> Parser Overwrite
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId -> Text -> Integer -> Integer -> Overwrite
Overwrite (ChannelId -> Text -> Integer -> Integer -> Overwrite)
-> Parser ChannelId
-> Parser (Text -> Integer -> Integer -> Overwrite)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"id"
              Parser (Text -> Integer -> Integer -> Overwrite)
-> Parser Text -> Parser (Integer -> Integer -> Overwrite)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"type"
              Parser (Integer -> Integer -> Overwrite)
-> Parser Integer -> Parser (Integer -> Overwrite)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"allow"
              Parser (Integer -> Overwrite) -> Parser Integer -> Parser Overwrite
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"deny"

instance ToJSON Overwrite where
  toJSON :: Overwrite -> Value
toJSON Overwrite{Integer
Text
ChannelId
overwriteDeny :: Integer
overwriteAllow :: Integer
overwriteType :: Text
overwriteId :: ChannelId
overwriteDeny :: Overwrite -> Integer
overwriteAllow :: Overwrite -> Integer
overwriteType :: Overwrite -> Text
overwriteId :: Overwrite -> ChannelId
..} = [Pair] -> Value
object
              [ (Text
"id",     ChannelId -> Value
forall a. ToJSON a => a -> Value
toJSON ChannelId
overwriteId)
              , (Text
"type",   Text -> Value
forall a. ToJSON a => a -> Value
toJSON Text
overwriteType)
              , (Text
"allow",  Integer -> Value
forall a. ToJSON a => a -> Value
toJSON Integer
overwriteAllow)
              , (Text
"deny",   Integer -> Value
forall a. ToJSON a => a -> Value
toJSON Integer
overwriteDeny)
              ]

-- | Represents information about a message in a Discord channel.
data Message = Message
  { Message -> ChannelId
messageId           :: MessageId       -- ^ The id of the message
  , Message -> ChannelId
messageChannel      :: ChannelId       -- ^ Id of the channel the message
                                           --   was sent in
  , Message -> User
messageAuthor       :: User            -- ^ The 'User' the message was sent
                                           --   by
  , Message -> Text
messageText         :: Text            -- ^ Contents of the message
  , Message -> UTCTime
messageTimestamp    :: UTCTime         -- ^ When the message was sent
  , Message -> Maybe UTCTime
messageEdited       :: Maybe UTCTime   -- ^ When/if the message was edited
  , Message -> Bool
messageTts          :: Bool            -- ^ Whether this message was a TTS
                                           --   message
  , Message -> Bool
messageEveryone     :: Bool            -- ^ Whether this message mentions
                                           --   everyone
  , Message -> [User]
messageMentions     :: [User]          -- ^ 'User's specifically mentioned in
                                           --   the message
  , Message -> [ChannelId]
messageMentionRoles :: [RoleId]        -- ^ 'Role's specifically mentioned in
                                           --   the message
  , Message -> [Attachment]
messageAttachments  :: [Attachment]    -- ^ Any attached files
  , Message -> [Embed]
messageEmbeds       :: [Embed]         -- ^ Any embedded content
  , Message -> [MessageReaction]
messageReactions    :: [MessageReaction] -- ^ Any reactions to message
  , Message -> Maybe Nonce
messageNonce        :: Maybe Nonce     -- ^ Used for validating if a message
                                           --   was sent
  , Message -> Bool
messagePinned       :: Bool            -- ^ Whether this message is pinned
  , Message -> Maybe ChannelId
messageGuild        :: Maybe GuildId   -- ^ The guild the message went to
  } deriving (Int -> Message -> ShowS
[Message] -> ShowS
Message -> String
(Int -> Message -> ShowS)
-> (Message -> String) -> ([Message] -> ShowS) -> Show Message
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Message] -> ShowS
$cshowList :: [Message] -> ShowS
show :: Message -> String
$cshow :: Message -> String
showsPrec :: Int -> Message -> ShowS
$cshowsPrec :: Int -> Message -> ShowS
Show, Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c== :: Message -> Message -> Bool
Eq, Eq Message
Eq Message
-> (Message -> Message -> Ordering)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Bool)
-> (Message -> Message -> Message)
-> (Message -> Message -> Message)
-> Ord Message
Message -> Message -> Bool
Message -> Message -> Ordering
Message -> Message -> Message
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Message -> Message -> Message
$cmin :: Message -> Message -> Message
max :: Message -> Message -> Message
$cmax :: Message -> Message -> Message
>= :: Message -> Message -> Bool
$c>= :: Message -> Message -> Bool
> :: Message -> Message -> Bool
$c> :: Message -> Message -> Bool
<= :: Message -> Message -> Bool
$c<= :: Message -> Message -> Bool
< :: Message -> Message -> Bool
$c< :: Message -> Message -> Bool
compare :: Message -> Message -> Ordering
$ccompare :: Message -> Message -> Ordering
$cp1Ord :: Eq Message
Ord)

instance FromJSON Message where
  parseJSON :: Value -> Parser Message
parseJSON = String -> (Object -> Parser Message) -> Value -> Parser Message
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Message" ((Object -> Parser Message) -> Value -> Parser Message)
-> (Object -> Parser Message) -> Value -> Parser Message
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId
-> ChannelId
-> User
-> Text
-> UTCTime
-> Maybe UTCTime
-> Bool
-> Bool
-> [User]
-> [ChannelId]
-> [Attachment]
-> [Embed]
-> [MessageReaction]
-> Maybe Nonce
-> Bool
-> Maybe ChannelId
-> Message
Message (ChannelId
 -> ChannelId
 -> User
 -> Text
 -> UTCTime
 -> Maybe UTCTime
 -> Bool
 -> Bool
 -> [User]
 -> [ChannelId]
 -> [Attachment]
 -> [Embed]
 -> [MessageReaction]
 -> Maybe Nonce
 -> Bool
 -> Maybe ChannelId
 -> Message)
-> Parser ChannelId
-> Parser
     (ChannelId
      -> User
      -> Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
            Parser
  (ChannelId
   -> User
   -> Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser ChannelId
-> Parser
     (User
      -> Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"channel_id"
            Parser
  (User
   -> Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser User
-> Parser
     (Text
      -> UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (do Maybe ChannelId
isW <- Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"webhook_id"
                    User
a <- Object
o Object -> Text -> Parser User
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"author"
                    case Maybe ChannelId
isW :: Maybe WebhookId of
                      Maybe ChannelId
Nothing -> User -> Parser User
forall (f :: * -> *) a. Applicative f => a -> f a
pure User
a
                      Just ChannelId
_ -> User -> Parser User
forall (f :: * -> *) a. Applicative f => a -> f a
pure (User -> Parser User) -> User -> Parser User
forall a b. (a -> b) -> a -> b
$ User
a { userIsWebhook :: Bool
userIsWebhook = Bool
True })
            Parser
  (Text
   -> UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser Text
-> Parser
     (UTCTime
      -> Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"content" Parser (Maybe Text) -> Text -> Parser Text
forall a. Parser (Maybe a) -> a -> Parser a
.!= Text
""
            Parser
  (UTCTime
   -> Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser UTCTime
-> Parser
     (Maybe UTCTime
      -> Bool
      -> Bool
      -> [User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"timestamp" Parser (Maybe UTCTime) -> UTCTime -> Parser UTCTime
forall a. Parser (Maybe a) -> a -> Parser a
.!= UTCTime
epochTime
            Parser
  (Maybe UTCTime
   -> Bool
   -> Bool
   -> [User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser (Maybe UTCTime)
-> Parser
     (Bool
      -> Bool
      -> [User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe UTCTime)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"edited_timestamp"
            Parser
  (Bool
   -> Bool
   -> [User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser Bool
-> Parser
     (Bool
      -> [User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"tts" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
            Parser
  (Bool
   -> [User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser Bool
-> Parser
     ([User]
      -> [ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"mention_everyone" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
            Parser
  ([User]
   -> [ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser [User]
-> Parser
     ([ChannelId]
      -> [Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [User])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"mentions" Parser (Maybe [User]) -> [User] -> Parser [User]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser
  ([ChannelId]
   -> [Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser [ChannelId]
-> Parser
     ([Attachment]
      -> [Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [ChannelId])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"mention_roles" Parser (Maybe [ChannelId]) -> [ChannelId] -> Parser [ChannelId]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser
  ([Attachment]
   -> [Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser [Attachment]
-> Parser
     ([Embed]
      -> [MessageReaction]
      -> Maybe Nonce
      -> Bool
      -> Maybe ChannelId
      -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [Attachment])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"attachments" Parser (Maybe [Attachment]) -> [Attachment] -> Parser [Attachment]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser
  ([Embed]
   -> [MessageReaction]
   -> Maybe Nonce
   -> Bool
   -> Maybe ChannelId
   -> Message)
-> Parser [Embed]
-> Parser
     ([MessageReaction]
      -> Maybe Nonce -> Bool -> Maybe ChannelId -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser [Embed]
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"embeds"
            Parser
  ([MessageReaction]
   -> Maybe Nonce -> Bool -> Maybe ChannelId -> Message)
-> Parser [MessageReaction]
-> Parser (Maybe Nonce -> Bool -> Maybe ChannelId -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [MessageReaction])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"reactions" Parser (Maybe [MessageReaction])
-> [MessageReaction] -> Parser [MessageReaction]
forall a. Parser (Maybe a) -> a -> Parser a
.!= []
            Parser (Maybe Nonce -> Bool -> Maybe ChannelId -> Message)
-> Parser (Maybe Nonce)
-> Parser (Bool -> Maybe ChannelId -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Nonce)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"nonce"
            Parser (Bool -> Maybe ChannelId -> Message)
-> Parser Bool -> Parser (Maybe ChannelId -> Message)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"pinned" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False
            Parser (Maybe ChannelId -> Message)
-> Parser (Maybe ChannelId) -> Parser Message
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe (Maybe ChannelId))
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"guild_id" Parser (Maybe (Maybe ChannelId))
-> Maybe ChannelId -> Parser (Maybe ChannelId)
forall a. Parser (Maybe a) -> a -> Parser a
.!= Maybe ChannelId
forall a. Maybe a
Nothing


data MessageReaction = MessageReaction
  { MessageReaction -> Int
messageReactionCount :: Int
  , MessageReaction -> Bool
messageReactionMeIncluded :: Bool
  , MessageReaction -> Emoji
messageReactionEmoji :: Emoji
  } deriving (Int -> MessageReaction -> ShowS
[MessageReaction] -> ShowS
MessageReaction -> String
(Int -> MessageReaction -> ShowS)
-> (MessageReaction -> String)
-> ([MessageReaction] -> ShowS)
-> Show MessageReaction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageReaction] -> ShowS
$cshowList :: [MessageReaction] -> ShowS
show :: MessageReaction -> String
$cshow :: MessageReaction -> String
showsPrec :: Int -> MessageReaction -> ShowS
$cshowsPrec :: Int -> MessageReaction -> ShowS
Show, MessageReaction -> MessageReaction -> Bool
(MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> Eq MessageReaction
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MessageReaction -> MessageReaction -> Bool
$c/= :: MessageReaction -> MessageReaction -> Bool
== :: MessageReaction -> MessageReaction -> Bool
$c== :: MessageReaction -> MessageReaction -> Bool
Eq, Eq MessageReaction
Eq MessageReaction
-> (MessageReaction -> MessageReaction -> Ordering)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> Bool)
-> (MessageReaction -> MessageReaction -> MessageReaction)
-> (MessageReaction -> MessageReaction -> MessageReaction)
-> Ord MessageReaction
MessageReaction -> MessageReaction -> Bool
MessageReaction -> MessageReaction -> Ordering
MessageReaction -> MessageReaction -> MessageReaction
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MessageReaction -> MessageReaction -> MessageReaction
$cmin :: MessageReaction -> MessageReaction -> MessageReaction
max :: MessageReaction -> MessageReaction -> MessageReaction
$cmax :: MessageReaction -> MessageReaction -> MessageReaction
>= :: MessageReaction -> MessageReaction -> Bool
$c>= :: MessageReaction -> MessageReaction -> Bool
> :: MessageReaction -> MessageReaction -> Bool
$c> :: MessageReaction -> MessageReaction -> Bool
<= :: MessageReaction -> MessageReaction -> Bool
$c<= :: MessageReaction -> MessageReaction -> Bool
< :: MessageReaction -> MessageReaction -> Bool
$c< :: MessageReaction -> MessageReaction -> Bool
compare :: MessageReaction -> MessageReaction -> Ordering
$ccompare :: MessageReaction -> MessageReaction -> Ordering
$cp1Ord :: Eq MessageReaction
Ord)

instance FromJSON MessageReaction where
  parseJSON :: Value -> Parser MessageReaction
parseJSON = String
-> (Object -> Parser MessageReaction)
-> Value
-> Parser MessageReaction
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MessageReaction" ((Object -> Parser MessageReaction)
 -> Value -> Parser MessageReaction)
-> (Object -> Parser MessageReaction)
-> Value
-> Parser MessageReaction
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Int -> Bool -> Emoji -> MessageReaction
MessageReaction (Int -> Bool -> Emoji -> MessageReaction)
-> Parser Int -> Parser (Bool -> Emoji -> MessageReaction)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser Int
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"count"
                    Parser (Bool -> Emoji -> MessageReaction)
-> Parser Bool -> Parser (Emoji -> MessageReaction)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Bool
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"me"
                    Parser (Emoji -> MessageReaction)
-> Parser Emoji -> Parser MessageReaction
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Emoji
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"emoji"

-- | Represents an emoticon (emoji)
data Emoji = Emoji
  { Emoji -> Maybe ChannelId
emojiId      :: Maybe EmojiId  -- ^ The emoji id
  , Emoji -> Text
emojiName    :: T.Text         -- ^ The emoji name
  , Emoji -> Maybe [ChannelId]
emojiRoles   :: Maybe [RoleId] -- ^ Roles the emoji is active for
  , Emoji -> Maybe User
emojiUser    :: Maybe User     -- ^ User that created this emoji
  , Emoji -> Maybe Bool
emojiManaged :: Maybe Bool     -- ^ Whether this emoji is managed
  } deriving (Int -> Emoji -> ShowS
[Emoji] -> ShowS
Emoji -> String
(Int -> Emoji -> ShowS)
-> (Emoji -> String) -> ([Emoji] -> ShowS) -> Show Emoji
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Emoji] -> ShowS
$cshowList :: [Emoji] -> ShowS
show :: Emoji -> String
$cshow :: Emoji -> String
showsPrec :: Int -> Emoji -> ShowS
$cshowsPrec :: Int -> Emoji -> ShowS
Show, Emoji -> Emoji -> Bool
(Emoji -> Emoji -> Bool) -> (Emoji -> Emoji -> Bool) -> Eq Emoji
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Emoji -> Emoji -> Bool
$c/= :: Emoji -> Emoji -> Bool
== :: Emoji -> Emoji -> Bool
$c== :: Emoji -> Emoji -> Bool
Eq, Eq Emoji
Eq Emoji
-> (Emoji -> Emoji -> Ordering)
-> (Emoji -> Emoji -> Bool)
-> (Emoji -> Emoji -> Bool)
-> (Emoji -> Emoji -> Bool)
-> (Emoji -> Emoji -> Bool)
-> (Emoji -> Emoji -> Emoji)
-> (Emoji -> Emoji -> Emoji)
-> Ord Emoji
Emoji -> Emoji -> Bool
Emoji -> Emoji -> Ordering
Emoji -> Emoji -> Emoji
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Emoji -> Emoji -> Emoji
$cmin :: Emoji -> Emoji -> Emoji
max :: Emoji -> Emoji -> Emoji
$cmax :: Emoji -> Emoji -> Emoji
>= :: Emoji -> Emoji -> Bool
$c>= :: Emoji -> Emoji -> Bool
> :: Emoji -> Emoji -> Bool
$c> :: Emoji -> Emoji -> Bool
<= :: Emoji -> Emoji -> Bool
$c<= :: Emoji -> Emoji -> Bool
< :: Emoji -> Emoji -> Bool
$c< :: Emoji -> Emoji -> Bool
compare :: Emoji -> Emoji -> Ordering
$ccompare :: Emoji -> Emoji -> Ordering
$cp1Ord :: Eq Emoji
Ord)

instance FromJSON Emoji where
  parseJSON :: Value -> Parser Emoji
parseJSON = String -> (Object -> Parser Emoji) -> Value -> Parser Emoji
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Emoji" ((Object -> Parser Emoji) -> Value -> Parser Emoji)
-> (Object -> Parser Emoji) -> Value -> Parser Emoji
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Maybe ChannelId
-> Text -> Maybe [ChannelId] -> Maybe User -> Maybe Bool -> Emoji
Emoji (Maybe ChannelId
 -> Text -> Maybe [ChannelId] -> Maybe User -> Maybe Bool -> Emoji)
-> Parser (Maybe ChannelId)
-> Parser
     (Text -> Maybe [ChannelId] -> Maybe User -> Maybe Bool -> Emoji)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe ChannelId)
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
          Parser
  (Text -> Maybe [ChannelId] -> Maybe User -> Maybe Bool -> Emoji)
-> Parser Text
-> Parser (Maybe [ChannelId] -> Maybe User -> Maybe Bool -> Emoji)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"name"
          Parser (Maybe [ChannelId] -> Maybe User -> Maybe Bool -> Emoji)
-> Parser (Maybe [ChannelId])
-> Parser (Maybe User -> Maybe Bool -> Emoji)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe [ChannelId])
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"roles"
          Parser (Maybe User -> Maybe Bool -> Emoji)
-> Parser (Maybe User) -> Parser (Maybe Bool -> Emoji)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe User)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"user"
          Parser (Maybe Bool -> Emoji) -> Parser (Maybe Bool) -> Parser Emoji
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"managed"

  
-- | Represents an attached to a message file.
data Attachment = Attachment
  { Attachment -> ChannelId
attachmentId       :: Snowflake     -- ^ Attachment id
  , Attachment -> Text
attachmentFilename :: T.Text        -- ^ Name of attached file
  , Attachment -> Integer
attachmentSize     :: Integer       -- ^ Size of file (in bytes)
  , Attachment -> Text
attachmentUrl      :: T.Text        -- ^ Source of file
  , Attachment -> Text
attachmentProxy    :: T.Text        -- ^ Proxied url of file
  , Attachment -> Maybe Integer
attachmentHeight   :: Maybe Integer -- ^ Height of file (if image)
  , Attachment -> Maybe Integer
attachmentWidth    :: Maybe Integer -- ^ Width of file (if image)
  } deriving (Int -> Attachment -> ShowS
[Attachment] -> ShowS
Attachment -> String
(Int -> Attachment -> ShowS)
-> (Attachment -> String)
-> ([Attachment] -> ShowS)
-> Show Attachment
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Attachment] -> ShowS
$cshowList :: [Attachment] -> ShowS
show :: Attachment -> String
$cshow :: Attachment -> String
showsPrec :: Int -> Attachment -> ShowS
$cshowsPrec :: Int -> Attachment -> ShowS
Show, Attachment -> Attachment -> Bool
(Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool) -> Eq Attachment
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Attachment -> Attachment -> Bool
$c/= :: Attachment -> Attachment -> Bool
== :: Attachment -> Attachment -> Bool
$c== :: Attachment -> Attachment -> Bool
Eq, Eq Attachment
Eq Attachment
-> (Attachment -> Attachment -> Ordering)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Bool)
-> (Attachment -> Attachment -> Attachment)
-> (Attachment -> Attachment -> Attachment)
-> Ord Attachment
Attachment -> Attachment -> Bool
Attachment -> Attachment -> Ordering
Attachment -> Attachment -> Attachment
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Attachment -> Attachment -> Attachment
$cmin :: Attachment -> Attachment -> Attachment
max :: Attachment -> Attachment -> Attachment
$cmax :: Attachment -> Attachment -> Attachment
>= :: Attachment -> Attachment -> Bool
$c>= :: Attachment -> Attachment -> Bool
> :: Attachment -> Attachment -> Bool
$c> :: Attachment -> Attachment -> Bool
<= :: Attachment -> Attachment -> Bool
$c<= :: Attachment -> Attachment -> Bool
< :: Attachment -> Attachment -> Bool
$c< :: Attachment -> Attachment -> Bool
compare :: Attachment -> Attachment -> Ordering
$ccompare :: Attachment -> Attachment -> Ordering
$cp1Ord :: Eq Attachment
Ord)

instance FromJSON Attachment where
  parseJSON :: Value -> Parser Attachment
parseJSON = String
-> (Object -> Parser Attachment) -> Value -> Parser Attachment
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Attachment" ((Object -> Parser Attachment) -> Value -> Parser Attachment)
-> (Object -> Parser Attachment) -> Value -> Parser Attachment
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    ChannelId
-> Text
-> Integer
-> Text
-> Text
-> Maybe Integer
-> Maybe Integer
-> Attachment
Attachment (ChannelId
 -> Text
 -> Integer
 -> Text
 -> Text
 -> Maybe Integer
 -> Maybe Integer
 -> Attachment)
-> Parser ChannelId
-> Parser
     (Text
      -> Integer
      -> Text
      -> Text
      -> Maybe Integer
      -> Maybe Integer
      -> Attachment)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser ChannelId
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"id"
               Parser
  (Text
   -> Integer
   -> Text
   -> Text
   -> Maybe Integer
   -> Maybe Integer
   -> Attachment)
-> Parser Text
-> Parser
     (Integer
      -> Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"filename"
               Parser
  (Integer
   -> Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Integer
-> Parser
     (Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"size"
               Parser
  (Text -> Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Text
-> Parser (Text -> Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"url"
               Parser (Text -> Maybe Integer -> Maybe Integer -> Attachment)
-> Parser Text
-> Parser (Maybe Integer -> Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser Text
forall a. FromJSON a => Object -> Text -> Parser a
.:  Text
"proxy_url"
               Parser (Maybe Integer -> Maybe Integer -> Attachment)
-> Parser (Maybe Integer) -> Parser (Maybe Integer -> Attachment)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"height"
               Parser (Maybe Integer -> Attachment)
-> Parser (Maybe Integer) -> Parser Attachment
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"width"



newtype Nonce = Nonce T.Text
  deriving (Int -> Nonce -> ShowS
[Nonce] -> ShowS
Nonce -> String
(Int -> Nonce -> ShowS)
-> (Nonce -> String) -> ([Nonce] -> ShowS) -> Show Nonce
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Nonce] -> ShowS
$cshowList :: [Nonce] -> ShowS
show :: Nonce -> String
$cshow :: Nonce -> String
showsPrec :: Int -> Nonce -> ShowS
$cshowsPrec :: Int -> Nonce -> ShowS
Show, Nonce -> Nonce -> Bool
(Nonce -> Nonce -> Bool) -> (Nonce -> Nonce -> Bool) -> Eq Nonce
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Nonce -> Nonce -> Bool
$c/= :: Nonce -> Nonce -> Bool
== :: Nonce -> Nonce -> Bool
$c== :: Nonce -> Nonce -> Bool
Eq, Eq Nonce
Eq Nonce
-> (Nonce -> Nonce -> Ordering)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Bool)
-> (Nonce -> Nonce -> Nonce)
-> (Nonce -> Nonce -> Nonce)
-> Ord Nonce
Nonce -> Nonce -> Bool
Nonce -> Nonce -> Ordering
Nonce -> Nonce -> Nonce
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Nonce -> Nonce -> Nonce
$cmin :: Nonce -> Nonce -> Nonce
max :: Nonce -> Nonce -> Nonce
$cmax :: Nonce -> Nonce -> Nonce
>= :: Nonce -> Nonce -> Bool
$c>= :: Nonce -> Nonce -> Bool
> :: Nonce -> Nonce -> Bool
$c> :: Nonce -> Nonce -> Bool
<= :: Nonce -> Nonce -> Bool
$c<= :: Nonce -> Nonce -> Bool
< :: Nonce -> Nonce -> Bool
$c< :: Nonce -> Nonce -> Bool
compare :: Nonce -> Nonce -> Ordering
$ccompare :: Nonce -> Nonce -> Ordering
$cp1Ord :: Eq Nonce
Ord)

instance FromJSON Nonce where
  parseJSON :: Value -> Parser Nonce
parseJSON (String Text
nonce) = Nonce -> Parser Nonce
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Nonce -> Parser Nonce) -> Nonce -> Parser Nonce
forall a b. (a -> b) -> a -> b
$ Text -> Nonce
Nonce Text
nonce
  parseJSON (Number Scientific
nonce) = Nonce -> Parser Nonce
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Nonce -> Parser Nonce)
-> (Scientific -> Nonce) -> Scientific -> Parser Nonce
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Nonce
Nonce (Text -> Nonce) -> (Scientific -> Text) -> Scientific -> Nonce
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (Scientific -> String) -> Scientific -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> String
forall a. Show a => a -> String
show (Scientific -> Parser Nonce) -> Scientific -> Parser Nonce
forall a b. (a -> b) -> a -> b
$ Scientific
nonce
  parseJSON Value
_ = Parser Nonce
forall (f :: * -> *) a. Alternative f => f a
empty