packages feed

signal-messaging-dbus-1.0.0.2: src/SignalDBus/Types.hs

{-# OPTIONS_GHC -Wno-orphans #-} -- :/

{-|
Module:      SignalDBus.Types
Description: Types used by this package
Copyright:   (c) Lia Lenckowski, 2022
License:     AGPL
Maintainer:  lialenck@protonmail.com
Stability:   experimental
Portability: GNU/Linux, MacOS

This module contains types used by this package. Please import SignalDBus instead.
-}

module SignalDBus.Types (
    SignalConn(..),
    Timestamp,
    Device(..),
    Group(..),
    ReceivedMessage(..),
) where

import Data.Int (Int64)
import DBus.Client (Client)
import DBus.Internal.Types
import Text.Read (readPrec)

-- |Opaque connection object, aquired by 'SignalDBus.withConn' or
-- 'SignalDBus.withConnNum'
data SignalConn = SignalConn !ObjectPath !Client

-- |Timestamp, represented as an ms-precision unix timestamp
newtype Timestamp = Timestamp Int64 deriving (Show, Read, Eq, Ord)

instance IsVariant Timestamp where
    toVariant (Timestamp ts) = toVariant ts
    fromVariant v = Timestamp <$> fromVariant v

instance IsValue Timestamp where
    typeOf_ _ = TypeInt64
    toValue (Timestamp ts) = toValue ts
    fromValue v = Timestamp <$> fromValue v

-- |Opaque object representing a linked device
newtype Device = Device Int64 deriving (Show, Read, Eq)
instance IsVariant Device where
    toVariant (Device i) = toVariant i
    fromVariant v = Device <$> fromVariant v

instance IsValue Device where
    typeOf_ _ = TypeInt64
    toValue (Device i) = toValue i
    fromValue v = Device <$> fromValue v

instance Read ObjectPath where -- :/
    readPrec = ObjectPath <$> readPrec

-- |Opaque Group object, aquired by 'SignalDBus.listGroups' or 'SignalDBus.getGroup'
newtype Group = Group ObjectPath deriving (Show, Read, Eq, Ord)
instance IsVariant Group where
    toVariant (Group i) = toVariant i
    fromVariant v = Group <$> fromVariant v

instance IsValue Group where
    typeOf_ _ = TypeObjectPath
    toValue (Group i) = toValue i
    fromValue v = Group <$> fromValue v

-- |Received message
data ReceivedMessage =
    -- |Message sent by a linked device to someone else
    SyncMessage
        Timestamp     -- ^ When this message was sent
        String        -- ^ Message sender (TODO: always yourself?)
        (Maybe Group) -- ^ If sent in a group, corresponding group object
        String        -- ^ Message text
        [String]      -- ^ Paths to stored attachments

    -- |Read receipt sent by someone else in response to one of your messages
  | Receipt
        Timestamp -- ^ Which message was read
        String    -- ^ Phone number of the receipt sender

    -- |Message sent to you by someone else
  | Message
        Timestamp     -- ^ When this message was sent
        String        -- ^ Message sender
        (Maybe Group) -- ^ If sent in a group, corresponding group object
        String        -- ^ Message text
        [String]      -- ^ Paths to stored attachments

    deriving (Show, Read, Eq, Ord)