コード例 #1
0
ファイル: BanService.cs プロジェクト: bobbahbrown/CentCom
 public async Task <BanData> GetBanAsync(int ban)
 {
     return(BanData.FromBan(await _dbContext.Bans
                            .Include(x => x.JobBans)
                            .Include(x => x.SourceNavigation).
                            FirstOrDefaultAsync(x => x.Id == ban)));
 }
コード例 #2
0
        Dictionary <string, object> GetBanData(string target)
        {
            var bandataa = new Dictionary <string, object>();

            if (banLogs[target] != null)
            {
                bandataa.Add("name", banLogs[target].name);
                bandataa.Add("steamID", banLogs[target].steamID);
                bandataa.Add("reason", banLogs[target].reason);
                bandataa.Add("IPs", banLogs[target].IPs);
                bandataa.Add("expiration", banLogs[target].expiration);
            }
            else
            {
                if (bannedIPs[target] != null)
                {
                    BanData bdata = bannedIPs[target];
                    bandataa.Add("name", bdata.name);
                    bandataa.Add("steamID", bdata.steamID);
                    bandataa.Add("reason", bdata.reason);
                    bandataa.Add("IPs", bdata.IPs);
                    bandataa.Add("expiration", bdata.expiration);
                }
            }
            return(bandataa);
        }
コード例 #3
0
        bool CanConnect(BanData bandata, PlayerSession session, out string reason)
        {
            reason = string.Empty;
            string ipaddress = session.Player.ipAddress;
            string userid    = session.Identity.SteamId.ToString();

            if (bandata.steamID == ipaddress)
            {
                string reason2  = bandata.reason;
                int    duration = bandata.expiration == 0 ? 0 : Convert.ToInt32(Time.time) - bandata.expiration;
                UnbanIP(null, ipaddress);
                BanID(null, session.Identity.SteamId.m_SteamID, reason2, duration);
                bandata = banLogs[userid];
            }
            if (bandata.expiration != 0 && Convert.ToInt32(LogTime()) >= bandata.expiration)
            {
                Unban(null, userid);
            }
            else
            {
                if (!bandata.IPs.Contains(ipaddress))
                {
                    AddIPToUserBan(userid, ipaddress);
                }
                if (banLogs[userid] == null)
                {
                    BanID(null, session.Identity.SteamId.m_SteamID, bandata.reason, bandata.expiration == 0 ? 0 : Convert.ToInt32(Time.time) - bandata.expiration);
                }
                reason = bandata.expiration == 0 ? GetMessage("MessageDenyConnection", userid) : GetMessage("MessageDenyConnectionTemp", userid);
                return(false);
            }
            return(true);
        }
コード例 #4
0
        void ExecuteBan(object sourcePlayer, string targetID, string targetName, string targetIP, string reason, int duration)
        {
            BanData bandata = new BanData(targetID, reason, targetName, targetIP, duration);

            if (banLogs[targetID] != null)
            {
                storedData.BanLogs.Remove(banLogs[targetID]);
            }
            banLogs[targetID] = bandata;
            storedData.BanLogs.Add(banLogs[targetID]);
            SendMessage(sourcePlayer, string.Format("{0} - {1} was banned from the server for {2}", targetID, targetName, reason));
            if (BroadcastBans)
            {
                ConsoleSystem.Broadcast("chat.add", new object[] { 0, ChatName + " " + string.Format(MessageBanBroadcast, targetName, reason) });
            }
            List <BasePlayer> targetkick = new List <BasePlayer>();

            foreach (BasePlayer player in BasePlayer.activePlayerList)
            {
                if (player.userID.ToString() == targetID)
                {
                    targetkick.Add(player);
                }
            }
            for (int i = 0; i < targetkick.Count; i++)
            {
                Network.Net.sv.Kick(targetkick[i].net.connection, string.Format(MessageBan, reason));
            }
            UpdateBannedIPs();
            SaveData();
        }
