Example #1
0
        async Task SingleRule(ParseResult result, IMessageCreatedEvent messageEvent)
        {
            var guild = messageEvent.Guild !;

            var num = result.GetIntArg("num");

            await messageEvent.Db.Entry(guild).Collection(g => g !.Rules).LoadAsync();

            guild !.Rules.Sort((a, b) => a.Number - b.Number);
            var rule = guild !.Rules.Find(r => r.Number == num);

            if (rule == null)
            {
                await messageEvent.RespondError($"Could not find rule {num}");

                return;
            }

            var text =
                $"{DiscordEmoji.FromName(DiscordBot.Instance.Client, $":{rule.Number.ToName()}:")} {rule.Description}";

            var embed = DiscordBot.Instance.BaseEmbed();

            embed.Description = text;

            await messageEvent.Respond(embed.Build());
        }
Example #2
0
        private async Task RemoveRule(ParseResult result, IMessageCreatedEvent messageEvent)
        {
            var guild = messageEvent.Guild !;

            var num = result.GetIntArg("num");

            await messageEvent.Db.Entry(guild).Collection(g => g !.Rules).LoadAsync();

            guild !.Rules.Sort((a, b) => a.Number - b.Number);
            var rule = guild !.Rules.Find(r => r.Number == num);

            if (rule == null)
            {
                messageEvent.RespondError($"Could not find rule {num}");
                return;
            }

            guild.Rules.Remove(rule);
            messageEvent.Db.Remove(rule);

            guild.Rules.ContinuouslyNumber(((guildRule, i) => guildRule.Number = i), 1);

            messageEvent.Respond("Removed");
            await messageEvent.Db.SaveChangesAsync();

            await UpdateRules(messageEvent);

            return;
        }
Example #3
0
        public void ProcessMessage(IMessageCreatedEvent messageEvent)
        {
            if (messageEvent.Message.Length == 0 || !messageEvent.Message.StartsWith(_config.Value.prefix))
            {
                return;
            }

            var commandText = messageEvent.Message.Remove(0, _config.Value.prefix.Length);


            var res = _cmdTree.tree.ParseString(commandText);

            if (res.error is not null)
            {
                var    usages = res.Nodes.Last().GetUsages(res);
                string text   = "Usage";
                foreach (var item in usages)
                {
                    text += $"\n {item}";
                }

                messageEvent.RespondError(text);
            }
            if (res.Callback is not null)
            {
                try
                {
                    if (res.Callback is CommandFunction func)
                    {
                        //func.Cmd(res, messageEvent);
                        RunCommand(res, messageEvent);
                    }
                }
                catch (Exception e)
                {
                    _logger.LogCritical(e, "Critical Exception while running command: {Message}", messageEvent.Message);

                    messageEvent.RespondError("Error");
                }
            }
        }
Example #4
0
            public override async Task <bool> CheckCondition(CommandFunction func, IMessageCreatedEvent context, ICommandConditionProvider provider)
            {
                var attribute = (CommandPermissionRequired)provider;

                var db = context.Db;

                if (context.Guild is not null)
                {
                    db.Entry(context.Guild).Collection(g => g.PermissionLevels).LoadAsync().Wait();

                    //var member = await ((DiscordMessageCreatedEvent)context)[email protected](ulong.Parse(context.Author.UserID));

                    var DGuild = await _bot.Client.GetGuildAsync(new Snowflake(context.Guild.GuildID));


                    PermissionLevels memberLevel = PermissionLevels.None;

                    if (context.Author.UserID == _conf.Value.Owner ||
                        context.Author.UserID == DGuild.OwnerId.ToString())
                    {
                        memberLevel = PermissionLevels.Owner;
                    }

                    var member = await DGuild.GetMemberAsync(new Snowflake(context.Author.UserID));

                    foreach (var guildLevel in context.Guild.PermissionLevels)
                    {
                        if (member.Roles.Any(r => r.Id.ToString() == guildLevel.RoleID))
                        {
                            if (guildLevel.PermissionLevel > memberLevel)
                            {
                                memberLevel = guildLevel.PermissionLevel;
                            }
                        }
                    }

                    if (attribute._permission > memberLevel)
                    {
                        context.RespondError($"You do not have the needed permissions. \n You must be {attribute._permission.ToString()} or above");
                        return(false);
                    }

                    return(true);
                }

                return(false);
            }
Example #5
0
        public async Task RunCommand(ParseResult result, IMessageCreatedEvent msgEvent)
        {
            var callback = (result.Callback as CommandFunction) !;

            var method     = callback.cmdMeta;
            var permission = method.GetCustomAttributes <CommandAttribute>();

            var commandConditionProviders = permission.ToList();

            _logger.LogInformation(
                "Command {CmdName} has the following conditions:\n" +
                "{Conditions}",
                "CMD name",
                String.Join("\n", commandConditionProviders.Select(p => p.GetType().Name)));

            bool check = true;

            foreach (var attribute in commandConditionProviders)
            {
                var con = ActivatorUtilities.CreateInstance(_provider, attribute.GetCondition()) as CommandCondition;

                check = check && await con !.CheckCondition(callback, msgEvent, attribute);
            }


            if (check)
            {
                try
                {
                    callback.Cmd.Invoke(result, msgEvent);
                }
                catch (Exception e)
                {
                    msgEvent.RespondError(e.Message);
                }
            }
            else
            {
                //msgEvent.RespondError("Couldn't authenticate");
            }
        }
Example #6
0
        private async Task AddQuote(ParseResult result, IMessageCreatedEvent context)
        {
            var db = context.Db;

            User creator = context.Author;
            User?source  = null;

            DateTime date      = context.Time;
            DateTime eventTime = context.Time;

            string text = "";

            if (context.HasRefMessage)
            {
                text      = context.RefMessageText !;
                source    = context.RefMessageAuthor ?? null;
                eventTime = context.RefMessageTime?.Date ?? context.Time;
            }
            else
            {
                if (result.Args.ContainsKey("text"))
                {
                    text = result.GetStringArg("text");
                }

                if (string.IsNullOrWhiteSpace(text))
                {
                    await context.RespondError("Dind't find text to quote");

                    return;
                }


                if (result.Args.ContainsKey("source"))
                {
                    var user = (DiscordUser)result.Args["source"];
                    source = db.GetOrCreateUserFor(user);
                }
            }


            await db.Entry(context.Guild).Collection(d => d !.Quotes).LoadAsync();

            context.Guild !.Quotes.Sort((a, b) => a.number - b.number);
            var last     = context.Guild.Quotes.LastOrDefault();
            var next_num = last?.number + 1 ?? 0;

            var entity = new Quote(creator.ID, source?.ID, context.Guild.ID, date, eventTime, text, null, next_num);

            db.Add(entity);

            var embed = DiscordBot.Instance.BaseEmbed();

            embed.Color       = new Optional <DiscordColor>(new DiscordColor(0, 255, 0));
            embed.Title       = $"Added new quote number {entity.number}:";
            embed.Description = $"> {text}";
            embed.Footer      = new DiscordEmbedBuilder.EmbedFooter()
            {
                Text = $"by {entity.SourceName}"
            };

            await context.Respond(embed.Build());

            await db.SaveChangesAsync();
        }