From 21f1e95fb8e935134a969bc3d729964d8d2aadfa Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Thu, 14 May 2020 23:06:10 -0400 Subject: rename Irc to IRC --- IRCStates/README.md | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 IRCStates/README.md (limited to 'IRCStates/README.md') diff --git a/IRCStates/README.md b/IRCStates/README.md new file mode 100644 index 0000000..05daa8c --- /dev/null +++ b/IRCStates/README.md @@ -0,0 +1,82 @@ +# IrcStates + +port of [jesopo/ircstates](https://github.com/jesopo/ircstates) + +bare bones irc client state + +see the full example in [StatesSample/Client.cs](../Examples/States/Client.cs) + + internal class Client + { + private readonly byte[] _bytes; + private readonly StatefulEncoder _encoder; + private readonly string _host; + private readonly string _nick; + private readonly int _port; + private readonly Server _server; + private readonly Socket _socket; + + public Client(string host, int port, string nick) + { + _server = new Server("test"); + _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + _encoder = new StatefulEncoder(); + _host = host; + _port = port; + _nick = nick; + _bytes = new byte[1024]; + } + + private void Send(string raw) + { + _encoder.Push(new Line(raw)); + } + + public void Start() + { + _socket.Connect(_host, _port); + while (!_socket.Connected) Thread.Sleep(1000); + + Send("USER test 0 * test"); + Send($"NICK {_nick}"); + + while (true) + { + while (_encoder.PendingBytes.Any()) + { + var bytesSent = _socket.Send(_encoder.PendingBytes); + var sentLines = _encoder.Pop(bytesSent); + foreach (var line in sentLines) Console.WriteLine($"> {line.Format()}"); + } + + var bytesReceived = _socket.Receive(_bytes); + if (bytesReceived == 0) + { + Console.WriteLine("! disconnected"); + _socket.Shutdown(SocketShutdown.Both); + _socket.Close(); + break; + } + + var receivedLines = _server.Receive(_bytes, bytesReceived); + foreach (var (line, _) in receivedLines) + { + Console.WriteLine($"< {line.Format()}"); + + switch (line.Command) + { + case Commands.Privmsg: + if (line.Params[1].Contains(_server.NickName)) + Send($"PRIVMSG {line.Params[0]} :hi {line.Hostmask.NickName}!"); + break; + case "PING": + Send($"PONG :{line.Params[0]}"); + break; + case Numeric.RPL_WELCOME: + if (!_server.HasChannel("#test")) Send("JOIN #test"); + break; + } + } + } + } + } \ No newline at end of file -- cgit 1.4.1