From dfcab14e4d593f6a51db3fa5cf61f0358dc0f280 Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Sun, 25 Nov 2018 02:19:42 -0500 Subject: group chat invite message. --- src/Data/Tox/Msg.hs | 85 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 14 deletions(-) (limited to 'src/Data/Tox/Msg.hs') diff --git a/src/Data/Tox/Msg.hs b/src/Data/Tox/Msg.hs index 84fffb12..d42b092b 100644 --- a/src/Data/Tox/Msg.hs +++ b/src/Data/Tox/Msg.hs @@ -1,28 +1,32 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE DefaultSignatures #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE PolyKinds #-} -{-# LANGUAGE TypeFamilies #-} -{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE PolyKinds #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE TypeFamilies #-} module Data.Tox.Msg where -import Data.ByteString as B +import Data.ByteString as B import Data.Dependent.Sum +import Data.Functor.Contravariant +import Data.Functor.Identity import Data.GADT.Compare import Data.GADT.Show -import Data.Functor.Identity +import Data.Monoid import Data.Serialize -import Data.Text as T -import Data.Text.Encoding as T +import Data.Text as T +import Data.Text.Encoding as T import Data.Typeable import Data.Word import GHC.TypeLits import Crypto.Tox import Data.PacketBuffer (compressSequenceNumbers, decompressSequenceNumbers) +import Network.Tox.NodeId newtype Unknown = Unknown B.ByteString deriving (Eq,Show) newtype Padded = Padded B.ByteString deriving (Eq,Show) @@ -70,7 +74,7 @@ data Msg (n :: Nat) t where FILE_SENDREQUEST :: Msg 80 Unknown FILE_CONTROL :: Msg 81 Unknown FILE_DATA :: Msg 82 Unknown - INVITE_GROUPCHAT :: Msg 95 Unknown + INVITE_GROUPCHAT :: Msg 95 Invite INVITE_CONFERENCE :: Msg 96 Unknown ONLINE_PACKET :: Msg 97 Unknown DIRECT_CONFERENCE :: Msg 98 Unknown @@ -229,3 +233,56 @@ lossyness m = case msgbyte m of | 192 <= x, x < 255 -> Lossy | otherwise -> Lossless + +newtype ChatID = ChatID Nonce32 + deriving (Eq,Show,Serialize,Sized) + +data InviteType = GroupInvite { groupName :: Text } + | AccptedInvite + | ConfirmedInvite { inviteNodes :: [NodeInfo] } + deriving (Eq,Show) + +instance Sized InviteType where + size = VarSize $ \x -> case x of + GroupInvite name -> B.length (T.encodeUtf8 name) + AccptedInvite -> 0 + ConfirmedInvite ns -> 0 -- TODO: size of node list. + +data Invite = Invite + { inviteChatID :: ChatID + , inviteChatKey :: PublicKey + , invite :: InviteType + } + deriving (Eq,Show) + +instance Sized Invite where + size = contramap inviteChatID size + <> contramap (key2id . inviteChatKey) size + <> contramap invite size + +instance Serialize Invite where + get = do + group_packet_id <- getWord8 -- expecting 254=GP_FRIEND_INVITE + invite_type <- getWord8 + chatid <- get + chatkey <- id2key <$> get + Invite chatid chatkey <$> case invite_type of + 0 -> do bs <- remaining >>= getBytes -- TODO: size can be determined from group shared state. + return $ GroupInvite $ decodeUtf8 bs + 1 -> return AccptedInvite + 2 -> return $ ConfirmedInvite [] -- TODO: decode nodes + + put x = do + putWord8 254 -- GP_FRIEND_INVITE + putWord8 $ case invite x of + GroupInvite {} -> 0 -- GROUP_INVITE + AccptedInvite -> 1 -- GROUP_INVITE_ACCEPTED + ConfirmedInvite {} -> 2 -- GROUP_INVITE_CONFIRMATION + put $ inviteChatID x + put $ key2id $ inviteChatKey x + case invite x of + GroupInvite name -> putByteString $ encodeUtf8 name + AccptedInvite -> return () + ConfirmedInvite ns -> return () -- TODO: encode nodes. + +instance Packet Invite where -- cgit v1.2.3