blob: 83b5956653f164d4fa499b636fde8858051d3958 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
{-# 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
toEncoding Status{..} =
pairs ("_id" .= statusId
<> "hib" .= statusCanHibernate
<> "bo" .= statusBatteryOptimizations
<> "loc" .= statusLocationPermission
<> "ps" .= statusPhonePowerSaveMode
<> "wifi" .= statusWifiOnOff
)
|