コード例 #5
0
        bool CanConnect(BanData bandata, Network.Connection connection, out string reason)
        {
            reason = string.Empty;
            string ipaddress = connection.ipaddress.Substring(0, connection.ipaddress.IndexOf(":"));
            string userid    = connection.userid.ToString();

            if (bandata.steamID == ipaddress)
            {
                string reason2  = bandata.reason;
                int    duration = bandata.expiration == 0 ? 0 : Convert.ToInt32(Time.time) - bandata.expiration;
                UnbanIP(null, ipaddress);
                BanID(null, connection.userid, reason2, duration);
                bandata = banLogs[userid];
            }
            if (bandata.expiration != 0 && Convert.ToInt32(LogTime()) >= bandata.expiration)
            {
                Unban(null, userid);
            }
            else
            {
                if (!bandata.IPs.Contains(ipaddress))
                {
                    AddIPToUserBan(userid, ipaddress);
                }
                if (banLogs[userid] == null)
                {
                    BanID(null, connection.userid, bandata.reason, bandata.expiration == 0 ? 0 : Convert.ToInt32(Time.time) - bandata.expiration);
                }
                reason = bandata.expiration == 0 ? MessageDenyConnection : MessageDenyConnectionTemp;
                return(false);
            }
            return(true);
        }
コード例 #6
0
        public static bool IsIPBanned(string ip, DbConnection connection)
        {
            BanData data = get_ban_data(ip);

            if (data != null)
            {
                if (data.Permanant)
                {
                    return(true);
                }
                else
                {
                    if (data.ExpirationDate < DateTime.Now)
                    {
                        //drop ban
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }
                }
            }
            else
            {
                return(false);
            }
        }
コード例 #7
0
        protected void Page_Load(object sender, EventArgs e)
        {
            id   = Fn.IsInt(Req.GetQueryString("id"), 0);
            banH = new BanCache("qu_msg_" + id, new TimeSpan(0, 0, 10), 1);

            t = Req.GetID("t");

            if (!LoginInfo.IsLogin())
            {
                userID = LoginInfo.UserID;
            }

            banD = new BanData(userID, "qu_msg_" + id, new TimeSpan(1, 0, 0, 0), 1);
            switch (t)
            {
            case 0:    //投票
                TouPiao();
                break;

            case 1:    //评论
                Comment();
                break;

            default:
                msgAjax.Error("非法操作");
                break;
            }

            Response.Write(msgAjax.ReturnMessage);
            Response.End();
        }
コード例 #8
0
ファイル: TwitchGame.cs プロジェクト: ItzAtomikHD/old
    public static bool IsAuthorizedDefuser(string userNickName, bool isWhisper, bool silent = false)
    {
        if (userNickName.EqualsAny("Bomb Factory", TwitchPlaySettings.data.TwitchPlaysDebugUsername) || TwitchGame.Instance.Bombs.Any(x => x.BombName == userNickName))
        {
            return(true);
        }
        BanData ban = UserAccess.IsBanned(userNickName);

        if (ban != null)
        {
            if (silent)
            {
                return(false);
            }

            if (double.IsPositiveInfinity(ban.BanExpiry))
            {
                IRCConnection.SendMessage($"Sorry @{userNickName}, You were banned permanently from Twitch Plays by {ban.BannedBy}{(string.IsNullOrEmpty(ban.BannedReason) ? "." : $", for the following reason: {ban.BannedReason}")}", userNickName, !isWhisper);
            }
            else
            {
                int secondsRemaining = (int)(ban.BanExpiry - DateTime.Now.TotalSeconds());

                int    daysRemaining    = secondsRemaining / 86400; secondsRemaining %= 86400;
                int    hoursRemaining   = secondsRemaining / 3600; secondsRemaining %= 3600;
                int    minutesRemaining = secondsRemaining / 60; secondsRemaining %= 60;
                string timeRemaining    = $"{secondsRemaining} seconds.";
                if (daysRemaining > 0)
                {
                    timeRemaining = $"{daysRemaining} days, {hoursRemaining} hours, {minutesRemaining} minutes, {secondsRemaining} seconds.";
                }
                else if (hoursRemaining > 0)
                {
                    timeRemaining = $"{hoursRemaining} hours, {minutesRemaining} minutes, {secondsRemaining} seconds.";
                }
                else if (minutesRemaining > 0)
                {
                    timeRemaining = $"{minutesRemaining} minutes, {secondsRemaining} seconds.";
                }

                IRCConnection.SendMessage($"Sorry @{userNickName}, You were timed out from Twitch Plays by {ban.BannedBy}{(string.IsNullOrEmpty(ban.BannedReason) ? "." : $", For the following reason: {ban.BannedReason}")} You can participate again in {timeRemaining}", userNickName, !isWhisper);
            }
            return(false);
        }

        bool result = (TwitchPlaySettings.data.EnableTwitchPlaysMode || UserAccess.HasAccess(userNickName, AccessLevel.Defuser, true));

        if (!result && !silent)
        {
            IRCConnection.SendMessage(string.Format(TwitchPlaySettings.data.TwitchPlaysDisabled, userNickName), userNickName, !isWhisper);
        }

        return(result);
    }
