packages feed

calamity-0.5.0.0: Calamity/Types/Model/Channel/Group.hs

{-# LANGUAGE TemplateHaskell #-}

-- | A Group Group channel
module Calamity.Types.Model.Channel.Group (GroupChannel (..)) where

import {-# SOURCE #-} Calamity.Types.Model.Channel
import {-# SOURCE #-} Calamity.Types.Model.Channel.Message
import Calamity.Types.Model.User
import Calamity.Types.Snowflake
import Data.Aeson ((.:), (.:?))
import qualified Data.Aeson as Aeson
import Data.Text (Text)
import Data.Time
import Optics.TH
import qualified TextShow

data GroupChannel = GroupChannel
  { id :: Snowflake GroupChannel
  , ownerID :: Snowflake User
  , lastMessageID :: Maybe (Snowflake Message)
  , lastPinTimestamp :: Maybe UTCTime
  , icon :: Maybe Text
  , recipients :: [User]
  , name :: Text
  }
  deriving (Show, Eq)
  deriving (TextShow.TextShow) via TextShow.FromStringShow GroupChannel
  deriving (HasID GroupChannel) via HasIDField "id" GroupChannel
  deriving (HasID Channel) via HasIDFieldCoerce' "id" GroupChannel
  deriving (HasID User) via HasIDField "ownerID" GroupChannel

$(makeFieldLabelsNoPrefix ''GroupChannel)

instance Aeson.FromJSON GroupChannel where
  parseJSON = Aeson.withObject "GroupChannel" $ \v ->
    GroupChannel
      <$> v .: "id"
      <*> v .: "owner_id"
      <*> v .:? "last_message_id"
      <*> v .:? "last_pin_timestamp"
      <*> v .:? "icon"
      <*> v .: "recipients"
      <*> v .: "name"