# IRCTokens this is a c\# port of jesopo's [irctokens]( https://github.com/jesopo/irctokens) available on [nuget](https://www.nuget.org/packages/IRCTokens) ## usage ### tokenization using IRCTokens; ... var line = new Line("@id=123 :ben!~ben@host.tld PRIVMSG #channel :hello there!"); Console.WriteLine(line); Console.WriteLine(line.Format()); ### formatting var line = new Line {Command = "USER", Params = new List {"user", "0", "*", "real name"}}; Console.WriteLine(line); Console.WriteLine(line.Format()); ### stateful see the full example in [TokensSample/Client.cs](../Examples/Tokens/Client.cs) public class Client { private readonly byte[] _bytes; private readonly StatefulDecoder _decoder; private readonly StatefulEncoder _encoder; private readonly Socket _socket; 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); while (!_socket.Connected) Thread.Sleep(1000); Send(new Line {Command = "NICK", Params = new List {"tokensbot"}}); Send(new Line {Command = "USER", Params = new List {"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 Line {Command = "PONG", Params = line.Params}); break; case "001": Send(new Line {Command = "JOIN", Params = new List {"#test"}}); break; case "PRIVMSG": Send(new Line { Command = "PRIVMSG", Params = new List {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)); } }