public static BanEntry AddBan(TimeSpan?lastsFor, string mask, string reason) { BanMgr.Lock.EnterWriteLock(); try { DateTime now1 = DateTime.Now; DateTime?expires; if (!lastsFor.HasValue) { expires = new DateTime?(); } else { DateTime now2 = DateTime.Now; TimeSpan?nullable = lastsFor; expires = nullable.HasValue ? new DateTime?(now2 + nullable.GetValueOrDefault()) : new DateTime?(); } string banmask = mask; string reason1 = reason; BanEntry banEntry = new BanEntry(now1, expires, banmask, reason1); banEntry.Save(); BanMgr.m_bans.Add(banEntry); return(banEntry); } finally { BanMgr.Lock.ExitWriteLock(); } }
public Dictionary <string, Unturned.IBanEntry> LoadBans() { Dictionary <String, IBanEntry> banList = new Dictionary <String, IBanEntry>(); MySqlCommand cmd = new MySqlCommand(); cmd.Connection = m_Connection; cmd.CommandText = "SELECT `steamid`, `ban_date`, `nickname`, `banned_by`, `ban_time`, `reason` FROM bans"; MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { IBanEntry ban = new BanEntry( reader.GetString(2), // NickName reader.GetString(0), // Steam ID reader.GetString(5), // Reason reader.GetString(3), // Banned by reader.GetDateTime(1) // BanTime ); banList.Add(ban.SteamID, ban); } return(banList); }
public override void AddListItem(string itemString) { if (Items == null) { Items = new List <BanEntry>(); } BanEntry item = ModelParser.ParseModelFromAttributeString <BanEntry>(itemString); Items.Add(item); }
public static void ban(string name, string id, string reason, string bannedBy) { BanEntry entry = new BanEntry(name, id, reason, bannedBy, System.DateTime.Now); bannedPlayers.Add(id, entry); Database.provider.AddBan(entry); // Reload NetworkBans.Load(); // Save moved to /save command }
public static void InitBanMgr() { try { m_bans = BanEntry.FindAll().ToList(); } catch (Exception e) { RealmDBMgr.OnDBError(e); m_bans = BanEntry.FindAll().ToList(); } }
public void AddBan(string ip, string reason) { var newEntry = new BanEntry(); newEntry.ip = ip; newEntry.reason = reason; newEntry.bannedAt = DateTime.Now; newEntry.tempBan = false; banlist.List.Add(newEntry); LogManager.Log("Ban Added: " + ip); Save(); }
public void AddBan(string ip, string reason, TimeSpan time) { var newEntry = new BanEntry(); newEntry.ip = ip; newEntry.reason = reason; newEntry.bannedAt = DateTime.Now; newEntry.expiresAt = DateTime.Now.Add(time); newEntry.tempBan = true; banlist.List.Add(newEntry); LogManager.Log("Ban Added: " + ip); Save(); }
public void RemoveBanByIp(string ip) { BanEntry ban = (from BanEntry entry in banlist.List where entry.ip.Equals(ip) select entry).FirstOrDefault(); if (ban != null) { LogManager.Log("Ban Removed: " + ban.ip); banlist.List.Remove(ban); Save(); } }
public BanEntry GetBanByIp(string ip) { BanEntry ban = (from BanEntry entry in banlist.List where entry.ip.Equals(ip) select entry).FirstOrDefault(); if (ban != null) { return(ban); } return(null); }
public Boolean IsBanned(string ip) { BanEntry ban = (from BanEntry entry in banlist.List where entry.ip.Equals(ip) select entry).FirstOrDefault(); if (ban != null) { return(true); } return(false); }
public void Ban(string name, IPAddress address, BanReasons reason) { address = FixAddress(address); if (_banList.ContainsKey(address)) { return; } BanEntry banEntry = new BanEntry(name, address, reason); _banList.Add(address, banEntry); // TODO: save in file }
public static BanEntry AddBan(DateTime?until, string mask, string reason) { BanMgr.Lock.EnterWriteLock(); try { BanEntry banEntry = new BanEntry(DateTime.Now, until, mask, reason); banEntry.Save(); BanMgr.m_bans.Add(banEntry); return(banEntry); } finally { BanMgr.Lock.ExitWriteLock(); } }
public void HandleStatusChanged(NetIncomingMessage msg) { NetConnection sender = msg.SenderConnection; string senderIp = sender.RemoteEndPoint.Address.ToString(); LogManager.Log(senderIp + ": Status change"); switch (sender.Status) { case NetConnectionStatus.Connected: LogManager.Log(senderIp + ": Connection request"); if (ClientList.ContainsKey(sender)) { LogManager.Log(senderIp + ": Already connected", LogLevel.Error); return; } if (!BanlistMgr.Singleton.IsBanned(sender.RemoteEndPoint.Address.ToString())) { HandleConnectionApproval(sender); IoCManager.Resolve <IPlayerManager>().NewSession(sender); // TODO move this to somewhere that makes more sense. } else { //You're banned bro. BanEntry ban = BanlistMgr.Singleton.GetBanByIp(senderIp); sender.Disconnect("You have been banned from this Server." + Environment.NewLine + "Reason: " + ban.reason + Environment.NewLine + "Expires: " + (ban.tempBan ? ban.expiresAt.ToString("d/M/yyyy HH:mm:ss") : "Never")); LogManager.Log(senderIp + ": Connection denied. User banned."); } break; case NetConnectionStatus.Disconnected: LogManager.Log(senderIp + ": Disconnected"); IoCManager.Resolve <IPlayerManager>().EndSession(sender); if (ClientList.ContainsKey(sender)) { ClientList.Remove(sender); } break; } }
/// <summary> /// Returns the first Ban that matches the given IP or null if none matches /// </summary> /// <param name="ip"></param> /// <returns></returns> public static BanEntry GetBan(IPAddress ip) { byte[] addressBytes = ip.GetAddressBytes(); BanMgr.Lock.EnterReadLock(); try { for (int index = 0; index < BanMgr.m_bans.Count; ++index) { BanEntry ban = BanMgr.m_bans[index]; if (ban.Matches(addressBytes)) { return(ban); } } } finally { BanMgr.Lock.ExitReadLock(); } return((BanEntry)null); }
public static BanEntry AddBan(DateTime?until, string mask, string reason) { Lock.EnterWriteLock(); try { var ban = new BanEntry( DateTime.Now, until, mask, reason ); ban.Save(); m_bans.Add(ban); return(ban); } finally { Lock.ExitWriteLock(); } }
public static BanEntry AddBan(TimeSpan?lastsFor, string mask, string reason) { Lock.EnterWriteLock(); try { var ban = new BanEntry( DateTime.Now, lastsFor != null ? DateTime.Now + lastsFor : null, mask, reason ); ban.Save(); m_bans.Add(ban); return(ban); } finally { Lock.ExitWriteLock(); } }
public static List <BanEntry> GetBanList(string mask) { BanMgr.Lock.EnterReadLock(); try { List <BanEntry> banEntryList = new List <BanEntry>(); int[] bytes = BanMgr.GetBytes(mask); for (int index = 0; index < BanMgr.m_bans.Count; ++index) { BanEntry ban = BanMgr.m_bans[index]; if (ban.Matches(bytes)) { banEntryList.Add(ban); } } return(banEntryList); } finally { BanMgr.Lock.ExitReadLock(); } }
protected virtual void HandleTimedBanCommand(CommandMatch commandMatch, IChannelMessageEventArgs msg) { ChannelUserLevel level = ConnectionManager.GetChannelLevelForUser(msg.Channel, msg.SenderNickname); if (level < ChannelUserLevel.HalfOp) { ConnectionManager.SendChannelMessage(msg.Channel, $"{msg.SenderNickname}: You need to be a channel operator."); return; } var mask = (string)commandMatch.Arguments[0]; var timeSpanString = (string)commandMatch.Arguments[1]; string reason = ((string)commandMatch.Arguments[2]).Trim(); if (reason.Length == 0) { reason = null; } string nick = null; if (!mask.Contains("!") && !mask.Contains("@")) { // it's a nickname nick = mask; mask += "!*@*"; } TimeSpan?timeSpan = TimeUtil.TimeSpanFromString(timeSpanString); if (!timeSpan.HasValue || timeSpan.Value == TimeSpan.Zero) { return; } string message = (reason == null) ? $"{msg.SenderNickname}" : $"{msg.SenderNickname}: {reason}" ; DateTimeOffset banStartTime = DateTimeOffset.Now; DateTimeOffset banEndTime = banStartTime + timeSpan.Value; ConnectionManager.Timers.Register( banEndTime, () => UnbanChannelMask(msg.Channel, mask) ); ConnectionManager.ChangeChannelMode(msg.Channel, $"+b {mask}"); if (nick != null) { ConnectionManager.KickChannelUser(msg.Channel, nick, message); } if (Config.PersistBans) { using (BanKitContext ctx = GetNewContext()) { var ban = new BanEntry { BannedNick = nick, BannedMask = mask, BannerNick = msg.SenderNickname, Channel = msg.Channel, TimestampBanStart = banStartTime, TimestampBanEnd = banEndTime, Reason = reason, Lifted = false, }; ctx.BanEntries.Add(ban); ctx.SaveChanges(); } } }
public static BanEntry AddBan(TimeSpan? lastsFor, string mask, string reason) { Lock.EnterWriteLock(); try { var ban = new BanEntry ( DateTime.Now, lastsFor != null ? DateTime.Now + lastsFor : null, mask, reason ); ban.Save(); m_bans.Add(ban); return ban; } finally { Lock.ExitWriteLock(); } }
public static BanEntry AddBan(DateTime? until, string mask, string reason) { Lock.EnterWriteLock(); try { var ban = new BanEntry( DateTime.Now, until, mask, reason ); ban.Save(); m_bans.Add(ban); return ban; } finally { Lock.ExitWriteLock(); } }
/// <summary> /// /// </summary> private void SetupHandlers() { // If its not recognized: defaultPacketHandler = packet => { // PING is special if (packet.Prefix == "PING") { packet.IrcClient.Send("PONG " + packet.Key); } else if (packet.Key.StartsWith("4") || packet.Key.StartsWith("5")) { // Error Replies packet.IrcClient.ErrorNotify(packet); } else { // Normal replies packet.IrcClient.UnspecifiedInfoNotify(packet); } }; // Connection Handling AddPacketHandler("001", packet => { // :Serv 001 Me :<Welcomemessage> packet.IrcClient.Me.ChangeNick(packet.Content.NextWord()); defaultPacketHandler(packet); packet.IrcClient.Send("USERHOST " + packet.IrcClient.Me); }); AddPacketHandler("005", packet => { packet.IrcClient.ConnectionInfoNotify(packet); }); // Finished login AddPacketHandler("302", packet => { packet.IrcClient.PerformNotify(); }); // Messaging AddPacketHandler("PRIVMSG", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); var args = packet.Args; if (args.StartsWith("") && args.EndsWith("")) { // CTCP args = packet.Args.Split('')[1]; var argsStream = new StringStream(args); packet.IrcClient.CtcpRequestNotify(packet.User, packet.channel, argsStream.NextWord(), argsStream.Remainder); } else { // Text message packet.IrcClient.TextNotify(packet.User, packet.channel, new StringStream(args)); var argsStream = new StringStream(args); if (packet.channel == null) { packet.IrcClient.QueryMsgNotify(packet.User, argsStream); } else { packet.IrcClient.ChannelMsgNotify(packet.User, packet.channel, argsStream); } } }); AddPacketHandler("NOTICE", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); var args = packet.Args; if (packet.Args.StartsWith("") && packet.Args.EndsWith("")) { args = packet.Args.Split('')[1]; var argsStream = new StringStream(args); packet.IrcClient.CtcpReplyNotify(packet.User, packet.channel, argsStream.NextWord(), argsStream.Remainder); } else { packet.IrcClient.TextNotify(packet.User, packet.channel, new StringStream(args)); packet.IrcClient.NoticeNotify(packet.User, packet.channel, new StringStream(packet.Args)); } }); // Nick / Quit AddPacketHandler("NICK", packet => { packet.IrcClient.NickNotify(packet.User, packet.Args); }); AddPacketHandler("QUIT", packet => { packet.IrcClient.QuitNotify(packet.User, packet.Args); }); AddPacketHandler("431", packet => { packet.IrcClient.InvalidNickNotify("431", "", packet.Args); }); // :Serv 431 Me :No nickname given AddPacketHandler("433", packet => // :Serv 433 Me <Nick> :Nickname is already in use. { var strStream = new StringStream(packet.Content); strStream.SkipWord(); packet.IrcClient.InvalidNickNotify(packet.Key, strStream.NextWord(), packet.Args); }); AddPacketHandler("432", packetHandlers["433"][0]); // :Serv 432 Me <Nick> :Invalid nickname: ... // Channel related Stuff AddPacketHandler("INVITE", packet => { var strStream = new StringStream(packet.Content); strStream.NextWord("#"); packet.IrcClient.InviteNotify(packet.User, "#"+strStream.NextWord()); }); AddPacketHandler("JOIN", packet => { string chanName = packet.Content.NextWord(); packet.IrcClient.JoinNotify(packet.User, chanName.Trim(':')); }); AddPacketHandler("485", packet => // cannot join channel { packet.channel = packet.IrcClient.GetChannel(packet.Content.NextWord()); packet.IrcClient.CannotJoinNotify(packet.channel, packet.Args); }); AddPacketHandler("471", delegate { }); AddPacketHandler("473", delegate { }); AddPacketHandler("474", delegate { }); AddPacketHandler("475", delegate { }); AddPacketHandler("477", delegate { }); AddPacketHandler("TOPIC", packet => { // User TOPIC Channel :Topic var content = packet.Content; packet.channel = packet.IrcClient.GetOrCreateChannel(content.NextWord()); packet.channel.TopicSetter = packet.User; packet.channel.TopicSetTime = DateTime.Now; packet.IrcClient.TopicNotify(packet.User, packet.channel, packet.Args, false); packet.channel.SetTopic(packet.Args); }); AddPacketHandler("332", packet => { // :Sender 332 Me Channel :Topic var content = packet.Content; //packet.User = packet.IrcClient.GetOrCreateUser(content.NextWord()); content.SkipWord(); packet.channel = packet.IrcClient.GetOrCreateChannel(content.NextWord()); packet.IrcClient.TopicNotify(packet.User, packet.channel, packet.Args, true); packet.channel.SetTopic(packet.Args); }); AddPacketHandler("333", packet => { // :Sender 333 Me Channel TopicSetter TopicTimestamp StringStream content = packet.Content; content.SkipWord(); packet.channel = packet.IrcClient.GetOrCreateChannel(content.NextWord()); packet.User = packet.IrcClient.GetOrCreateUser(content.NextWord()); packet.channel.TopicSetter = packet.User; packet.channel.TopicSetTime = new DateTime(1970, 1, 1) + TimeSpan.FromSeconds(content.NextInt()); }); AddPacketHandler("353", packet => // :Serv 353 Me = Channel :Namelist { var strStream = new StringStream(packet.Content); strStream.SkipWords(2); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); if (packet.channel == null) return; IrcUser[] users = packet.channel.AddNames(packet.Args); packet.IrcClient.UsersAddedNotify(packet.channel, users); }); AddPacketHandler("MODE", packet => // :Serv MODE Channel Modes [ModeArgs] { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); strStream.Consume(':', 1); string modes = strStream.NextWord(); strStream.Consume(':', 1); string[] prms = strStream.RemainingWords(); packet.ProtHandler.ParseModes(packet.User, packet.channel, modes, prms); }); AddPacketHandler("PART", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); packet.IrcClient.PartNotify(packet.User, packet.channel, packet.Args); }); AddPacketHandler("KICK", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); IrcUser user = packet.IrcClient.GetOrCreateUser(strStream.NextWord()); packet.IrcClient.KickNotify(packet.User, packet.channel, user, packet.Args); }); AddPacketHandler("324", packet => // :Serv 324 Me Channel Modes [ModeArgs] { var strStream = new StringStream(packet.Content); strStream.SkipWord(); // skip "Me" packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); strStream.Consume(':', 1); string modes = strStream.NextWord(); strStream.Consume(':', 1); string[] prms = strStream.RemainingWords(); packet.ProtHandler.ParseModes(packet.User, packet.channel, modes, prms); }); AddPacketHandler("329", packet => // :Serv 329 [Me] #Channel CreationTime { var strStream = new StringStream(packet.Content); String chanName = strStream.NextWord(); if (!chanName.StartsWith("#")) { chanName = strStream.NextWord(); } packet.channel = packet.IrcClient.GetChannel(chanName); DateTime time = new DateTime(1970, 1, 1) + TimeSpan.FromSeconds(Convert.ToInt32(strStream.NextWord())); if (packet.channel != null) packet.channel.SetCreationTime(time); packet.IrcClient.ChanCreationTimeNotify(packet.channel, time); }); // RPL_WHOREPLY AddPacketHandler("352", packet => { var content = packet.Content; // the first word is our own nick content.SkipWord(); packet.channel = packet.IrcClient.GetChannel(content.NextWord()); var username = content.NextWord(); var host = content.NextWord(); var server = content.NextWord(); var nick = content.NextWord(); var flags = content.NextWord(); // the distance is the number *after* the character ":" var hops = content.NextWord().Substring(1); var info = packet.Args.Substring(packet.Args.IndexOf(" ") + 1); packet.IrcClient.GetOrCreateUser(nick).SetInfo(username, host, info); packet.IrcClient.WhoReplyNotify(packet.channel.Name, username, host, server, nick, flags, hops, info); }); // Reply to extended WHO AddPacketHandler("354", packet => { packet.Content.SkipWord(); // first word is own nick var nick = packet.Content.NextWord(); var authName = packet.Content.NextWord(); if (authName != "0") { var user = packet.User = packet.IrcClient.GetOrCreateUser(nick); user.AuthName = authName; var authMgr = packet.IrcClient.AuthMgr; if (authMgr != null) { authMgr.OnAuthResolved(user); } } }); AddPacketHandler("367", packet => // :Serv 367 Me Channel banMask bannerName banTime { var content = packet.Content; content.SkipWord(); packet.channel = packet.IrcClient.GetChannel(content.NextWord()); var banmask = content.NextWord(); var banner = content.NextWord(); var bantime = content.NextWord(); var entry = new BanEntry(banmask, banner, new DateTime(1970, 1, 1) + TimeSpan.FromSeconds(Convert.ToInt32(bantime))); if (packet.channel != null && !packet.channel.BanMasks.ContainsKey(banmask)) { packet.channel.BanMasks.Add(banmask, entry); } packet.IrcClient.BanListEntryNotify(packet.channel, entry); }); // Ban List completed AddPacketHandler("368", packet => { packet.channel = packet.IrcClient.GetChannel(packet.Content.NextWord()); packet.IrcClient.BanListCompleteNotify(packet.channel); }); // Reply to extended WHO AddPacketHandler("354", packet => { packet.Content.SkipWord(); // first word is own nick var nick = packet.Content.NextWord(); var authName = packet.Content.NextWord(); if (authName != "0") { var user = packet.User = packet.IrcClient.GetOrCreateUser(nick); user.AuthName = authName; var authMgr = packet.IrcClient.AuthMgr; if (authMgr != null) { authMgr.OnAuthResolved(user); } } }); }
internal void ParseModes(IrcUser user, IrcChannel chan, string flags, string[] args) { bool add = true; if (chan == null) { // User Modes for (int i = 0; i < flags.Length; i++) { var c = Convert.ToString(flags[i]); if (c == "+") { add = true; continue; } else if (c == "-") { add = false; continue; } if (add) { irc.Me.AddMode(c); } else { irc.Me.DeleteMode(c); } irc.UserModeChangedNotify(); } return; } int n = 0; for (int i = 0; i < flags.Length; i++) { // Chan Modes/Flags var c = Convert.ToString(flags[i]); if (c == "+") { add = true; continue; } else if (c == "-") { add = false; continue; } var arg = ""; if (irc.HasChanMode(c)) { // channel modes if (add) { if (c == "b" || c == "k" || c == "l") { arg = args[n++]; } if (c == "b") { var entry = new BanEntry(arg, user.Nick, DateTime.Now); if (!chan.BanMasks.ContainsKey(arg)) { chan.BanMasks.Add(arg, entry); } } else { chan.AddMode(c, arg); } irc.ModeAddedNotify(user, chan, c, arg); } else { if (c == "b") { arg = args[n++]; chan.BanMasks.Remove(arg); } else { chan.DeleteMode(c); } irc.ModeDeletedNotify(user, chan, c, arg); } } else { // channel user flags var priv = irc.GetPrivForFlag(flags[i]); if (priv != Privilege.Regular) { arg = args[n++]; var targ = irc.GetOrCreateUser(arg); if (add) { chan.AddFlag(priv, targ); irc.FlagAddedNotify(user, chan, priv, targ); } else { chan.DeleteFlag(priv, targ); irc.FlagDeletedNotify(user, chan, priv, targ); } } } } }
internal void ParseModes(IrcUser user, IrcChannel chan, string flags, string[] args) { bool add = true; if (chan == null) { // User Modes for (int i = 0; i < flags.Length; i++) { var c = Convert.ToString(flags[i]); if (c == "+") { add = true; continue; } else if (c == "-") { add = false; continue; } if (add) irc.Me.AddMode(c); else irc.Me.DeleteMode(c); irc.UserModeChangedNotify(); } return; } int n = 0; for (int i = 0; i < flags.Length; i++) { // Chan Modes/Flags var c = Convert.ToString(flags[i]); if (c == "+") { add = true; continue; } else if (c == "-") { add = false; continue; } var arg = ""; if (irc.HasChanMode(c)) { // channel modes if (add) { if (c == "b" || c == "k" || c == "l") arg = args[n++]; if (c == "b") { var entry = new BanEntry(arg, user.Nick, DateTime.Now); if (!chan.BanMasks.ContainsKey(arg)) { chan.BanMasks.Add(arg, entry); } } else { chan.AddMode(c, arg); } irc.ModeAddedNotify(user, chan, c, arg); } else { if (c == "b") { arg = args[n++]; chan.BanMasks.Remove(arg); } else { chan.DeleteMode(c); } irc.ModeDeletedNotify(user, chan, c, arg); } } else { // channel user flags var priv = irc.GetPrivForFlag(flags[i]); if (priv != Privilege.Regular) { arg = args[n++]; var targ = irc.GetOrCreateUser(arg); if (add) { chan.AddFlag(priv, targ); irc.FlagAddedNotify(user, chan, priv, targ); } else { chan.DeleteFlag(priv, targ); irc.FlagDeletedNotify(user, chan, priv, targ); } } } } }
/// <summary> /// /// </summary> private void SetupHandlers() { // If its not recognized: defaultPacketHandler = packet => { // PING is special if (packet.Prefix == "PING") { packet.IrcClient.Send("PONG " + packet.Key); } else if (packet.Key.StartsWith("4") || packet.Key.StartsWith("5")) { // Error Replies packet.IrcClient.ErrorNotify(packet); } else { // Normal replies packet.IrcClient.UnspecifiedInfoNotify(packet); } }; // Connection Handling AddPacketHandler("001", packet => { // :Serv 001 Me :<Welcomemessage> packet.IrcClient.Me.ChangeNick(packet.Content.NextWord()); defaultPacketHandler(packet); packet.IrcClient.Send("USERHOST " + packet.IrcClient.Me); }); AddPacketHandler("005", packet => { packet.IrcClient.ConnectionInfoNotify(packet); }); // Finished login AddPacketHandler("302", packet => { packet.IrcClient.PerformNotify(); }); // Messaging AddPacketHandler("PRIVMSG", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); var args = packet.Args; if (args.StartsWith("") && args.EndsWith("")) { // CTCP args = packet.Args.Split('')[1]; var argsStream = new StringStream(args); packet.IrcClient.CtcpRequestNotify(packet.User, packet.channel, argsStream.NextWord(), argsStream.Remainder); } else { // Text message packet.IrcClient.TextNotify(packet.User, packet.channel, new StringStream(args)); var argsStream = new StringStream(args); if (packet.channel == null) { packet.IrcClient.QueryMsgNotify(packet.User, argsStream); } else { packet.IrcClient.ChannelMsgNotify(packet.User, packet.channel, argsStream); } } }); AddPacketHandler("NOTICE", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); var args = packet.Args; if (packet.Args.StartsWith("") && packet.Args.EndsWith("")) { args = packet.Args.Split('')[1]; var argsStream = new StringStream(args); packet.IrcClient.CtcpReplyNotify(packet.User, packet.channel, argsStream.NextWord(), argsStream.Remainder); } else { packet.IrcClient.TextNotify(packet.User, packet.channel, new StringStream(args)); packet.IrcClient.NoticeNotify(packet.User, packet.channel, new StringStream(packet.Args)); } }); // Nick / Quit AddPacketHandler("NICK", packet => { packet.IrcClient.NickNotify(packet.User, packet.Args); }); AddPacketHandler("QUIT", packet => { packet.IrcClient.QuitNotify(packet.User, packet.Args); }); AddPacketHandler("431", packet => { packet.IrcClient.InvalidNickNotify("431", "", packet.Args); }); // :Serv 431 Me :No nickname given AddPacketHandler("433", packet => // :Serv 433 Me <Nick> :Nickname is already in use. { var strStream = new StringStream(packet.Content); strStream.SkipWord(); packet.IrcClient.InvalidNickNotify(packet.Key, strStream.NextWord(), packet.Args); }); AddPacketHandler("432", packetHandlers["433"][0]); // :Serv 432 Me <Nick> :Invalid nickname: ... // Channel related Stuff AddPacketHandler("INVITE", packet => { var strStream = new StringStream(packet.Content); strStream.NextWord("#"); packet.IrcClient.InviteNotify(packet.User, "#" + strStream.NextWord()); }); AddPacketHandler("JOIN", packet => { packet.IrcClient.JoinNotify(packet.User, packet.ArgsOrFirstWord); }); AddPacketHandler("485", packet => // cannot join channel { packet.channel = packet.IrcClient.GetChannel(packet.Content.NextWord()); packet.IrcClient.CannotJoinNotify(packet.channel, packet.Args); }); AddPacketHandler("471", delegate { }); AddPacketHandler("473", delegate { }); AddPacketHandler("474", delegate { }); AddPacketHandler("475", delegate { }); AddPacketHandler("477", delegate { }); AddPacketHandler("TOPIC", packet => { // User TOPIC Channel :Topic var content = packet.Content; packet.channel = packet.IrcClient.GetOrCreateChannel(content.NextWord()); packet.channel.TopicSetter = packet.User; packet.channel.TopicSetTime = DateTime.Now; packet.IrcClient.TopicNotify(packet.User, packet.channel, packet.Args, false); packet.channel.SetTopic(packet.Args); }); AddPacketHandler("332", packet => { // :Sender 332 Me Channel :Topic var content = packet.Content; //packet.User = packet.IrcClient.GetOrCreateUser(content.NextWord()); content.SkipWord(); packet.channel = packet.IrcClient.GetOrCreateChannel(content.NextWord()); packet.IrcClient.TopicNotify(packet.User, packet.channel, packet.Args, true); packet.channel.SetTopic(packet.Args); }); AddPacketHandler("333", packet => { // :Sender 333 Me Channel TopicSetter TopicTimestamp StringStream content = packet.Content; content.SkipWord(); packet.channel = packet.IrcClient.GetOrCreateChannel(content.NextWord()); packet.User = packet.IrcClient.GetOrCreateUser(content.NextWord()); packet.channel.TopicSetter = packet.User; packet.channel.TopicSetTime = new DateTime(1970, 1, 1) + TimeSpan.FromSeconds(content.NextInt()); }); AddPacketHandler("353", packet => // :Serv 353 Me = Channel :Namelist { var strStream = new StringStream(packet.Content); strStream.SkipWords(2); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); IrcUser[] users = packet.channel.AddNames(packet.Args); packet.IrcClient.UsersAddedNotify(packet.channel, users); }); AddPacketHandler("MODE", packet => // :Serv MODE Channel Modes [ModeArgs] { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); strStream.Consume(':', 1); string modes = strStream.NextWord(); strStream.Consume(':', 1); string[] prms = strStream.RemainingWords(); packet.ProtHandler.ParseModes(packet.User, packet.channel, modes, prms); }); AddPacketHandler("PART", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); packet.IrcClient.PartNotify(packet.User, packet.channel, packet.Args); }); AddPacketHandler("KICK", packet => { var strStream = new StringStream(packet.Content); packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); IrcUser user = packet.IrcClient.GetOrCreateUser(strStream.NextWord()); packet.IrcClient.KickNotify(packet.User, packet.channel, user, packet.Args); }); AddPacketHandler("324", packet => // :Serv 324 Me Channel Modes [ModeArgs] { var strStream = new StringStream(packet.Content); strStream.SkipWord(); // skip "Me" packet.channel = packet.IrcClient.GetChannel(strStream.NextWord()); strStream.Consume(':', 1); string modes = strStream.NextWord(); strStream.Consume(':', 1); string[] prms = strStream.RemainingWords(); packet.ProtHandler.ParseModes(packet.User, packet.channel, modes, prms); }); AddPacketHandler("329", packet => // :Serv 329 [Me] #Channel CreationTime { var strStream = new StringStream(packet.Content); String chanName = strStream.NextWord(); if (!chanName.StartsWith("#")) { chanName = strStream.NextWord(); } packet.channel = packet.IrcClient.GetChannel(chanName); DateTime time = new DateTime(1970, 1, 1) + TimeSpan.FromSeconds(Convert.ToInt32(strStream.NextWord())); if (packet.channel != null) { packet.channel.SetCreationTime(time); } packet.IrcClient.ChanCreationTimeNotify(packet.channel, time); }); // RPL_WHOREPLY AddPacketHandler("352", packet => { var content = packet.Content; // the first word is our own nick content.SkipWord(); packet.channel = packet.IrcClient.GetChannel(content.NextWord()); var username = content.NextWord(); var host = content.NextWord(); var server = content.NextWord(); var nick = content.NextWord(); var flags = content.NextWord(); // the distance is the number *after* the character ":" var hops = content.NextWord().Substring(1); var info = packet.Args.Substring(packet.Args.IndexOf(" ") + 1); packet.IrcClient.GetOrCreateUser(nick).SetInfo(username, host, info); packet.IrcClient.WhoReplyNotify(packet.channel.Name, username, host, server, nick, flags, hops, info); }); // Reply to extended WHO AddPacketHandler("354", packet => { packet.Content.SkipWord(); // first word is own nick var nick = packet.Content.NextWord(); var authName = packet.Content.NextWord(); if (authName != "0") { var user = packet.User = packet.IrcClient.GetOrCreateUser(nick); user.AuthName = authName; var authMgr = packet.IrcClient.AuthMgr; if (authMgr != null) { authMgr.OnAuthResolved(user); } } }); AddPacketHandler("367", packet => // :Serv 367 Me Channel banMask bannerName banTime { var content = packet.Content; content.SkipWord(); packet.channel = packet.IrcClient.GetChannel(content.NextWord()); var banmask = content.NextWord(); var banner = content.NextWord(); var bantime = content.NextWord(); var entry = new BanEntry(banmask, banner, new DateTime(1970, 1, 1) + TimeSpan.FromSeconds(Convert.ToInt32(bantime))); if (packet.channel != null && !packet.channel.BanMasks.ContainsKey(banmask)) { packet.channel.BanMasks.Add(banmask, entry); } packet.IrcClient.BanListEntryNotify(packet.channel, entry); }); // Ban List completed AddPacketHandler("368", packet => { packet.channel = packet.IrcClient.GetChannel(packet.Content.NextWord()); packet.IrcClient.BanListCompleteNotify(packet.channel); }); }
public void Ban(string name, IPAddress address, string reason) { address = FixAddress(address); lock (_banList) { if (_banList.ContainsKey(address)) return; BanEntry banEntry = new BanEntry(name, address, reason); _banList.Add(address, banEntry); Save(); } }