public async Task <bool> Handle(IrcMessage message, CancellationToken token) { if (IrcCommandHelper.TryParse(message.Message, out IrcCommand ircCommand, out string ircParameter) && ircCommand == IrcCommand.Dcc && DccCommandHelper.TryParse(ircParameter, out DccCommand dccCommand, out string dccParameter)) { Console.Write(dccParameter); switch (dccCommand) { case DccCommand.Send: var regex = new Regex("([\\x21-\\x7E]+|\"[\\x20-\\x7E]+\") (\\d+) (\\d+) (\\d+)"); var matches = regex.Match(dccParameter); if (matches.Success && matches.Groups.Count > 4 && uint.TryParse(matches.Groups[2].Value, out var bitwiseIp) && int.TryParse(matches.Groups[3].Value, out var port) && ulong.TryParse(matches.Groups[4].Value, out var filesize)) { var client = new DccClient(matches.Groups[1].Value.Trim('"'), filesize); var ipBytes = BitConverter.GetBytes(bitwiseIp); var host = $"{ipBytes[3]}.{ipBytes[2]}.{ipBytes[1]}.{ipBytes[0]}"; await client.Connect(host, port, token).ConfigureAwait(false); FileReceived?.Invoke(client); } return(true); } } return(false); }
public async Task <bool> Handle(IrcMessage message, CancellationToken token) { if (IrcCommandHelper.TryParse(message.Message, out var ircCommand, out var parameter) && commands.Contains(ircCommand)) { var sender = message.Sender; if (sender != null) { var idx = sender.IndexOf('!'); if (idx >= 0) { sender = sender.Remove(idx); } } var privMessage = parameter; var firstIdx = privMessage.IndexOf('\x01'); var lastIdx = privMessage.LastIndexOf('\x01'); if (firstIdx >= 0 && lastIdx >= 0 && firstIdx != lastIdx) { privMessage = privMessage .Remove(lastIdx)[(firstIdx + 1)..];
public async Task <bool> Handle(IrcMessage message, CancellationToken token) { if (IrcCommandHelper.TryParse(message.Message, out var command, out var parameter)) { switch (command) { /* * case IrcCommand.Cap: * if (parameter.Contains("LS")) * await this.connection.Send(IrcCommand.Cap, "REQ away-notify chghost multi-prefix userhost-in-names"); * if (parameter.Contains("ACK")) * await this.connection.Send(IrcCommand.Cap, "END"); * return true; */ case IrcCommand.Ping: await this.connection.Send(IrcCommand.Pong, parameter, token); return(true); } } return(false); }