Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }
Example #4
0
    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
    }
Example #5
0
 public static void InitBanMgr()
 {
     try
     {
         m_bans = BanEntry.FindAll().ToList();
     }
     catch (Exception e)
     {
         RealmDBMgr.OnDBError(e);
         m_bans = BanEntry.FindAll().ToList();
     }
 }
Example #6
0
        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();
        }
Example #7
0
        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();
        }
Example #8
0
        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();
            }
        }
Example #9
0
        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);
        }
Example #10
0
        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);
        }
Example #11
0
        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
        }
Example #12
0
 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();
     }
 }
Example #13
0
        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;
            }
        }
Example #14
0
        /// <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);
        }
Example #15
0
        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();
            }
        }
Example #16
0
        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();
            }
        }
Example #17
0
        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();
            }
        }
Example #18
0
        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();
                }
            }
        }
Example #19
0
		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();
			}
		}
Example #20
0
		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();
			}
		}
Example #21
0
        /// <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);
                    }
                }
            });
        }
Example #22
0
        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);
                        }
                    }
                }
            }
        }
Example #24
0
        /// <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);
            });
        }
Example #25
0
        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();
            }
        }