コード例 #9
0
        public void IsExpired_Test(int duration, bool expected)
        {
            var ban = new BanData
            {
                Id       = 1,
                Type     = BanTypes.Site,
                BannedOn = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0)),
                Duration = duration
            };

            Assert.That(ban.IsExpired(), Is.EqualTo(expected));
        }
コード例 #10
0
        public void UnbanDate_Never_Test()
        {
            var ban = new BanData
            {
                Id       = 1,
                Type     = BanTypes.Site,
                BannedOn = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0)),
                Duration = 0
            };

            Assert.That(ban.UnbanDate, Is.EqualTo(DateTime.MaxValue));
            Assert.That(ban.IsExpired(), Is.False);
        }
コード例 #11
0
ファイル: UsersController.cs プロジェクト: Atulin/Ogma
        public async Task <ActionResult> BanUser(BanData data)
        {
            var(userId, days) = data;

            // Check if user is logged in
            if (_uid is null)
            {
                return(Unauthorized());
            }
            var uid = (long)_uid;

            // Get user to be banned
            var user = await _context.Users
                       .Where(u => u.Id == userId)
                       .FirstOrDefaultAsync();

            if (user is null)
            {
                return(NotFound());
            }

            // Ban/unban user
            if (days.HasValue)
            {
                user.BannedUntil = DateTime.Now.AddDays((double)days);
                await _userManager.UpdateSecurityStampAsync(user);

                _context.ModeratorActions.Add(new ModeratorAction
                {
                    StaffMemberId = uid,
                    Description   = ModeratorActionTemplates.UserBan(user, User.GetUsername(), (DateTime)user.BannedUntil)
                });
            }
            else if (user.BannedUntil.HasValue)
            {
                _context.ModeratorActions.Add(new ModeratorAction
                {
                    StaffMemberId = uid,
                    Description   = ModeratorActionTemplates.UserUnban(user, User.GetUsername(), (DateTime)user.BannedUntil)
                });
                user.BannedUntil = null;
            }
            else
            {
                return(BadRequest());
            }

            await _context.SaveChangesAsync();

            return(Ok());
        }
コード例 #12
0
        void RawBanIP(object source, string ipaddress, string reason, int duration)
        {
            BanData bandata = new BanData(ipaddress, reason, "Unknown", ipaddress, duration);

            if (banLogs[ipaddress] != null)
            {
                storedData.BanLogs.Remove(banLogs[ipaddress]);
            }
            banLogs[ipaddress] = bandata;
            storedData.BanLogs.Add(banLogs[ipaddress]);
            SendMessage(source, string.Format("{0} was banned from the server for {1}", ipaddress.ToString(), reason));
            UpdateBannedIPs();
            SaveData();
        }
