public static void HandleMode(IrcClient client, IrcMessage message) { string target, mode = null; int i = 2; if (message.Command == "MODE") { target = message.Parameters[0]; mode = message.Parameters[1]; } else { target = message.Parameters[1]; mode = message.Parameters[2]; i++; } var eventArgs = new ModeChangeEventArgs(target, new IrcUser(message.Prefix), mode); client.OnModeChanged(eventArgs); // Handle change bool add = mode[0] == '+'; mode = mode.Substring(1); if (target.StartsWith("#")) { var channel = client.Channels[target]; foreach (char c in mode) { // TODO: Handle other types of MODEs if (channel.Mode == null) channel.Mode = string.Empty; if (add) { if (!channel.Mode.Contains(c)) channel.Mode += c.ToString(); } else channel.Mode = channel.Mode.Replace(c.ToString(), string.Empty); } if (message.Command == "324") { var operation = client.RequestManager.DequeueOperation("MODE " + channel.Name); operation.Callback(operation); } } else { // TODO: Handle user modes other than ourselves? foreach (char c in mode) { if (add) { if (!client.User.Mode.Contains(c)) client.User.Mode += c; } else client.User.Mode = client.User.Mode.Replace(c.ToString(), string.Empty); } } }
protected internal virtual void OnModeChanged(ModeChangeEventArgs e) { if (ModeChanged != null) ModeChanged(this, e); }
public static void HandleMode(IrcClient client, IrcMessage message) { string target, mode; if (message.Command == "MODE") { target = message.Parameters[0]; mode = message.Payload.Substring(message.Payload.IndexOf(' ') + 1); } else { target = message.Parameters[1]; mode = message.Payload.Substring(message.Payload.IndexOf(' ') + 1); mode = mode.Substring(mode.IndexOf(' ') + 1); } var eventArgs = new ModeChangeEventArgs(target, new IrcUser(message.Prefix), mode); client.OnModeChanged(eventArgs); // Handle change var change = mode; var parameters = new string[0]; if (change.Contains(' ')) { parameters = change.Substring(change.IndexOf(' ') + 1).Split(' '); change = change.Remove(change.IndexOf(' ')); } bool add = change[0] == '+'; change = change.Substring(1); if (target.StartsWith("#")) { var channel = client.Channels[target]; int i = 0; foreach (char c in change) { if (c == 'o') { var user = parameters[i++]; if (add) channel.Operators.Add(channel.Users[user]); else channel.Operators.Remove(user); } else if (c == 'v') { var user = parameters[i++]; if (add) channel.Voiced.Add(channel.Users[user]); else channel.Voiced.Remove(user); } else if (c == 'b') { var mask = new Mask(parameters[i++], new IrcUser(message.Prefix), DateTime.Now); if (add) channel.Bans.Add(mask); else { if (channel.Bans.ContainsMask(mask)) channel.Bans.Remove(mask); } } else if (c == 'e') { var mask = new Mask(parameters[i++], new IrcUser(message.Prefix), DateTime.Now); if (add) channel.Exceptions.Add(mask); else { if (channel.Exceptions.ContainsMask(mask)) channel.Exceptions.Remove(mask); } } else if (c == 'q') { var mask = new Mask(parameters[i++], new IrcUser(message.Prefix), DateTime.Now); if (add) channel.Quiets.Add(mask); else { if (channel.Quiets.ContainsMask(mask)) channel.Quiets.Remove(mask); } } else if (c == 'I') { var mask = new Mask(parameters[i++], new IrcUser(message.Prefix), DateTime.Now); if (add) channel.Invites.Add(mask); else { if (channel.Invites.ContainsMask(mask)) channel.Invites.Remove(mask); } } else { if (channel.Mode == null) channel.Mode = string.Empty; if (add) { if (!channel.Mode.Contains(c)) channel.Mode += c.ToString(); } else channel.Mode = channel.Mode.Replace(c.ToString(), string.Empty); } } if (message.Command == "324") { var operation = RequestOperation.DequeueOperation("MODE " + channel.Name); operation.Callback(operation); } } else { // TODO: Handle user modes other than ourselves? foreach (char c in change) { if (add) { if (!client.User.Mode.Contains(c)) client.User.Mode += c; } else client.User.Mode = client.User.Mode.Replace(c.ToString(), string.Empty); } } }