private async Task <Result> ValidateCommand(CommandInstanceModel commandInstance)
        {
            Result           validationResult = new Result();
            CommandModelBase command          = commandInstance.Command;

            if (command != null)
            {
                validationResult = await command.CustomValidation(commandInstance.Parameters);

                if (validationResult.Success)
                {
                    validationResult = await command.ValidateRequirements(commandInstance.Parameters);

                    if (!validationResult.Success && ChannelSession.Settings.RequirementErrorsCooldownType != RequirementErrorCooldownTypeEnum.PerCommand)
                    {
                        command.CommandErrorCooldown = RequirementModelBase.UpdateErrorCooldown();
                    }
                }
                else
                {
                    if (ChannelSession.Settings.RequirementErrorsCooldownType != RequirementErrorCooldownTypeEnum.None)
                    {
                        if (!string.IsNullOrEmpty(validationResult.Message) && validationResult.DisplayMessage)
                        {
                            await ChannelSession.Services.Chat.SendMessage(validationResult.Message);
                        }
                    }
                }

                if (validationResult.Success)
                {
                    if (command.Requirements != null)
                    {
                        await command.PerformRequirements(commandInstance.Parameters);

                        commandInstance.RunnerParameters = new List <CommandParametersModel>(command.GetPerformingUsers(commandInstance.Parameters));
                    }
                }
                else
                {
                    if (!string.IsNullOrEmpty(validationResult.Message))
                    {
                        commandInstance.ErrorMessage = validationResult.Message;
                        commandInstance.State        = CommandInstanceStateEnum.Failed;
                    }
                    else
                    {
                        commandInstance.State = CommandInstanceStateEnum.Completed;
                    }
                }
            }
            return(validationResult);
        }
        public RequirementsSetModel GetRequirements()
        {
            List <RequirementModelBase> requirements = new List <RequirementModelBase>();

            foreach (RequirementViewModelBase requirement in this.Requirements)
            {
                RequirementModelBase req = requirement.GetRequirement();
                if (req != null)
                {
                    requirements.Add(requirement.GetRequirement());
                }
            }
            return(new RequirementsSetModel(requirements));
        }