aboutsummaryrefslogtreecommitdiff
path: root/lib/OwnTracks/Status.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/OwnTracks/Status.hs')
-rw-r--r--lib/OwnTracks/Status.hs65
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/OwnTracks/Status.hs b/lib/OwnTracks/Status.hs
new file mode 100644
index 0000000..83b5956
--- /dev/null
+++ b/lib/OwnTracks/Status.hs
@@ -0,0 +1,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
+ )