using System.Net.WebSockets; using System.Text; namespace Discord.Gateway { internal class WebSocket { private ClientWebSocket ws; public WebSocket() { ws = new ClientWebSocket(); } public async Task Connect(string url) { await ws.ConnectAsync(new Uri(url), CancellationToken.None); } public async Task Send(string text) { await ws.SendAsync(new ReadOnlyMemory(Encoding.UTF8.GetBytes(text)), WebSocketMessageType.Text, true, CancellationToken.None); } public async Task Recieve() { Memory buffer = new Memory(new byte[1024]); ValueWebSocketReceiveResult result; int offset = 0; do { result = await ws.ReceiveAsync(buffer[offset..], CancellationToken.None); offset += result.Count; if (!result.EndOfMessage && offset >= buffer.Length) { ArraySegment newBuffer = new ArraySegment(new byte[buffer.Length * 2]); buffer.CopyTo(newBuffer); buffer = newBuffer; } } while (!result.EndOfMessage); return Encoding.UTF8.GetString(buffer.ToArray(), 0, offset); } } }