using System; using System.Net.Sockets; using System.Threading; using IRCTokens; // ReSharper disable StringLiteralTypo namespace Tokens; public class Client { private readonly byte[] _bytes = new byte[1024]; private readonly StatefulDecoder _decoder = new(); private readonly StatefulEncoder _encoder = new(); private readonly Socket _socket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); public void Start() { _socket.Connect("127.0.0.1", 6667); while (!_socket.Connected) Thread.Sleep(1000); Send(new("NICK", "tokensbot")); Send(new("USER", "tokensbot", "0", "*", "real name")); while (true) { var bytesReceived = _socket.Receive(_bytes); if (bytesReceived == 0) { Console.WriteLine("! disconnected"); _socket.Shutdown(SocketShutdown.Both); _socket.Close(); break; } var lines = _decoder.Push(_bytes, bytesReceived); foreach (var line in lines) { Console.WriteLine($"< {line.Format()}"); switch (line.Command) { case "PING": Send(new("PONG", line.Params[0])); break; case "001": Send(new("JOIN", "#irctokens")); break; case "PRIVMSG": Send(new("PRIVMSG", line.Params[0], "hello there")); break; } } } } private void Send(Line line) { Console.WriteLine($"> {line.Format()}"); _encoder.Push(line); while (_encoder.PendingBytes.Length > 0) _encoder.Pop(_socket.Send(_encoder.PendingBytes, SocketFlags.None)); } }