diff options
author | Ben Harris <ben@tilde.team> | 2020-05-14 22:17:22 -0400 |
---|---|---|
committer | Ben Harris <ben@tilde.team> | 2020-05-14 22:17:22 -0400 |
commit | 304df7805b9925c2edd992fd4177eef80197f807 (patch) | |
tree | 16a56a66e40f1f5b17398b563da315bf71733ad7 /Examples | |
parent | 43aec9591c9546b5574f1bb60fe3a8b23d6d9630 (diff) |
working ircstates example
Diffstat (limited to 'Examples')
-rw-r--r-- | Examples/States/Client.cs | 84 | ||||
-rw-r--r-- | Examples/States/Program.cs | 7 |
2 files changed, 87 insertions, 4 deletions
diff --git a/Examples/States/Client.cs b/Examples/States/Client.cs new file mode 100644 index 0000000..78d253f --- /dev/null +++ b/Examples/States/Client.cs @@ -0,0 +1,84 @@ +using System; +using System.Linq; +using System.Net.Sockets; +using System.Threading; +using IrcStates; +using IrcTokens; + +namespace StatesSample +{ + 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; + } + } + } + } + } +} diff --git a/Examples/States/Program.cs b/Examples/States/Program.cs index 8fc42b8..8ad7bf7 100644 --- a/Examples/States/Program.cs +++ b/Examples/States/Program.cs @@ -1,12 +1,11 @@ -using System; - -namespace StatesSample +namespace StatesSample { public static class Program { private static void Main(string[] args) { - Console.WriteLine("Hello World!"); + var client = new Client("localhost", 6667, "statesbot"); + client.Start(); } } } |