diff --git a/IrcTokens/Line.cs b/IrcTokens/Line.cs index 2e6f696..f574e4e 100644 --- a/IrcTokens/Line.cs +++ b/IrcTokens/Line.cs @@ -201,9 +201,9 @@ namespace IrcTokens if (Params != null && Params.Any()) { var last = Params[^1]; - Params.RemoveAt(Params.Count - 1); + var withoutLast = Params.SkipLast(1).ToList(); - foreach (var p in Params) + foreach (var p in withoutLast) { if (p.Contains(' ', StringComparison.Ordinal)) throw new ArgumentException(@"non-last parameters cannot have spaces", p); @@ -212,7 +212,7 @@ namespace IrcTokens throw new ArgumentException(@"non-last parameters cannot start with colon", p); } - outs.AddRange(Params); + outs.AddRange(withoutLast); if (string.IsNullOrWhiteSpace(last) || last.Contains(' ', StringComparison.Ordinal) || last.StartsWith(':')) diff --git a/IrcTokens/StatefulDecoder.cs b/IrcTokens/StatefulDecoder.cs index bdaf81d..2db32f2 100644 --- a/IrcTokens/StatefulDecoder.cs +++ b/IrcTokens/StatefulDecoder.cs @@ -90,20 +90,20 @@ namespace IrcTokens } } - var decodeLines = new List(); - foreach (var line in listLines.Select(l => l.ToArray())) + _buffer = listLines[^1].ToArray(); + + var decodeLines = new List(); + foreach (var line in listLines.SkipLast(1).Select(l => l.ToArray())) try { - decodeLines.Add(Encoding.GetString(line)); + decodeLines.Add(new Line(Encoding.GetString(line))); } catch (DecoderFallbackException) { - decodeLines.Add(Fallback.GetString(line)); + decodeLines.Add(new Line(Fallback.GetString(line))); } - return decodeLines - .Select(l => new Line(l)) - .ToList(); + return decodeLines; } } } diff --git a/Sample/Client.cs b/Sample/Client.cs index 70444de..933cab7 100644 --- a/Sample/Client.cs +++ b/Sample/Client.cs @@ -25,12 +25,11 @@ namespace TokensSample _socket.Connect("127.0.0.1", 6667); Send(new Line {Command = "NICK", Params = new List {"tokensbot"}}); - Send(new Line {Command = "USER", Params = new List {"username", "0", "*", "real name"}}); + Send(new Line {Command = "USER", Params = new List {"tokensbot", "0", "*", "real name"}}); while (true) { var bytesReceived = _socket.Receive(_bytes); - var lines = _decoder.Push(_bytes); if (bytesReceived == 0) { @@ -39,6 +38,8 @@ namespace TokensSample break; } + var lines = _decoder.Push(_bytes); + foreach (var line in lines) { Console.WriteLine($"< {line.Format()}"); @@ -49,7 +50,10 @@ namespace TokensSample Send(new Line {Command = "PONG", Params = line.Params}); break; case "001": - Send(new Line {Command = "JOIN", Params = new List {"#channel"}}); + 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; } } @@ -60,7 +64,8 @@ namespace TokensSample { Console.WriteLine($"> {line.Format()}"); _encoder.Push(line); - while (_encoder.PendingBytes.Length > 0) _encoder.Pop(_socket.Send(_encoder.PendingBytes)); + while (_encoder.PendingBytes.Length > 0) + _encoder.Pop(_socket.Send(_encoder.PendingBytes)); } } }