コード例 #13
0
ファイル: BanService.cs プロジェクト: bobbahbrown/CentCom
        public async Task <IEnumerable <BanData> > GetBansForSourceAsync(int source, bool onlyActive = false)
        {
            var query = _dbContext.Bans
                        .Include(x => x.JobBans)
                        .Include(x => x.SourceNavigation)
                        .Where(x => x.Source == source);

            if (onlyActive)
            {
                query = query.Where(x => x.UnbannedBy == null && (x.Expires == null || x.Expires > DateTime.UtcNow));
            }
            return(await query.OrderByDescending(x => x.BannedOn)
                   .Select(x => BanData.FromBan(x))
                   .ToListAsync());
        }
        public List <Ban> ListBans(AuthenticatedData data, string alias)
        {
            try
            {
                if (!data.Authenticate(RoleType.Moderator, RoleType.ZoneLeader, RoleType.Administrator, RoleType.SuperAdministrator))
                {
                    throw new AuthenticationException();
                }

                return(BanData.ListBans(alias));
            }
            catch (Exception error)
            {
                Error.Write(error);
                throw;
            }
        }
        public bool SetBan(BanData data)
        {
            try
            {
                if (!data.Authenticate(RoleType.Moderator, RoleType.ZoneLeader, RoleType.Administrator, RoleType.SuperAdministrator))
                {
                    throw new AuthenticationException();
                }

                return(data.SetBan());
            }
            catch (Exception error)
            {
                Error.Write(error);
                throw;
            }
        }
        public void RemoveBan(BanData data)
        {
            try
            {
                if (!data.Authenticate(RoleType.ZoneLeader, RoleType.Administrator, RoleType.SuperAdministrator))
                {
                    throw new AuthenticationException();
                }

                data.RemoveBan();
            }
            catch (Exception error)
            {
                Error.Write(error);
                throw;
            }
        }
コード例 #17
0
ファイル: BanService.cs プロジェクト: bobbahbrown/CentCom
        public async Task <IEnumerable <BanData> > GetBansForKeyAsync(string key, int?source, bool onlyActive = false)
        {
            var ckey  = KeyUtilities.GetCanonicalKey(key);
            var query = _dbContext.Bans
                        .Include(x => x.JobBans)
                        .Include(x => x.SourceNavigation)
                        .Where(x => x.CKey == ckey);

            if (source.HasValue)
            {
                query = query.Where(x => x.Source == source);
            }
            if (onlyActive)
            {
                query = query.Where(x => x.UnbannedBy == null && (x.Expires == null || x.Expires > DateTime.UtcNow));
            }
            return(await query.OrderByDescending(x => x.BannedOn)
                   .Select(x => BanData.FromBan(x))
                   .ToListAsync());
        }
コード例 #18
0
ファイル: Bans.cs プロジェクト: BigETI/ElectrodZMultiplayer
 /// <summary>
 /// Writes bans to stream
 /// </summary>
 /// <param name="stream">Stream</param>
 public void WriteToStream(Stream stream)
 {
     if (stream == null)
     {
         throw new ArgumentNullException(nameof(stream));
     }
     if (stream.CanWrite)
     {
         using (StreamWriter stream_writer = new StreamWriter(stream))
         {
             BanData[] bans  = new BanData[banLookup.Count];
             uint      index = 0U;
             foreach (IBan ban in banLookup.Values)
             {
                 bans[index] = new BanData(ban.Pattern.ToString(), ban.Reason);
             }
             stream_writer.Write(JsonConvert.SerializeObject(bans));
         }
     }
 }
コード例 #19
0
ファイル: UsersController.cs プロジェクト: SeppPenner/Ogma
        public async Task<ActionResult> MuteUser(BanData data)
        {
            var (userId, days) = data;
            
            // Check if user is logged in
            if (_uid is null) return Unauthorized();
            var uid = (long)_uid;
            
            // Get user to be muted
            var user = await _context.Users
                .Where(u => u.Id == userId)
                .FirstOrDefaultAsync();
            if (user == null) return NotFound();

            // Mute/unmute user
            if (days.HasValue && !user.MutedUntil.HasValue)
            {
                user.MutedUntil = DateTime.Now.AddDays((double) days);
                await _context.ModeratorActions.AddAsync(new ModeratorAction
                {
                    StaffMemberId = uid,
                    Description = ModeratorActionTemplates.UserMute(user, User.GetUsername(), (DateTime) user.MutedUntil)
                });
            }
            else if (user.MutedUntil.HasValue)
            {
                await _context.ModeratorActions.AddAsync(new ModeratorAction
                {
                    StaffMemberId = uid,
                    Description = ModeratorActionTemplates.UserUnmute(user, User.GetUsername(), (DateTime) user.MutedUntil)
                });
                user.MutedUntil = null;
            }
            else
            {
                return BadRequest();
            }
            
            await _context.SaveChangesAsync();
            return Ok();
        }
