c# port of irctokens https://irctokens.hmm.st
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Ben Harris 34991fa269 drop .net 5 who needs it 2 months ago
..
EnumerableExtensions.cs add nuget packaging metadata 2 years ago
Hostmask.cs rename Irc to IRC 2 years ago
IRCTokens.csproj drop .net 5 who needs it 2 months ago
Line.cs rename Irc to IRC 2 years ago
README.md add some links to READMEs 2 years ago
StatefulDecoder.cs Add xmldocs, and handle null bytes 2 years ago
StatefulEncoder.cs rename Irc to IRC 2 years ago

README.md

IRCTokens

this is a c# port of jesopo's irctokens

available on nuget

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<string> {"user", "0", "*", "real name"}};
Console.WriteLine(line);
Console.WriteLine(line.Format());

stateful

see the full example in TokensSample/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<string> {"tokensbot"}});
        Send(new Line {Command = "USER", Params = new List<string> {"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<string> {"#test"}});
                        break;
                    case "PRIVMSG":
                        Send(new Line
                        {
                            Command = "PRIVMSG", Params = new List<string> {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));
    }
}