module Rattletrap.Decode.RemoteId ( decodeRemoteIdBits ) where import Data.Semigroup ((<>)) import Rattletrap.Decode.Bitstream import Rattletrap.Decode.Common import Rattletrap.Decode.Word64le import Rattletrap.Type.RemoteId import Rattletrap.Type.Word8le import Rattletrap.Utility.Bytes import qualified Data.ByteString.Lazy as LazyBytes import qualified Data.Text as Text import qualified Data.Text.Encoding as Text import qualified Data.Word as Word decodeRemoteIdBits :: (Int, Int, Int) -> Word8le -> DecodeBits RemoteId decodeRemoteIdBits (_, _, patch) systemId = case word8leValue systemId of 0 -> RemoteIdSplitscreen <$> getWord32be 24 1 -> RemoteIdSteam <$> decodeWord64leBits 2 -> RemoteIdPlayStation <$> decodePsName <*> decodePsBytes patch 4 -> RemoteIdXbox <$> decodeWord64leBits 6 -> RemoteIdSwitch <$> decodeBitstreamBits 256 _ -> fail ("unknown system id " <> show systemId) decodePsName :: DecodeBits Text.Text decodePsName = fmap ( Text.dropWhileEnd (== '\x00') . Text.decodeLatin1 . LazyBytes.toStrict . reverseBytes ) (getLazyByteStringBits 16) decodePsBytes :: Int -> DecodeBits [Word.Word8] decodePsBytes patch = LazyBytes.unpack <$> getLazyByteStringBits (if patch >= 1 then 24 else 16)