コード例 #20
0
        public async Task IsBanned(string uplayNickname)
        {
            (bool matched, bool ban) = Bot.Instance.bt.QueryBanByNick(uplayNickname);

            if (!matched)
            {
                await ReplyAsync($"Tracker podezrelych hracu nezna nikoho s nickem/uplay identifikatorem {uplayNickname}. Jestli ucet existuje, muzete ho trackovat prikazem !sus {uplayNickname}");
            }
            else
            {
                if (ban)
                {
                    BanData bd         = Bot.Instance.bt.QueryBanData(uplayNickname);
                    string  statsDBURL = StatsDB.BuildURL(uplayNickname, bd.UplayId);
                    await ReplyAsync($"Hrac {uplayNickname} ma skutecne od Ubisoftu ban. Ostuda! Vice najdete zde: {statsDBURL} .");
                }
                else
                {
                    await ReplyAsync($"Uzivatel s uplay ID {uplayNickname} je nami trackovany, ale ban zatim nema.");
                }
            }
        }
コード例 #21
0
        void ExecuteBan(object sourcePlayer, string targetID, string targetName, string targetIP, string reason, int duration)
        {
            BanData bandata = new BanData(targetID, reason, targetName, targetIP, duration);

            if (banLogs[targetID] != null)
            {
                storedData.BanLogs.Remove(banLogs[targetID]);
            }
            banLogs[targetID] = bandata;
            storedData.BanLogs.Add(banLogs[targetID]);
            SendMessage(sourcePlayer, string.Format("{0} - {1} was banned from the server for {2}", targetID, targetName, reason));
            if (BroadcastBans)
            {
                hurt.BroadcastChat(ChatName, string.Format(GetMessage("MessageBanBroadcast", null), targetName, reason));
            }

            List <PlayerSession> targetkick = new List <PlayerSession>();

            foreach (var pair in GameManager.Instance.GetSessions())
            {
                var player = pair.Value;
                if (player.Player == null)
                {
                    continue;
                }
                if (player.SteamId.ToString() == targetID)
                {
                    targetkick.Add(player);
                }
            }
            for (int i = 0; i < targetkick.Count; i++)
            {
                GameManager.Instance.StartCoroutine(GameManager.Instance.DisconnectPlayerSync(targetkick[i].Player, string.Format(GetMessage("MessageBan", targetkick[i].SteamId.ToString()), reason)));
            }
            UpdateBannedIPs();
            SaveData();
        }
