diff options
Diffstat (limited to 'lib/OwnTracks/Status.hs')
| -rw-r--r-- | lib/OwnTracks/Status.hs | 65 |
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 + ) |
