public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 4) { e.User.ErrorNeedMoreParams(CMD); return; } if (e.User.Level != Authorizations.Connecting || e.User.HasSessionFlag("PassedUser")) { e.User.ErrorAlreadyRegistered(CMD); return; } e.User.Mask.Username = e.User.MakeUsername(e.Arguments[0]); e.User.Gecos = e.Arguments[3]; if (!e.User.HasSessionFlag("PassedNick") || e.User.HasSessionFlag("WaitForCap")) { e.User.SetSessionFlag("PassedUser"); return; } e.User.ClearSessionFlag("PassedNick"); e.User.OnConnected(); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } else if (e.Arguments.Length < 2) { ChannelBase channel = e.User.GetChannel(e.Arguments[0]); if (channel == null) { e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You are not on that channel."); return; } e.User.SendNumeric(Numerics.RPL_CHANNELMODEIS, channel.Name, channel.GetModeString()); return; } string args; if (e.Arguments.Length > 2) { args = string.Join(" ", e.Arguments, 2, e.Arguments.Length - 2); } else { args = string.Empty; } foreach (string t in e.Arguments[0].Split(',')) { try { if (".!#&".Contains(t[0])) { ChannelBase channel = e.User.GetChannel(t); if (channel == null) { e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, t, ":You are not on that channel."); return; } channel.SetModes(e.User, e.Arguments[1], args); } else if (t.ToLower() != e.User.Id) { e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, ":You can only set user mode flags on yourself."); } else { e.User.SetModes(e.User, e.Arguments[1], args); } } catch (Exception ex) { e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error setting mode:", ex.Message); } } }
protected virtual void OnReceivedCommand(ReceivedCommandEventArgs e) { if (ReceivedCommand != null) { ReceivedCommand(this, e); } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.User.Level >= Authorizations.Unregistered) { e.User.BroadcastInclusive(CMD, e.User.Mask, "Client quit."); } e.User.Dispose("Client quit."); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); } e.User.Names(e.Arguments[0]); }
private void EventReceivedCommand(List <string> iCommand) { //返すデータの設定 ReceivedCommandEventArgs e = new ReceivedCommandEventArgs(); e.Command = iCommand; //イベントの発生 OnReceivedCommand(e); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 2) { e.User.ErrorNeedMoreParams(CMD); return; } ChannelBase channel = e.Server.GetChannel(e.Arguments[0]); if (channel == null) { char c = e.Arguments[0][0]; if (c == '#' || c == '&' || c == '+') { e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist."); return; } UserBase user = e.Server.GetUser(e.Arguments[0]); if (user == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That user does not exist."); return; } user.SendCommand(CMD, e.User.Mask, user.Mask.Nickname, e.Arguments[1]); } else { if (!e.User.IsVoice(channel) && !e.User.CanSendToChannel(channel, false, "talk")) { return; } if (channel.HasFlag("NoColors") && e.Arguments[1].Contains(((char)3).ToString())) { e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":Colors are disallowed on this channel. Your message was blocked."); return; } if (channel.HasFlag("NoCtcps") && e.Arguments[1][0] == 1 && !e.Arguments[1].StartsWith("\x0001ACTION")) { e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":CTCPs are disallowed on this channel. Your message was blocked."); return; } if (channel.HasFlag("NoActions") && e.Arguments[1].StartsWith("\x0001ACTION")) { e.User.SendNumeric(Numerics.ERR_CANNOTSENDTOCHAN, CMD, channel.Name, ":Actions are disallowed on this channel. Your message was blocked."); return; } channel.BroadcastExclusive(CMD, e.User, channel.Name, e.Arguments[1]); } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } e.User.SendCommand("PONG", e.Server.Id, e.Server.Id, e.Arguments[0]); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } UserBase user = e.Server.GetUser(e.Arguments[0]); e.User.SendNumeric(Numerics.RPL_ISON, ":ison:", user == null ? "no such user" : user.Mask.Nickname); }
public void Handler(object sender, ReceivedCommandEventArgs e) { e.User.SendNumeric(Numerics.RPL_COMMITSTART, ":Committing cache..."); try { e.Server.CommitCache(); e.User.SendNumeric(Numerics.RPL_COMMITSUCCESS, ":The cache was successfully committed."); } catch (Exception ex) { e.User.SendNumeric(Numerics.ERR_COMMITFAIL, ":The commit failed:", ex.Message); } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } string[] channels = e.Arguments[0].Split(','); for (int i = 0; i < channels.Length; i++) { try { ChannelBase channel = e.Server.GetChannel(channels[i]); if (channel == null) { if (!e.Server.IsValidChannel(channels[i])) { e.User.SendNumeric(Numerics.ERR_BADCHANMASK, channels[i], ":That is an invalid channel name."); continue; } channel = e.Server.CreateChannel(channels[i], e.User); if (channel == null) { continue; } if (!e.User.AddToChannel(channel)) { e.User.SendNumeric(Numerics.ERR_CONCURRENCY, ":A concurrency error occurred while joining the channel."); return; } channel.BroadcastInclusive("JOIN", e.User, channel.Name); e.User.Names(channel); e.Server.Channels[channel.Name] = channel; } else { e.User.SendNumeric(Numerics.ERR_CHANNELEXISTS, channels[i], ":That channel already exists."); } } catch (Exception ex) { e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error joining channel:", ex.Message); } } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } if (!e.User.ClearSessionFlag("SaslRequested")) { e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, ":CAP AUTHENTICATE can only be issued after requesting \"sasl\" via CAP REQ."); return; } switch (e.Arguments[0]) { case "*": e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":Client aborted SASL authentication."); break; case "-": e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":Client sent blank SASL authentication code."); break; case "PLAIN": if (e.User.HasSessionFlag("SaslPlain")) { e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":You have already chosen an authentication method."); } else { e.User.SetSessionFlag("SaslPlain"); e.User.SendCommand(CMD, e.User.Server.Id, e.User.Mask.Nickname, "AUTHENTICATE +"); } break; default: if (e.User.ClearSessionFlag("SaslPlain")) { AuthenticatePlain(e.User, e.Arguments[0]); } else { e.User.SendNumeric(Numerics.ERR_SASLABORTED, ":That SASL authentication method is not supported. Use PLAIN instead."); } break; } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); } UserBase user = e.Server.GetUser(e.Arguments[0]); if (user == null) { e.User.SendNumeric(Numerics.RPL_USERHOST, ":no such user"); } else { e.User.SendNumeric(Numerics.RPL_USERHOST, ":" + user.Mask.Nickname + "=+" + user.Mask.Username + "@" + user.Mask.Hostname); } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 2) { e.User.ErrorNeedMoreParams(CMD); return; } ChannelBase channel; if (e.User.Level >= Authorizations.NetworkOperator) { channel = e.Server.GetChannel(e.Arguments[0]); if (channel == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist."); return; } if (!e.User.IsOperator(channel)) { e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You need to be a channel operator or IRCop to kick from that channel."); return; } } else { channel = e.User.GetChannel(e.Arguments[0]); if (channel == null) { e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You are not on that channel."); return; } } UserBase target = channel.GetUser(e.Arguments[1]); if (target == null) { e.User.SendNumeric(Numerics.ERR_USERNOTINCHANNEL, e.Arguments[1], channel.Name, ":That user is not in the specified channel."); return; } channel.BroadcastInclusive(CMD, e.User, channel.Name, target.Mask.Nickname, e.Arguments.Length > 2 ? e.Arguments[2] : "User kicked from channel."); channel.RemoveUser(target); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } ChannelBase channel = e.User.GetChannel(e.Arguments[0]); if (channel == null) { e.User.SendNumeric(Numerics.ERR_NOTONCHANNEL, e.Arguments[0], ":You cannot leave a channel before joining it."); return; } channel.BroadcastInclusive(CMD, e.User, channel.Name, "Leaving."); channel.RemoveUser(e.User); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } UserSurrogate user = e.Server.GetRegisteredUser(e.Arguments[0]); if (user == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, e.Arguments[0].ToLower(), ":That account is not registered."); return; } user.Level = Authorizations.NetworkOperator; user.Commit(); e.User.SendNumeric(Numerics.RPL_DEMOTED, user.Mask.Account, ":That user is no longer an IRCop."); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, ":Syntax: /login [account] <password>"); return; } string account, password; if (e.Arguments.Length > 1) { account = e.Arguments[0].ToLower(); password = e.Arguments[1]; } else { account = e.User.Mask.Nickname.ToLower(); password = e.Arguments[0]; } byte[] hash = Password.Hash(password); if (hash == null) { e.User.SendNumeric(Numerics.ERR_COMPUTEHASH, CMD, ":Unable to compute password hash."); return; } if (e.Server.LogIn(e.User, account, hash)) { e.User.SendNumeric(Numerics.RPL_IDENTIFIED, CMD, e.User.Mask.Account, ":You are now logged in as " + e.User.Mask.Account + "."); if (e.User.Level == Authorizations.NetworkOperator && !e.Server.NetworkOperators.Contains(e.User)) { e.Server.NetworkOperators.Add(e.User); } } else { e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":Invalid credentials."); } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } UserBase user = e.Server.GetUser(e.Arguments[0]); if (user == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That nickname does not exist."); return; } string reason = e.Arguments.Length > 1 ? "Killed: " + e.Arguments[1] : "Killed by network operator."; e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, reason); e.User.Dispose(reason); }
public void Handler(object sender, ReceivedCommandEventArgs e) { e.User.SendNumeric(Numerics.RPL_LISTSTART, "Channels", ":" + e.User.Mask.Nickname); foreach (ChannelBase c in e.Server.Channels.Values) { if (c.HasFlag("Secret") && e.User.Level < Authorizations.NetworkOperator && !e.User.IsVoice(c) && !e.User.Channels.ContainsKey(c.Id)) { e.User.SendNumeric(Numerics.RPL_LIST, "*", c.Users.Count); } else if (c.Properties.ContainsKey("Topic")) { e.User.SendNumeric(Numerics.RPL_LIST, c.Name, c.Users.Count, ":" + c.Properties["Topic"]); } else { e.User.SendNumeric(Numerics.RPL_LIST, c.Name, c.Users.Count); } } e.User.SendNumeric(Numerics.RPL_LISTEND, ":End of channel list."); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 2) { e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, ":Syntax: /register <password> <e-mail>"); return; } if (e.Arguments[0].Length < 7) { e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":Your password must be at least seven characters in length."); return; } if (!Email.IsMatch(e.Arguments[1])) { e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":The specified e-mail address is invalid."); return; } byte[] password = Password.Hash(e.Arguments[0]); if (password == null) { e.User.SendNumeric(Numerics.ERR_COMPUTEHASH, CMD, ":Unable to computer password hash."); return; } if (!e.User.Register(password, e.Arguments[1])) { e.User.SendNumeric(Numerics.ERR_ALREADYREGISTERED, ":You are already registered."); return; } if (e.User.Level == Authorizations.NetworkOperator && !e.Server.NetworkOperators.Contains(e.User)) { e.Server.NetworkOperators.Add(e.User); } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } string id = e.Arguments[0].ToLower(); if ("#&".Contains(id[0])) { e.User.SendNumeric(Numerics.ERR_COMMANDSPECIFIC, CMD, ":You cannot drop an unregistered channel."); return; } else if (".!".Contains(id[0])) { ChannelSurrogate channel = e.Server.GetRegisteredChannel(id); if (channel == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, id, ":That channel is not registered."); return; } if (e.User.Level < Authorizations.NetworkOperator) { e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You must be a channel owner or IRCop to drop a channel."); return; } if (channel is ChannelBase) { ChannelBase cb = (ChannelBase)channel; foreach (UserBase u in cb.Users.Values) { u.SendCommand("KICK", e.User.Mask, cb.Name, u.Mask.Nickname, "Channel dropped."); } cb.Dispose(); } e.Server.Cache.Channels.Remove(id); e.User.SendNumeric(Numerics.RPL_CHANNELDROPPED, id, ":That channel was dropped."); } else if (id != e.User.Mask.Account && e.User.Level < Authorizations.NetworkOperator) { e.User.SendNumeric(Numerics.ERR_NOPRIVILEGES, ":You need to be logged in as that user or be an IRCop to drop that account."); return; } else { UserSurrogate user = e.Server.GetRegisteredUser(id); if (user == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, id, ":That account does not exist."); return; } user.Level = Authorizations.Unregistered; user.Commit(); if (user is UserBase) { e.User.SendNumeric(Numerics.RPL_ACCOUNTDROPPED, id, ":Your account was dropped."); } if (user != e.User) { e.User.SendNumeric(Numerics.RPL_ACCOUNTDROPPED, id, ":That account was dropped."); } } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } if (!e.Server.IsValidChannel(e.Arguments[0])) { e.User.SendNumeric(Numerics.ERR_BADCHANMASK, e.Arguments[0], ":That is an invalid channel mask."); return; } ChannelBase channel = e.Server.GetChannel(e.Arguments[0]); if (channel == null || (channel.HasFlag("Secret") && !e.User.IsVoice(channel) && e.User.GetChannel(channel.Name) == null)) { e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel does not exist."); return; } if (e.Arguments.Length > 1) { if (!e.User.IsOperator(channel)) { if (channel.HasFlag("TopicLock")) { e.User.SendNumeric(Numerics.ERR_CHANOPPRIVSNEEDED, channel.Name, ":You must be an operator or higher to change the topic."); return; } else if (!e.User.CanSendToChannel(channel, false, "change the topic")) { return; } } string topic = e.Arguments[1]; if (string.IsNullOrWhiteSpace(topic) || topic == "-") { topic = string.Empty; if (channel.Properties.ContainsKey("Topic")) { channel.Properties.Remove("Topic"); channel.Commit(); } else { return; } } else { int max = e.Server.Settings.MaximumTopicLength; if (topic.Length > max) { topic = topic.Remove(max); } channel.Properties["Topic"] = topic; channel.Commit(); } channel.BroadcastInclusive(CMD, e.User, channel.Name, topic); } else { if (channel.Properties.ContainsKey("Topic")) { e.User.SendNumeric(Numerics.RPL_TOPIC, channel.Name, ":" + (string)channel.Properties["Topic"]); } else { e.User.SendNumeric(Numerics.RPL_NOTOPIC, channel.Name, ":No topic set."); } } }
public void Handler(object sender, ReceivedCommandEventArgs e) { // TODO: Implement SUMMON. e.User.SendNumeric(Numerics.ERR_SUMMONDISABLED, e.Command, ":SUMMON is disabled on this server."); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } if (e.User.Level != Authorizations.Connecting) { e.User.ErrorAlreadyRegistered(CMD); } e.User.SetSessionFlag("WaitForCap"); switch (e.Arguments[0].ToUpper()) { case "LS": e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "LS", SUPPORTED_STRING); break; case "REQ": if (e.Arguments.Length < 2) { e.User.ErrorNeedMoreParams(CMD); break; } for (int i = 1; i < e.Arguments.Length; i++) { string[] tok = e.Arguments[i].ToLower().Split(' '); for (int n = 0; n < tok.Length; n++) { if (SUPPORTED_ARRAY.Contains(tok[n])) { e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "ACK", ":" + tok[n]); switch (tok[n]) { case "multi-prefix": e.User.SetSessionFlag("MultiPrefix"); break; case "sasl": e.User.SetSessionFlag("SaslRequested"); break; } } else { e.User.SendCommand(CMD, e.Server.Id, e.User.Mask.Nickname, "NAK", ":" + tok[n]); } } } break; case "END": if (e.User.Level == Authorizations.Connecting || e.User.ClearSessionFlag("SaslWaitForCapEnd")) { e.User.ClearSessionFlag("WaitForCap"); if (e.User.HasSessionFlag("PassedUser") && e.User.HasSessionFlag("PassedNick")) { e.User.ClearSessionFlag("PassedUser"); e.User.ClearSessionFlag("PassedNick"); e.User.OnConnected(); } } else { e.User.ErrorAlreadyRegistered(CMD); } break; } }
private void EventReceivedCommand(List<string> iCommand) { //返すデータの設定 ReceivedCommandEventArgs e = new ReceivedCommandEventArgs(); e.Command = iCommand; //イベントの発生 OnReceivedCommand(e); }
public void Handler(object sender, ReceivedCommandEventArgs e) { e.User.ReplyUsers(); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } UserBase user = e.Server.GetUser(e.Arguments[0]); if (user == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHNICK, e.Arguments[0], ":That user is not online."); return; } e.User.SendNumeric(Numerics.RPL_WHOISUSER, user.Mask.Nickname, user.Mask.Username, user.Mask.Hostname, "*", ":" + user.Gecos); // TODO: RPL_WHOISSERVER switch (e.User.Level) { case Authorizations.NetworkOperator: e.User.SendNumeric(Numerics.RPL_WHOISOPERATOR, user.Mask.Nickname, ":is a network operator."); break; case Authorizations.Service: e.User.SendNumeric(Numerics.RPL_WHOISOPERATOR, user.Mask.Nickname, ":is a network service."); break; } StringBuilder channels = new StringBuilder(); foreach (ChannelBase c in user.Channels.Values) { if (e.User.Level < Authorizations.NetworkOperator && c.HasFlag("Secret") && !e.User.IsVoice(c) && !e.User.Channels.ContainsKey(c.Id)) { continue; } if (channels.Length > 0) { channels.Append(' '); } string prefix = c.GetPrefix(user); if (!string.IsNullOrEmpty(prefix)) { if (e.User.HasSessionFlag("MultiPrefix")) { channels.Append(prefix); } else { channels.Append(prefix[0]); } } channels.Append(c.Name); } if (channels.Length > 0) { e.User.SendNumeric(Numerics.RPL_WHOISCHANNELS, user.Mask.Nickname, ":" + channels.ToString()); } if (user.Level >= Authorizations.Registered) { e.User.SendNumeric(Numerics.RPL_WHOISACCOUNT, user.Mask.Nickname, user.Mask.Account, ":is logged in as"); } e.User.SendNumeric(Numerics.RPL_ENDOFWHOIS, user.Mask.Nickname, ":End of user information."); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } string[] channels = e.Arguments[0].Split(','); int key = 0; for (int i = 0; i < channels.Length; i++) { try { ChannelBase channel = e.Server.GetChannel(channels[i]); if (channel == null) { if (e.Server.GetRegisteredChannel(channels[i]) != null) { channel = e.Server.CreateChannel(channels[i], e.User); } else { e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, ":That channel does not exist. Did you mean to create/register a new channel? If so, use /cjoin " + channels[i] + " or /quote cjoin " + channels[i] + "."); continue; } } if (channel.HasFlag("RegisteredOnly") && e.User.Level < Authorizations.Registered) { e.User.SendNumeric(Numerics.ERR_NOLOGIN, ":Only registered users can join that channel."); Forward(e, channel); continue; } if (channel.Properties.ContainsKey("Key")) { if (e.Arguments.Length <= ++key) { e.User.SendNumeric(Numerics.ERR_KEYSET, CMD, channels[i], ":Key not specified for channel."); Forward(e, channel); continue; } else if (e.Arguments[key] != (string)channel.Properties["Key"]) { e.User.SendNumeric(Numerics.ERR_BADCHANNELKEY, CMD, channels[i], ":Incorrect channel key specified."); Forward(e, channel); continue; } } if (channel.HasFlag("InviteOnly")) { if (!e.User.HasSessionFlag("Invite:" + channel.Name) && !e.User.IsVoice(channel)) { bool inviteExcept = false; for (int m = 0; m < channel.InviteExcepts.Count; m++) { if (e.User.Mask.Matches(channel.InviteExcepts[m])) { inviteExcept = true; break; } } if (!inviteExcept) { e.User.SendNumeric(Numerics.ERR_INVITEONLYCHAN, CMD, channels[i], ":That channel is marked invite-only."); Forward(e, channel); continue; } } } if (!e.User.IsVoice(channel)) { if (e.User.IsBanned(channel)) { e.User.SendNumeric(Numerics.ERR_BANNEDFROMCHAN, channels[i], ":You are banned from that channel."); Forward(e, channel); continue; } } if (!e.User.AddToChannel(channel)) { e.User.SendNumeric(Numerics.ERR_USERONCHANNEL, e.User.Mask.Nickname, channel.Name, ":You are already on that channel."); return; } OnJoin(channel, e.User); } catch (Exception ex) { e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":Error joining channel:", ex.Message); } } }
private void Forward(ReceivedCommandEventArgs e, ChannelBase from) { if (from.Properties.ContainsKey("Forward")) { ChannelBase channel = e.Server.GetChannel((string)from.Properties["Forward"]); if (channel == null) { return; } else { e.User.SendNumeric(Numerics.RPL_SUMMONING, CMD, from.Name, ":Forwarding to", channel.Name, "due to restricted access."); if (channel.HasFlag("RegisteredOnly") && e.User.Level < Authorizations.Registered) { e.User.SendNumeric(Numerics.ERR_NOLOGIN, CMD, channel.Name, ":Only registered users can join that channel."); return; } if (channel.Properties.ContainsKey("Key")) { e.User.SendNumeric(Numerics.ERR_KEYSET, CMD, channel.Name, ":Key not specified for channel."); return; } if (channel.HasFlag("InviteOnly")) { if (!e.User.HasSessionFlag("Invite:" + channel.Name) && !e.User.IsVoice(channel)) { bool inviteExcept = false; for (int m = 0; m < channel.InviteExcepts.Count; m++) { if (e.User.Mask.Matches(channel.InviteExcepts[m])) { inviteExcept = true; break; } } if (!inviteExcept) { e.User.SendNumeric(Numerics.ERR_INVITEONLYCHAN, CMD, channel.Name, ":That channel is marked invite-only."); return; } } } if (!e.User.IsVoice(channel)) { bool except = false; for (int m = 0; m < channel.Exceptions.Count; m++) { if (e.User.Mask.Matches(channel.Exceptions[m])) { except = true; break; } } if (!except) { bool banned = false; for (int m = 0; m < channel.Bans.Count; m++) { if (e.User.Mask.Matches(channel.Bans[m])) { banned = true; break; } } if (banned) { e.User.SendNumeric(Numerics.ERR_BANNEDFROMCHAN, CMD, channel.Name, ":You are banned from that channel."); return; } } } } if (!e.User.AddToChannel(channel)) { e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, CMD, channel.Name, ":Unknown error occurred while joining channel."); } OnJoin(channel, e.User); } }
public void Handler(object sender, ReceivedCommandEventArgs e) { e.User.SendCommand("NOTICE", e.Server.Id, e.User.Mask.Nickname, "Hotswapping core and all modules."); e.Server.Domains.Reload(); }
public void Handler(object sender, ReceivedCommandEventArgs e) { // TODO: Implement command e.User.SendNumeric(Numerics.ERR_UNKNOWNERROR, ":That command is not yet implemented."); }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.ErrorNeedMoreParams(CMD); return; } string nickname = e.Arguments[0]; if (e.User.Mask.Nickname != "*") { e.User.ErrorAlreadyRegistered(CMD); return; } if (!e.User.ValidateNickname(nickname)) { // ValidateNickname will send the numeric. return; } if (e.Server.IsQLined(nickname)) { e.User.SendNumeric(Numerics.ERR_NICKCOLLISION, nickname, ":That nickname is invalid."); return; } string id = nickname.ToLower(); if (e.Server.UsersById.ContainsKey(id)) { e.User.SendNumeric(Numerics.ERR_NICKNAMEINUSE, nickname, ":That nickname is already in use."); return; } if (e.User.Level != Authorizations.Connecting) { e.User.BroadcastInclusive("NICK", e.User.Mask.Nickname, nickname); e.User.Mask.Nickname = nickname; e.Server.UsersById.Remove(e.User.Id); e.User.Id = id; e.Server.UsersById.Add(e.User.Id, e.User); } else { foreach (ChannelBase c in e.User.Channels.Values) { if (!e.User.CanSendToChannel(c, true, "change your nickname")) { return; } } e.User.Mask.Nickname = nickname; e.User.Id = id; if (e.User.HasSessionFlag("PassedUser") && !e.User.HasSessionFlag("WaitForCap")) { e.User.ClearSessionFlag("PassedUser"); e.User.OnConnected(); } else { e.User.SetSessionFlag("PassedNick"); } } }
public void Handler(object sender, ReceivedCommandEventArgs e) { if (e.Arguments.Length < 1) { e.User.SendNumeric(Numerics.ERR_NEEDMOREPARAMS, CMD, SYNTAX); return; } if (Protocol.CHANNEL_PREFIX_CHARS.Contains(e.Arguments[0][0])) { ChannelSurrogate target = e.Server.GetRegisteredChannel(e.Arguments[0]); if (target == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHCHANNEL, e.Arguments[0], ":That channel is not registered."); return; } if (e.Arguments.Length < 2) { SendMeta(e.User, target.Name, e.User.IsOwner(target) || e.User.Level >= Authorizations.NetworkOperator, target.Flags, target.Properties); } else { char dir = e.Arguments[1][0]; string key; if ((dir != '-' && dir != '+') || e.Arguments[1].Length < 2) { key = e.Arguments[1]; dir = '+'; } else { key = e.Arguments[1].Substring(1); } if (key[0] != ':') { key = ":" + key; } if (e.Arguments.Length < 3) { SetFlag(e.User, dir, key, target.Flags, target.Properties); } else { SetProperty(e.User, dir, key, target.Flags, target.Properties, e.Arguments[2]); } target.Commit(); } } else { UserSurrogate target = e.Server.GetRegisteredUser(e.Arguments[0]); if (target == null) { e.User.SendNumeric(Numerics.ERR_NOSUCHACCOUNT, e.Arguments[0], ":That account is not registered."); return; } if (e.Arguments.Length < 2) { SendMeta(e.User, target.Mask.Account, e.User.Mask.Account == e.Arguments[0].ToLower() || e.User.Level >= Authorizations.NetworkOperator, target.Flags, target.Properties); } else { char dir = e.Arguments[1][0]; string key; if ((dir != '-' && dir != '+') || e.Arguments[1].Length < 2) { key = e.Arguments[1]; dir = '+'; } else { key = e.Arguments[1].Substring(1); } if (key[0] != ':') { key = ":" + key; } if (e.Arguments.Length < 3) { SetFlag(e.User, dir, key, target.Flags, target.Properties); } else { SetProperty(e.User, dir, key, target.Flags, target.Properties, e.Arguments[2]); } target.Commit(); } } }
public void Handler(object sender, ReceivedCommandEventArgs e) { e.User.ReplyVersion(); }