private void LocalUserOnLeftChannel(object sender, IrcChannelEventArgs e) { LeftChannel?.Invoke(e.Channel); }
private void DataReceived(object o, MessageEventArgs e) { string originNick; var commands = e.message.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); // Servers like to send commands split in separate messages if (lastMessage != null) { commands[0] = lastMessage + commands[0]; } if (!e.message.EndsWith("\n")) { lastMessage = commands[commands.Length - 1]; commands = commands.Take(commands.Length - 1).ToArray(); } else { lastMessage = null; } foreach (var command in commands) { Console.WriteLine(command); var message = command.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (message[0].Contains('!')) { originNick = message[0].Substring(1, message[0].IndexOf('!') - 1); } else { originNick = message[0].Substring(1); } if (message.Length > 1) { if (message[0].Equals("PING")) { MsgPong(message[1]); } switch (message[1][0]) { //Successful connection case '0': Connected?.Invoke(this, new EventArgs()); break; //ERR message case '4': Error?.Invoke(this, new MessageEventArgs(command.Substring(command.LastIndexOf(':') + 1))); break; } switch (message[1]) { case "353": AddUsers(command); break; //End of names list, guaranteed to get after joining channel case "366": JoinChannel(command); break; case "PART": if (originNick.Equals(nick)) { LeftChannel?.Invoke(this, new MessageEventArgs(command.Substring(command.IndexOf('#')))); } else { UserLeft?.Invoke(this, new ChannelEventArgs(command.Substring(command.IndexOf('#') + 1), originNick)); } break; case "JOIN": if (originNick != nick) { UserJoined?.Invoke(this, new ChannelEventArgs(command.Substring(command.IndexOf('#')), originNick)); } break; case "PRIVMSG": ReceivedMessage?.Invoke(this, new PrivateMessageEventArgs(message[2], originNick, command.Substring(1 + command.IndexOf(':', command.IndexOf("PRIVMSG"))))); break; } } } }