Files
2023-03-12 14:42:15 -04:00

196 lines
6.6 KiB
C#

using System;
using System.Diagnostics;
using System.Reactive.Linq;
using System.Text.Json.Nodes;
using Websocket.Client;
using Discord_Client_Custom.client_internals;
using Discord_Client_Custom.Channels;
using System.ComponentModel;
namespace Discord_Client_Custom.Connections
{
internal class Connection
{
private static Uri gateWayUrl = new Uri("wss://gateway.discord.gg/?v=10&encoding=json");
private static ManualResetEvent exitEvent = new ManualResetEvent(false);
private static int heartBeatSequence = 0;
private int heartBeatInterval = 0;
int heartBeatCounter = 0;
private WebsocketClient WS;
private GateWayIntents intents;
public JsonNode uInfoRaw;
private object gateWayProperties;
private readonly mainPage pageRef;
private async void heartBeat(object o)
{
var obj = new { op = 1, d = heartBeatSequence };
var toSend = System.Text.Json.JsonSerializer.Serialize(obj);
WS.Send(toSend);
heartBeatCounter++;
Debug.WriteLine("PING");
}
private void startHeartBeat(object o)
{
var confObj = JsonNode.Parse(o.ToString());
heartBeatInterval = (int)confObj["d"]["heartbeat_interval"];
Debug.WriteLine("INTERVAL SET TO: " + heartBeatInterval.ToString());
gateWayProperties = new
{
os = "linux",
browser = "ion_",
device = "my_library"
};
var idObj = new
{
op = 2,
d = new
{
token = MsgRequests.userToken,
intents = intents.value, //61440,
properties = gateWayProperties
}
};
WS.Send(System.Text.Json.JsonSerializer.Serialize(idObj));
var autoEvent = new AutoResetEvent(false);
var stateTimer = new System.Threading.Timer(heartBeat, autoEvent, 0, heartBeatInterval);
}
private void getStatusUpdate(object statusObj)
{
//Console.WriteLine(statusObj.ToString() + "\n\n");
}
//{"t":"MESSAGE_CREATE","s":3,"op":0,"d":{"type":0,"tts":false,"timestamp":"2023-03-12T16:13:52.238000+00:00","referenced_message":null,"pinned":false,"nonce":"1084509575685603328","mentions":[],"mention_roles":[],"mention_everyone":false,"id":"1084509576445042838","flags":0,"embeds":[],"edited_timestamp":null,"content":"ping","components":[],"channel_id":"907088809169158164","author":{"username":"1.1.5","public_flags":0,"id":"720349017829015633","display_name":null,"discriminator":"4592","avatar_decoration":null,"avatar":null},"attachments":[]}}
private void messageEvent(object msgObj)
{
pageRef.insertMessageObj(msgObj);
}
private bool isRunning(bool printToDebug = false)
{
if (printToDebug) Debug.WriteLine("WEBSOCKET SERVER IS RUNNING? " + WS.IsRunning.ToString());
return WS.IsRunning;
}
// Setters
// https://discord.com/developers/docs/topics/gateway-events#update-presence
public async void setStatusUpdate(string status)
{
var idObj = new
{
op = 3,
d = new
{
since = 0,
activities = new object[0],
status = status,
afk = false
}
};
var objToSend = System.Text.Json.JsonSerializer.Serialize(idObj);
WS.Send(objToSend);
}
public async void connect(FlowLayoutPanel dmFlowPannel)
{
using (var client = new WebsocketClient(gateWayUrl))
{
client.ReconnectTimeout = TimeSpan.FromSeconds(30);
client.ReconnectionHappened.Subscribe(info =>
Debug.WriteLine($"Reconnection happened, type: {info.Type}"));
//"READY" info dump handling
client.MessageReceived.Where((msg) =>
{
var msgObj = JsonNode.Parse(msg.Text);
return (int)msgObj["op"] == 0 && msgObj["t"].ToString() == "READY";
}).Subscribe((msg) =>
{
var configs = JsonNode.Parse(msg.Text);
//var c = new Client(configs["d"], dmFlowPannel);
Debug.WriteLine("\n\nlhkdsfgjhdsgfhsjdgf\n\n");
uInfoRaw = configs["d"];
});
client.MessageReceived.Where((msg) =>
{
var msgObj = JsonNode.Parse(msg.Text);
return ((string)msgObj["t"] == "PRESENCE_UPDATE");
}).Subscribe(getStatusUpdate);
//client.MessageReceived.Subscribe(msg => Console.WriteLine($"Message received: {msg}"));
/*client.MessageReceived.Where(msg =>
{
var msgObj = JsonNode.Parse(msg.Text);
if (msgObj["t"] != null) return msgObj["t"].ToString() != "READY";
else return true;
}).Subscribe((msg) => Debug.WriteLine($"Message received: {msg}"));*/
client.MessageReceived.Where((msg) =>
{
var msgObj = JsonNode.Parse(msg.Text);
return ((int)msgObj["op"] == 10);
}).Subscribe((object o) =>
{
intents = new GateWayIntents(true);
//throw new Exception(intents.ToString());
startHeartBeat(o);
});
client.MessageReceived.Where((msg) =>
{
var msgObj = JsonNode.Parse(msg.Text);
return ((string)msgObj["t"] == "PRESENCE_UPDATE");
}).Subscribe(getStatusUpdate);
client.MessageReceived.Where((msg) =>
{
var msgObj = JsonNode.Parse(msg.Text);
return ((int)msgObj["op"] == 0) && msgObj["t"].ToString() == "MESSAGE_CREATE";
}).Subscribe(messageEvent);
client.DisconnectionHappened.Subscribe((info) => Debug.WriteLine(info.ToString()));
client.Start();
WS = client;
await Task.Run(() => client.Send("{ message }"));
exitEvent.WaitOne();
//return this.uInfoRaw;
}
}
public Connection(mainPage pageRefTemp)
{
this.pageRef = pageRefTemp;
}
}
}