mirror of
https://github.com/ION606/Discord-Client.git
synced 2026-05-14 21:06:55 +00:00
196 lines
6.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|