Luski.Net/Luski.net/Server.Incoming.cs

119 lines
5.3 KiB
C#
Raw Normal View History

2023-01-01 22:50:39 -05:00
using Luski.net.Enums;
using Luski.net.JsonTypes;
using Luski.net.JsonTypes.BaseTypes;
using Luski.net.JsonTypes.HTTP;
using Luski.net.JsonTypes.WSS;
using System;
using System.Text.Json;
using WebSocketSharp;
namespace Luski.net
{
public sealed partial class Server
{
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:
WSSLogin n = JsonSerializer.Deserialize(e.Data, WSSLoginContext.Default.WSSLogin)!;
Token = n.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)
{
SocketMessage? m = JsonSerializer.Deserialize<SocketMessage>(e.Data);
if (m is not null)
{
m.decrypt(Encryption.File.Channels.GetKey(m.ChannelID));
_ = MessageReceived.Invoke(m);
}
}
break;
case DataType.Status_Update:
if (UserStatusUpdate is not null)
{
StatusUpdate? SU = JsonSerializer.Deserialize<StatusUpdate>(e.Data);
if (SU is not null)
{
SocketRemoteUser after = SocketUserBase.GetUser(SU.id, SocketRemoteUserContext.Default.SocketRemoteUser).Result;
after.Status = SU.after;
SocketRemoteUser before = after.Clone();
before.Status = SU.before;
_ = UserStatusUpdate.Invoke(before, after);
}
}
break;
case DataType.Friend_Request:
if (ReceivedFriendRequest is not null)
{
FriendRequest? request = JsonSerializer.Deserialize(e.Data, FriendRequestContext.Default.FriendRequest);
if (request is not null) _ = ReceivedFriendRequest.Invoke(SocketUserBase.GetUser(request.Id, SocketRemoteUserContext.Default.SocketRemoteUser).Result);
}
break;
case DataType.Friend_Request_Result:
if (FriendRequestResult is not null)
{
FriendRequestResult? FRR = JsonSerializer.Deserialize<FriendRequestResult>(e.Data);
if (FRR is not null && FRR.Channel is not null && FRR.Id is not null && FRR.Result is not null)
{
SocketDMChannel chan = SocketChannel.GetChannel((long)FRR.Channel, SocketDMChannelContext.Default.SocketDMChannel).Result;
chans.Add(chan);
SocketRemoteUser from1 = SocketUserBase.GetUser((long)FRR.Id, SocketRemoteUserContext.Default.SocketRemoteUser).Result;
from1.Channel = chan;
_ = FriendRequestResult.Invoke(from1, (bool)FRR.Result);
}
}
break;
case DataType.Call_Info:
if (IncommingCall is not null)
{
callinfoinc? ci = JsonSerializer.Deserialize<callinfoinc>(e.Data);
if (ci is not null) _ = IncommingCall.Invoke(SocketChannel.GetChannel(ci.channel, SocketTextChannelContext.Default.SocketTextChannel).Result, SocketUserBase.GetUser(ci.from, SocketRemoteUserContext.Default.SocketRemoteUser).Result);
}
break;
case DataType.Call_Data:
if (AudioClient is not null)
{
AudioClient.Givedata(e.Data);
}
break;
case DataType.Key_Exchange:
try
{
KeyExchange? KE = JsonSerializer.Deserialize<KeyExchange>(e.Data);
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;
}
}
private class callinfoinc
{
public long channel { get; set; } = default!;
public long from { get; set; } = default!;
}
}
}