discord/Discord/Gateway/GatewayClient.cs
2024-06-09 18:51:48 +12:00

83 lines
2.8 KiB
C#

using System.Reflection;
namespace Discord.Gateway
{
public class Client
{
private WebSocket ws;
private Discord.Client client;
private Timer heartbeat;
public Client(Discord.Client client)
{
ws = new WebSocket();
heartbeat = new Timer(async (s) =>
{
await ws.Send(new GatewayPayload<int?>(GatewayOp.Heartbeat));
});
this.client = client;
}
public async Task Connect()
{
await ws.Connect("wss://gateway.discord.gg/?v=10&encoding=json");
}
public async Task EventLoop()
{
while (true)
{
string json = await ws.Recieve();
GatewayBasicPayload? basic = JSON.Deserialize<GatewayBasicPayload>(json);
Console.WriteLine(basic?.Op);
switch (basic?.Op)
{
case GatewayOp.Dispatch:
Console.WriteLine($"Event: {basic.T}");
switch (basic.T)
{
case "READY":
client.Ready?.Invoke(client);
break;
case "MESSAGE_CREATE":
Message? m = JSON.Deserialize<GatewayPayload<Message>>(json)?.D;
m!.Client = client;
client.MessageCreate?.Invoke(client, m);
break;
}
break;
case GatewayOp.Hello:
GatewayPayload<Payloads.Hello>? helloPayload = GatewayPayload<Payloads.Hello>.Parse(json);
int interval = helloPayload?.D?.HeartbeatInterval ?? Timeout.Infinite;
heartbeat.Change(interval, interval);
Console.WriteLine($"Heartbeat: {interval}");
string name = Assembly.GetExecutingAssembly().GetName().Name!;
GatewayPayload<Payloads.Identify> identify = new(GatewayOp.Identify, new Payloads.Identify()
{
Token = client.Token,
Properties = new Payloads.IdentifyConnectionProperties()
{
Os = Environment.OSVersion.ToString(),
Browser = name,
Device = name
}
});
Console.WriteLine(identify);
await ws.Send(identify);
break;
case GatewayOp.HeartbeatACK:
break;
}
}
}
}
}