Beispiel #1
0
 public UserAbility(PermissionAbility permAbility, in bool enabledState, string valueStr, in int valueInt,
Beispiel #2
0
        public override void ExecuteCommand(EvtChatCommandArgs args)
        {
            List <string> arguments = args.Command.ArgumentsAsList;

            if (arguments.Count != 3 && arguments.Count != 6)
            {
                QueueMessage(UsageMessage);
                return;
            }

            //Get the user calling this
            string thisUserName = args.Command.ChatMessage.Username.ToLowerInvariant();

            string abilityUserName   = arguments[0].ToLowerInvariant();
            string abilityName       = arguments[1].ToLowerInvariant();
            string abilityEnabledStr = arguments[2].ToLowerInvariant();

            User thisUser    = DataHelper.GetUser(thisUserName);
            User abilityUser = DataHelper.GetUser(abilityUserName);

            if (abilityUser == null)
            {
                QueueMessage("This user doesn't exist in the database!");
                return;
            }

            PermissionAbility permAbility = null;

            using (BotDBContext context = DatabaseManager.OpenContext())
            {
                permAbility = context.PermAbilities.FirstOrDefault(p => p.Name == abilityName);
            }

            if (permAbility == null)
            {
                QueueMessage($"There is no permission ability named \"{abilityName}\".");
                return;
            }

            if (thisUser.Name != abilityUser.Name && thisUser.Level <= abilityUser.Level)
            {
                QueueMessage("You cannot modify abilities for other users with levels greater than or equal to yours!");
                return;
            }

            if ((long)permAbility.AutoGrantOnLevel > thisUser.Level)
            {
                QueueMessage("This ability isn't available to your level, so you cannot grant it!");
                return;
            }

            if ((long)permAbility.MinLevelToGrant > thisUser.Level)
            {
                QueueMessage($"You need to be at least level {(long)permAbility.MinLevelToGrant}, {permAbility.MinLevelToGrant}, to grant this ability.");
                return;
            }

            if (bool.TryParse(abilityEnabledStr, out bool enabledState) == false)
            {
                QueueMessage("Invalid enabled state.");
                return;
            }

            string valueStrArg   = string.Empty;
            string valueIntArg   = string.Empty;
            string expirationArg = string.Empty;
            int    valueInt      = 0;

            using (BotDBContext context = DatabaseManager.OpenContext())
            {
                UserAbility newUserAbility = null;

                abilityUser = DataHelper.GetUserNoOpen(abilityUserName, context);
                abilityUser.TryGetAbility(abilityName, out newUserAbility);

                bool shouldAdd = false;

                if (newUserAbility == null)
                {
                    //TRBotLogger.Logger.Information($"New ability {abilityName}");

                    newUserAbility = new UserAbility();
                    shouldAdd      = true;
                }

                newUserAbility.PermabilityID  = permAbility.ID;
                newUserAbility.UserID         = abilityUser.ID;
                newUserAbility.GrantedByLevel = thisUser.Level;
                newUserAbility.SetEnabledState(enabledState);

                //If there are only three arguments, enable/disable the ability
                if (arguments.Count == 3)
                {
                    if (shouldAdd == true)
                    {
                        //TRBotLogger.Logger.Information($"Adding ability {abilityName}");
                        abilityUser.UserAbilities.Add(newUserAbility);
                    }

                    if (enabledState == true)
                    {
                        QueueMessage($"Enabled the \"{abilityName}\" ability for {abilityUser.Name}!");
                    }
                    else
                    {
                        QueueMessage($"Disabled the \"{abilityName}\" ability for {abilityUser.Name}!");
                    }

                    //Save and exit here
                    context.SaveChanges();

                    return;
                }

                valueStrArg   = arguments[3];
                valueIntArg   = arguments[4];
                expirationArg = arguments[5].ToLowerInvariant();

                newUserAbility.ValueStr = valueStrArg;

                //Validate arguments
                if (int.TryParse(valueIntArg, out valueInt) == false)
                {
                    QueueMessage("Invalid value_int argument.");
                    return;
                }

                newUserAbility.ValueInt = valueInt;

                if (expirationArg == NULL_EXPIRATION_ARG)
                {
                    newUserAbility.Expiration = null;
                }
                else
                {
                    if (Helpers.TryParseTimeModifierFromStr(expirationArg, out TimeSpan timeFromNow) == false)
                    {
                        QueueMessage("Unable to parse expiration time from now.");
                        return;
                    }

                    //Set the time to this amount from now
                    newUserAbility.Expiration = DateTime.UtcNow + timeFromNow;
                }

                //Add if we should
                if (shouldAdd == true)
                {
                    abilityUser.UserAbilities.Add(newUserAbility);
                }

                //Save changes
                context.SaveChanges();
            }

            if (enabledState == true)
            {
                QueueMessage($"Enabled the \"{abilityName}\" ability to {abilityUser.Name} with values ({valueStrArg}, {valueInt}) and expires in {expirationArg}!");
            }
            else
            {
                QueueMessage($"Disabled the \"{abilityName}\" ability on {abilityUser.Name} with values ({valueStrArg}, {valueInt}) and expires in {expirationArg}!");
            }
        }