コード例 #22
0
    private bool AttemptInvokeCommand <TObj>(StaticCommand command, IRCMessage msg, string cmdStr, Match m, TObj extraObject)
    {
        if (command.HasAttribute <DebuggingOnlyAttribute>() && !TwitchPlaySettings.data.EnableDebuggingCommands)
        {
            return(false);
        }
        if (command.HasAttribute <ElevatorOnlyAttribute>() && !(GameRoom.Instance is ElevatorGameRoom))
        {
            return(false);
        }
        if (command.HasAttribute <ElevatorDisallowedAttribute>() && GameRoom.Instance is ElevatorGameRoom)
        {
            return(false);
        }

        if (!UserAccess.HasAccess(msg.UserNickName, TwitchPlaySettings.data.AnarchyMode ? command.Attr.AccessLevelAnarchy : command.Attr.AccessLevel, orHigher: true))
        {
            IRCConnection.SendMessageFormat("@{0}, you need {1} access to use that command{2}.",
                                            msg.UserNickName,
                                            UserAccess.LevelToString(TwitchPlaySettings.data.AnarchyMode ? command.Attr.AccessLevelAnarchy : command.Attr.AccessLevel),
                                            TwitchPlaySettings.data.AnarchyMode ? " in anarchy mode" : "");
            // Return true so that the command counts as processed
            return(true);
        }

        if (extraObject is TwitchModule mdl && mdl.Solved && !command.HasAttribute <SolvedAllowedAttribute>() && !TwitchPlaySettings.data.AnarchyMode)
        {
            IRCConnection.SendMessageFormat(TwitchPlaySettings.data.AlreadySolved, mdl.Code, mdl.PlayerName, msg.UserNickName, mdl.BombComponent.GetModuleDisplayName());
            // Return true so that the command counts as processed (otherwise you get the above message multiple times)
            return(true);
        }

        Leaderboard.Instance.GetRank(msg.UserNickName, out Leaderboard.LeaderboardEntry entry);
        if (entry?.Team == null && extraObject is TwitchModule && OtherModes.VSModeOn)
        {
            IRCConnection.SendMessage($@"{msg.UserNickName}, you have not joined a team, and cannot solve modules in this mode until you do, please use !join evil or !join good.");
            // Return true so that the command counts as processed (otherwise you get the above message multiple times)
            return(true);
        }

        if (!TwitchGame.IsAuthorizedDefuser(msg.UserNickName, msg.IsWhisper))
        {
            return(true);
        }

        BanData ban = UserAccess.IsBanned(msg.UserNickName);

        if (ban != null)
        {
            if (double.IsPositiveInfinity(ban.BanExpiry))
            {
                IRCConnection.SendMessage($"Sorry @{msg.UserNickName}, You were banned permanently from Twitch Plays by {ban.BannedBy}{(string.IsNullOrEmpty(ban.BannedReason) ? "." : $", for the following reason: {ban.BannedReason}")}", msg.UserNickName, !msg.IsWhisper);
            }
            else
            {
                int secondsRemaining = (int)(ban.BanExpiry - DateTime.Now.TotalSeconds());

                int    daysRemaining    = secondsRemaining / 86400; secondsRemaining %= 86400;
                int    hoursRemaining   = secondsRemaining / 3600; secondsRemaining %= 3600;
                int    minutesRemaining = secondsRemaining / 60; secondsRemaining %= 60;
                string timeRemaining    = $"{secondsRemaining} seconds.";
                if (daysRemaining > 0)
                {
                    timeRemaining = $"{daysRemaining} days, {hoursRemaining} hours, {minutesRemaining} minutes, {secondsRemaining} seconds.";
                }
                else if (hoursRemaining > 0)
                {
                    timeRemaining = $"{hoursRemaining} hours, {minutesRemaining} minutes, {secondsRemaining} seconds.";
                }
                else if (minutesRemaining > 0)
                {
                    timeRemaining = $"{minutesRemaining} minutes, {secondsRemaining} seconds.";
                }

                IRCConnection.SendMessage($"Sorry @{msg.UserNickName}, You were timed out from Twitch Plays by {ban.BannedBy}{(string.IsNullOrEmpty(ban.BannedReason) ? "." : $", For the following reason: {ban.BannedReason}")} You can participate again in {timeRemaining}", msg.UserNickName, !msg.IsWhisper);
            }
            return(true);
        }

        var parameters = command.Method.GetParameters();
        var groupAttrs = parameters.Select(p => (GroupAttribute)p.GetCustomAttributes(typeof(GroupAttribute), false).FirstOrDefault()).ToArray();
        var arguments  = new object[parameters.Length];

        for (int i = 0; i < parameters.Length; i++)
        {
            // Capturing groups from the regular expression
            if (groupAttrs[i] != null && m != null)
            {
                var group = m.Groups[groupAttrs[i].GroupIndex];
                NumberParseResult result;

                // Helper function to parse numbers (ints, floats, doubles)
                NumberParseResult IsNumber <TNum>(TryParse <TNum> tryParse)
                {
                    var isNullable = parameters[i].ParameterType == typeof(Nullable <>).MakeGenericType(typeof(TNum));

                    if (parameters[i].ParameterType != typeof(TNum) && !isNullable)
                    {
                        return(NumberParseResult.NotOfDesiredType);
                    }

                    if (group.Success && tryParse(group.Value, out TNum rslt))
                    {
                        arguments[i] = rslt;
                        return(NumberParseResult.Success);
                    }
                    if (isNullable)
                    {
                        return(NumberParseResult.Success);
                    }
                    IRCConnection.SendMessage(group.Success ? "@{0}, “{1}” is not a valid number." : "@{0}, the command could not be parsed.", msg.UserNickName, !msg.IsWhisper, msg.UserNickName, group.Success ? group.Value : null);
                    return(NumberParseResult.Error);
                }

                // Strings
                if (parameters[i].ParameterType == typeof(string))
                {
                    arguments[i] = m.Success ? group.Value : null;
                }

                // Booleans — only specifies whether the group matched or not
                else if (parameters[i].ParameterType == typeof(bool))
                {
                    arguments[i] = group.Success;
                }

                // Numbers (int, float, double); includes nullables
                else if (
                    (result = IsNumber <int>(int.TryParse)) != NumberParseResult.NotOfDesiredType ||
                    (result = IsNumber <float>(float.TryParse)) != NumberParseResult.NotOfDesiredType ||
                    (result = IsNumber <double>(double.TryParse)) != NumberParseResult.NotOfDesiredType)
                {
                    if (result == NumberParseResult.Error)
                    {
                        return(true);
                    }
                }
            }

            // Built-in parameter names
            else if (parameters[i].ParameterType == typeof(string) && parameters[i].Name == "user")
            {
                arguments[i] = msg.UserNickName;
            }
            else if (parameters[i].ParameterType == typeof(string) && parameters[i].Name == "cmd")
            {
                arguments[i] = cmdStr;
            }
            else if (parameters[i].ParameterType == typeof(bool) && parameters[i].Name == "isWhisper")
            {
                arguments[i] = msg.IsWhisper;
            }
            else if (parameters[i].ParameterType == typeof(IRCMessage))
            {
                arguments[i] = msg;
            }
            else if (parameters[i].ParameterType == typeof(KMGameInfo))
            {
                arguments[i] = GetComponent <KMGameInfo>();
            }
            else if (parameters[i].ParameterType == typeof(KMGameInfo.State))
            {
                arguments[i] = CurrentState;
            }
            else if (parameters[i].ParameterType == typeof(FloatingHoldable) && extraObject is TwitchHoldable twitchHoldable)
            {
                arguments[i] = twitchHoldable.Holdable;
            }

            // Object we passed in (module, bomb, holdable)
            else if (parameters[i].ParameterType.IsAssignableFrom(typeof(TObj)))
            {
                arguments[i] = extraObject;
            }
            else if (parameters[i].IsOptional)
            {
                arguments[i] = parameters[i].DefaultValue;
            }
            else
            {
                IRCConnection.SendMessage("@{0}, this is a bug; please notify the devs. Error: the “{1}” command has an unrecognized parameter “{2}”. It expects a type of “{3}”, and the extraObject is of type “{4}”.", msg.UserNickName, !msg.IsWhisper, msg.UserNickName, command.Method.Name, parameters[i].Name, parameters[i].ParameterType.Name, extraObject?.GetType().Name);
                return(true);
            }
        }

        var invokeResult = command.Method.Invoke(null, arguments);

        if (invokeResult is bool invRes)
        {
            return(invRes);
        }
        else if (invokeResult is IEnumerator coroutine)
        {
            ProcessCommandCoroutine(coroutine, extraObject);
        }
        else if (invokeResult != null)
        {
            IRCConnection.SendMessage("@{0}, this is a bug; please notify the devs. Error: the “{1}” command returned something unrecognized.", msg.UserNickName, !msg.IsWhisper, msg.UserNickName, command.Method.Name);
        }

        if ((TwitchPlaySettings.data.AnarchyMode ? command.Attr.AccessLevelAnarchy : command.Attr.AccessLevel) > AccessLevel.Defuser)
        {
            AuditLog.Log(msg.UserNickName, UserAccess.HighestAccessLevel(msg.UserNickName), msg.Text);
        }
        return(true);
    }