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(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(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(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(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(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!; } } }