47 lines
1.3 KiB
C#
47 lines
1.3 KiB
C#
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<byte>(Encoding.UTF8.GetBytes(text)), WebSocketMessageType.Text, true, CancellationToken.None);
|
|
}
|
|
|
|
public async Task<string> Recieve()
|
|
{
|
|
Memory<byte> buffer = new Memory<byte>(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<byte> newBuffer = new ArraySegment<byte>(new byte[buffer.Length * 2]);
|
|
buffer.CopyTo(newBuffer);
|
|
buffer = newBuffer;
|
|
}
|
|
} while (!result.EndOfMessage);
|
|
|
|
return Encoding.UTF8.GetString(buffer.ToArray(), 0, offset);
|
|
}
|
|
}
|
|
}
|