Exemplo n.º 1
0
        private void DataFromServer(object?sender, MessageEventArgs e)
        {
            if (e.IsPing)
            {
                return;
            }
            IncomingWSS?data = JsonSerializer.Deserialize(e.Data, IncomingWSSContext.Default.IncomingWSS);

            switch (data?.type)
            {
            case DataType.Login:
                Token = data.token;
                break;

            case DataType.Error:
                if (Token is null)
                {
                    Error = data.error;
                }
                else
                {
                    if (OnError is not null)
                    {
                        _ = OnError.Invoke(new Exception(data.error));
                    }
                }
                break;

            case DataType.Message_Create:
                if (MessageReceived is not null)
                {
                    string?obj = data?.data.ToString();
                    if (obj is not null)
                    {
                        SocketMessage?m = JsonSerializer.Deserialize <SocketMessage>(obj);
                        if (m is not null)
                        {
                            m.decrypt(Encryption.File.Channels.GetKey(m.channel_id));
                            _ = MessageReceived.Invoke(m);
                        }
                    }
                }
                break;

            case DataType.Status_Update:
                if (UserStatusUpdate is not null)
                {
                    string?obj = data?.data.ToString();
                    if (obj is not null)
                    {
                        StatusUpdate?SU = JsonSerializer.Deserialize <StatusUpdate>(obj);
                        if (SU is not null)
                        {
                            SocketRemoteUser after = SocketRemoteUser.GetUser(SU.id);
                            after.status = SU.after;
                            SocketRemoteUser before = (SocketRemoteUser)after.Clone();
                            before.status = SU.before;
                            _             = UserStatusUpdate.Invoke(before, after);
                        }
                    }
                }
                break;

            case DataType.Friend_Request:
                if (ReceivedFriendRequest is not null)
                {
                    string?obj = data?.data.ToString();
                    if (obj is not null)
                    {
                        FriendRequest?request = JsonSerializer.Deserialize <FriendRequest>(obj);
                        if (request is not null)
                        {
                            _ = ReceivedFriendRequest.Invoke(SocketRemoteUser.GetUser(request.id));
                        }
                    }
                }
                break;

            case DataType.Friend_Request_Result:
                if (FriendRequestResult is not null)
                {
                    string?obj = data?.data.ToString();
                    if (obj is not null)
                    {
                        FriendRequestResult?FRR = JsonSerializer.Deserialize <FriendRequestResult>(obj);
                        if (FRR is not null && FRR.channel is not null && FRR.id is not null && FRR.result is not null)
                        {
                            SocketChannel chan = SocketChannel.GetChannel((long)FRR.channel);
                            chans.Add(chan);
                            SocketRemoteUser from1 = SocketRemoteUser.GetUser((long)FRR.id);
                            from1.Channel = chan;
                            _             = FriendRequestResult.Invoke(from1, (bool)FRR.result);
                        }
                    }
                }
                break;

            case DataType.Call_Info:
                if (IncommingCall is not null)
                {
                    string?obj = data?.data.ToString();
                    if (obj is not null)
                    {
                        callinfoinc?ci = JsonSerializer.Deserialize <callinfoinc>(obj);
                        if (ci is not null)
                        {
                            _ = IncommingCall.Invoke(SocketChannel.GetChannel(ci.channel), SocketRemoteUser.GetUser(ci.from));
                        }
                    }
                }
                break;

            case DataType.Call_Data:
                if (AudioClient is not null)
                {
                    AudioClient.Givedata(data.data);
                }
                break;

            case DataType.Key_Exchange:
                try
                {
                    string?obj = data?.data.ToString();
                    if (obj is not null)
                    {
                        KeyExchange?KE = JsonSerializer.Deserialize <KeyExchange>(obj);
                        if (KE is not null)
                        {
                            Encryption.File.Channels.AddKey(KE.channel, Encryption.Encoder.GetString(Encryption.Decrypt(Convert.FromBase64String(KE.key))));
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (OnError is not null)
                    {
                        OnError.Invoke(ex);
                    }
                }
                break;

            default:
                break;
            }
        }