using IrcTokens; using System; using System.Collections.Generic; using System.Net.Sockets; namespace TokensSample { public class Client { private readonly Socket _socket; private readonly StatefulDecoder _decoder; private readonly StatefulEncoder _encoder; private readonly byte[] _bytes; public Client() { _decoder = new StatefulDecoder(); _encoder = new StatefulEncoder(); _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); _bytes = new byte[1024]; } public void Start() { _socket.Connect("127.0.0.1", 6667); Send(new Line { Command = "USER", Params = new List { "username", "0", "*", "real name" } }); Send(new Line { Command = "NICK", Params = new List { "tokensbot" } }); while (true) { var bytesReceived = _socket.Receive(_bytes); var lines = _decoder.Push(_bytes); if (bytesReceived == 0) { Console.WriteLine("! disconnected"); _socket.Shutdown(SocketShutdown.Both); break; } foreach (var line in lines) { Console.WriteLine($"< {line.Format()}"); switch (line.Command) { case "PING": Send(new Line { Command = "PONG", Params = line.Params }); break; case "001": Send(new Line { Command = "JOIN", Params = new List { "#channel" } }); break; } } } } private void Send(Line line) { Console.WriteLine($"> {line.Format()}"); _encoder.Push(line); while (_encoder.PendingBytes.Length > 0) { _encoder.Pop(_socket.Send(_encoder.PendingBytes)); } } } }