{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE RecordWildCards #-} module OwnTracks.Status -- | https://owntracks.org/booklet/tech/json/ (Status(..)) where import Data.Aeson import Data.Aeson.Types (Parser) import Data.ByteString (ByteString) import Data.ByteString.Base64 import Data.Data (Proxy (..)) import Data.Functor ((<&>)) import Data.Text (Text) import qualified Data.Text as T import Data.Text.Encoding (encodeUtf8) import Data.Time (UTCTime, defaultTimeLocale, parseTimeM) import GHC.Generics (Generic) -- | An owntracks message with _type=status. -- -- Currently only implements android-specific fields. data Status = Status { statusId :: Maybe Text -- ^ random identifier to be used by consumers to correlate & distinguish send/return messages (Android/string) , statusCanHibernate :: Maybe Int -- ^ app can hibernate if not used (Android/integer) , statusBatteryOptimizations :: Maybe Int -- ^ app is configured with battery optimizations (Android/integer) , statusLocationPermission :: Maybe Int -- ^ app location permissions (Android/integer) , statusPhonePowerSaveMode :: Maybe Int -- ^ phone power save mode (Android/integer) , statusWifiOnOff :: Maybe Int -- ^ wifi is on/off (Android/integer) } deriving (Generic, Eq, Show) instance FromJSON Status where parseJSON (Object v) = do a <- v .:? "android" Status <$> v .:? "_id" <*> a .:?? "hib" <*> a .:?? "bo" <*> a .:?? "loc" <*> a .:?? "ps" <*> a .:?? "wifi" where (.:??) :: FromJSON a => Maybe Object -> Data.Aeson.Key -> Parser (Maybe a) (.:??) Nothing = const $ pure Nothing (.:??) (Just a) = (.:?) a instance ToJSON Status where toJSON Status{..} = object [ "_id" .= statusId , "hib" .= statusCanHibernate , "bo" .= statusBatteryOptimizations , "loc" .= statusLocationPermission , "ps" .= statusPhonePowerSaveMode , "wifi" .= statusWifiOnOff ] toEncoding Status{..} = pairs ("_id" .= statusId <> "hib" .= statusCanHibernate <> "bo" .= statusBatteryOptimizations <> "loc" .= statusLocationPermission <> "ps" .= statusPhonePowerSaveMode <> "wifi" .= statusWifiOnOff )