Esempio n. 1
0
        public async Task PingAsync(EventContext e)
        {
            IDiscordMessage message = await e.CreateEmbedBuilder()
                                      .WithTitle(new StringResource("Ping"))
                                      .WithDescription("ping_placeholder")
                                      .Build()
                                      .SendToChannel(e.Channel);

            await Task.Delay(100);

            if (message != null)
            {
                float ping = (float)(message.Timestamp - e.message.Timestamp).TotalMilliseconds;

                DiscordEmbed embed = new EmbedBuilder()
                                     .SetTitle("Pong - " + Environment.MachineName)
                                     .SetColor(Color.Lerp(new Color(0.0f, 1.0f, 0.0f), new Color(1.0f, 0.0f, 0.0f), Math.Min(ping / 1000, 1f)))
                                     .AddInlineField("Miki", ping + "ms").ToEmbed();

                await message.EditAsync(new EditMessageArgs {
                    content = "",
                    embed   = embed
                });
            }
        }
Esempio n. 2
0
        private async Task OnBlackjackWin(EventContext e, BlackjackManager bm, IDiscordMessage instanceMessage, int bet)
        {
            e.EventSystem.GetCommandHandler <SessionBasedCommandHandler>()
            .RemoveSession(e.Author.Id, e.Channel.Id);

            User user;

            using (var context = new MikiContext())
            {
                user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                if (user != null)
                {
                    await user.AddCurrencyAsync(bet * 2, e.Channel);

                    await context.SaveChangesAsync();
                }
            }

            await instanceMessage.EditAsync(new EditMessageArgs
            {
                embed = bm.CreateEmbed(e)
                        .SetAuthor(e.GetResource("miki_blackjack_win_title") + " | " + e.Author.Username, e.Author.GetAvatarUrl(), "https://patreon.com/mikibot")
                        .SetDescription(e.GetResource("miki_blackjack_win_description", bet * 2) + "\n" + e.GetResource("miki_blackjack_new_balance", user.Currency))
                        .ToEmbed()
            });
        }
        public static async Task <IDiscordMessage> EditAsync(this DiscordEmbed embed, IDiscordMessage msg)
        {
            var channel = await msg.GetChannelAsync();

            if (channel is IDiscordGuildChannel guildChannel)
            {
                var currentGuildUser = await guildChannel.GetSelfAsync();

                var permissions = await guildChannel.GetPermissionsAsync(currentGuildUser);

                if (!permissions.HasFlag(GuildPermission.EmbedLinks))
                {
                    return(await msg.EditAsync(new EditMessageArgs(embed.ToMessageBuilder().Build())));
                }
            }
            return(await msg.EditAsync(new EditMessageArgs("", embed)));
        }
Esempio n. 4
0
        private async Task OnBlackjackHit(EventContext e, BlackjackManager bm, IDiscordMessage instanceMessage, int bet)
        {
            IDiscordGuildUser me = await e.Guild.GetSelfAsync();

            //if (me.GetPermissions(e.Channel as IDiscordGuildChannel).Has(ChannelPermission.ManageMessages))
            //{
            //	await e.message.DeleteAsync();
            //}

            bm.player.AddToHand(bm.deck.DrawRandom());

            if (bm.Worth(bm.player) > 21)
            {
                await OnBlackjackDead(e, bm, instanceMessage, bet);
            }
            else
            {
                if (bm.player.Hand.Count == 5)
                {
                    await OnBlackjackHold(e, bm, instanceMessage, bet, true);

                    return;
                }
                else if (bm.Worth(bm.player) == 21 && bm.Worth(bm.dealer) != 21)
                {
                    await OnBlackjackWin(e, bm, instanceMessage, bet);

                    return;
                }
                else if (bm.Worth(bm.dealer) == 21 && bm.Worth(bm.player) != 21)
                {
                    await OnBlackjackDead(e, bm, instanceMessage, bet);

                    return;
                }

                await instanceMessage.EditAsync(new EditMessageArgs
                {
                    embed = bm.CreateEmbed(e).ToEmbed()
                });
            }
        }
Esempio n. 5
0
        public async Task GiveawayAsync(EventContext e)
        {
            DiscordEmoji emoji = new DiscordEmoji();

            emoji.Name = "🎁";

            e.Arguments.Take(out string giveawayText);

            while (!e.Arguments.Pack.Peek().StartsWith("-"))
            {
                giveawayText += " " + e.Arguments.Pack.Take();
            }

            var mml = new MMLParser(e.Arguments.Pack.TakeAll()).Parse();

            int      amount   = mml.Get("amount", 1);
            TimeSpan timeLeft = mml.Get("time", "1h").GetTimeFromString();

            if (amount > 10)
            {
                await e.ErrorEmbed("We can only allow up to 10 picks per giveaway")
                .ToEmbed().QueueToChannelAsync(e.Channel);

                return;
            }

            giveawayText = giveawayText + ((amount > 1) ? " x " + amount : "");

            List <IDiscordUser> winners = new List <IDiscordUser>();

            IDiscordMessage msg = await CreateGiveawayEmbed(e, giveawayText)
                                  .AddField("Time", timeLeft.ToTimeString(e.Locale), true)
                                  .AddField("React to participate", "good luck", true)
                                  .ToEmbed().SendToChannel(e.Channel);

            await msg.CreateReactionAsync(emoji);

            int updateTask = -1;

            int task = taskScheduler.AddTask(e.Author.Id, async(desc) =>
            {
                msg = await e.Channel.GetMessageAsync(msg.Id);

                if (msg != null)
                {
                    await msg.DeleteReactionAsync(emoji);

                    await Task.Delay(1000);

                    var reactions = await msg.GetReactionsAsync(emoji);

                    //do
                    //{
                    //	reactions.AddRange();
                    //	reactionsGained += 100;
                    //} while (reactions.Count == reactionsGained);

                    // Select random winners
                    for (int i = 0; i < amount; i++)
                    {
                        if (reactions.Count == 0)
                        {
                            break;
                        }

                        int index = MikiRandom.Next(reactions.Count);
                        winners.Add(reactions[index]);
                    }

                    if (updateTask != -1)
                    {
                        taskScheduler.CancelReminder(e.Author.Id, updateTask);
                    }

                    string winnerText = string.Join("\n", winners.Select(x => x.Username + "#" + x.Discriminator).ToArray());
                    if (string.IsNullOrEmpty(winnerText))
                    {
                        winnerText = "nobody!";
                    }

                    await msg.EditAsync(new EditMessageArgs
                    {
                        embed = CreateGiveawayEmbed(e, giveawayText)
                                .AddField("Winners", winnerText)
                                .ToEmbed()
                    });
                }
            }, "description var", timeLeft);
        }
Esempio n. 6
0
        public async Task ConfigRoleInteractiveAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                EmbedBuilder sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                           .SetDescription("Type out the role name you want to config")
                                           .SetColor(138, 182, 239);
                IDiscordMessage sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                IDiscordMessage msg = null;

                while (true)
                {
                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    if (msg.Content.Length < 20)
                    {
                        break;
                    }
                    else
                    {
                        await sourceMessage.EditAsync(new EditMessageArgs
                        {
                            embed = e.ErrorEmbed("That role name is way too long! Try again.")
                                    .ToEmbed()
                        });
                    }
                }

                string roleName = msg.Content;

                List <IDiscordRole> rolesFound = await GetRolesByName(e.Guild, roleName.ToLower());

                IDiscordRole role = null;

                if (rolesFound.Count == 0)
                {
                    // Hey, I couldn't find this role, Can I make a new one?
                    await sourceMessage.EditAsync(new EditMessageArgs
                    {
                        embed = e.ErrorEmbed($"There's no role that is named `{roleName}`, Shall I create it? Y/N").ToEmbed()
                    });

                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    if (msg.Content.ToLower()[0] != 'y')
                    {
                        throw new RoleNullException();
                    }

                    role = await e.Guild.CreateRoleAsync(new CreateRoleArgs
                    {
                        Name = roleName,
                    });
                }
                else if (rolesFound.Count > 1)
                {
                    string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));

                    if (roleIds.Length > 1024)
                    {
                        roleIds = roleIds.Substring(0, 1024);
                    }

                    sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                  .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
                                  .AddInlineField("Roles - Ids", roleIds)
                                  .SetColor(138, 182, 239);

                    sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                    while (true)
                    {
                        msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                        if (ulong.TryParse(msg.Content, out ulong id))
                        {
                            role = rolesFound.Where(x => x.Id == id)
                                   .FirstOrDefault();

                            if (role != null)
                            {
                                break;
                            }
                            else
                            {
                                await sourceMessage.EditAsync(new EditMessageArgs {
                                    embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
                                            .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                                });
                            }
                        }
                        else
                        {
                            await sourceMessage.EditAsync(new EditMessageArgs
                            {
                                embed = e.ErrorEmbed("I couldn't find that role. Try again!")
                                        .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                            });
                        }
                    }
                }
                else
                {
                    role = rolesFound.FirstOrDefault();
                }

                LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());

                if (newRole == null)
                {
                    newRole = (await context.LevelRoles.AddAsync(new LevelRole()
                    {
                        RoleId = role.Id.ToDbLong(),
                        GuildId = e.Guild.Id.ToDbLong()
                    })).Entity;
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription("Is there a role that is needed to get this role? Type out the role name, or `-` to skip")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                while (true)
                {
                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    rolesFound = (await GetRolesByName(e.Guild, msg.Content.ToLower()));
                    IDiscordRole parentRole = null;

                    if (rolesFound.Count > 1)
                    {
                        string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));

                        if (roleIds.Length > 1024)
                        {
                            roleIds = roleIds.Substring(0, 1024);
                        }

                        sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                      .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
                                      .AddInlineField("Roles - Ids", roleIds)
                                      .SetColor(138, 182, 239);

                        sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                        while (true)
                        {
                            msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                            if (ulong.TryParse(msg.Content, out ulong id))
                            {
                                parentRole = rolesFound.Where(x => x.Id == id)
                                             .FirstOrDefault();

                                if (parentRole != null)
                                {
                                    break;
                                }
                                else
                                {
                                    await sourceMessage.EditAsync(new EditMessageArgs {
                                        embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
                                                .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                                    });
                                }
                            }
                            else
                            {
                                await sourceMessage.EditAsync(new EditMessageArgs
                                {
                                    embed = e.ErrorEmbed("I couldn't find that role. Try again!")
                                            .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
                                });
                            }
                        }
                    }
                    else
                    {
                        parentRole = rolesFound.FirstOrDefault();
                    }

                    if (parentRole != null || msg.Content == "-")
                    {
                        newRole.RequiredRole = (long?)parentRole?.Id ?? 0;
                        break;
                    }

                    await sourceMessage.EditAsync(new EditMessageArgs
                    {
                        embed = e.ErrorEmbed("I couldn't find that role. Try again!").ToEmbed()
                    });
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Is there a level requirement? type a number, if there is no requirement type 0")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                while (true)
                {
                    msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                    if (int.TryParse(msg.Content, out int r))
                    {
                        if (r >= 0)
                        {
                            newRole.RequiredLevel = r;
                            break;
                        }
                        else
                        {
                            await sourceMessage.EditAsync(new EditMessageArgs
                            {
                                embed = sourceEmbed.SetDescription($"Please pick a number above 0. Try again")
                                        .ToEmbed()
                            });
                        }
                    }
                    else
                    {
                        await sourceMessage.EditAsync(new EditMessageArgs
                        {
                            embed = sourceEmbed.SetDescription($"Are you sure `{msg.Content}` is a number? Try again").ToEmbed()
                        });
                    }
                }

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Should I give them when the user level ups? type `yes`, otherwise it will be considered as no")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                if (msg == null)
                {
                    return;
                }

                newRole.Automatic = msg.Content.ToLower()[0] == 'y';

                sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                              .SetDescription($"Should users be able to opt in? type `yes`, otherwise it will be considered as no")
                              .SetColor(138, 182, 239);

                sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                newRole.Optable = msg.Content.ToLower()[0] == 'y';

                if (newRole.Optable)
                {
                    sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
                                  .SetDescription($"Do you want the user to pay mekos for the role? Enter any amount. Enter 0 to keep the role free.")
                                  .SetColor(138, 182, 239);

                    sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);

                    while (true)
                    {
                        msg = await e.EventSystem.GetCommandHandler <MessageListener>().WaitForNextMessage(e.CreateSession());

                        if (msg == null)
                        {
                            return;
                        }

                        if (int.TryParse(msg.Content, out int r))
                        {
                            if (r >= 0)
                            {
                                newRole.Price = r;
                                break;
                            }
                            else
                            {
                                await sourceMessage.EditAsync(new EditMessageArgs
                                {
                                    embed = e.ErrorEmbed($"Please pick a number above 0. Try again").ToEmbed()
                                });
                            }
                        }
                        else
                        {
                            await sourceMessage.EditAsync(new EditMessageArgs
                            {
                                embed = e.ErrorEmbed($"Not quite sure if this is a number 🤔").ToEmbed()
                            });
                        }
                    }
                }

                await context.SaveChangesAsync();

                Utils.Embed.SetTitle("⚙ Role Config")
                .SetColor(102, 117, 127)
                .SetDescription($"Updated {role.Name}!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
Esempio n. 7
0
        public async Task GiveawayAsync(EventContext e)
        {
            //Emoji emoji = new Emoji("🎁");

            var    arg          = e.Arguments.FirstOrDefault();
            string giveAwayText = arg?.Argument ?? "";

            arg = arg?.Next();

            while (!(arg?.Argument ?? "-").StartsWith("-"))
            {
                giveAwayText += " " + arg.Argument;
                arg           = arg?.Next();
            }

            var mml = new MMLParser(arg?.TakeUntilEnd()?.Argument ?? "").Parse();

            bool     isUnique = mml.Get("unique", false);
            int      amount   = mml.Get("amount", 1);
            TimeSpan timeLeft = mml.Get("time", "1h").GetTimeFromString();

            if (amount > 10)
            {
                e.ErrorEmbed("We can only allow up to 10 picks per giveaway")
                .ToEmbed().QueueToChannel(e.Channel);
                return;
            }

            giveAwayText = giveAwayText + ((amount > 1) ? " x " + amount : "");

            List <IDiscordUser> winners = new List <IDiscordUser>();

            IDiscordMessage msg = await CreateGiveawayEmbed(e, giveAwayText)
                                  .AddField("Time", (DateTime.Now + timeLeft).ToShortTimeString(), true)
                                  .AddField("React to participate", "good luck", true)
                                  .ToEmbed().SendToChannel(e.Channel);

            //await (msg as IUserMessage).AddReactionAsync(emoji);

            int updateTask = -1;

            int task = taskScheduler.AddTask(e.Author.Id, async(desc) =>
            {
                //msg = await e.Channel.GetMessageAsync(msg.Id);

                if (msg != null)
                {
                    //await msg.RemoveReactionAsync(emoji, await e.Guild.GetCurrentUserAsync());

                    List <IDiscordUser> reactions = new List <IDiscordUser>();

                    int reactionsGained = 0;

                    do
                    {
                        //reactions.AddRange(await (msg as  IUserMessage).GetReactionUsersAsync(emoji, 100, reactions.LastOrDefault()?.Id ?? null));
                        reactionsGained += 100;
                    } while (reactions.Count == reactionsGained);

                    // Select random winners
                    for (int i = 0; i < amount; i++)
                    {
                        if (reactions.Count == 0)
                        {
                            break;
                        }

                        int index = MikiRandom.Next(reactions.Count);

                        winners.Add(reactions[index]);

                        if (isUnique)
                        {
                            reactions.RemoveAt(index);
                        }
                    }

                    if (updateTask != -1)
                    {
                        taskScheduler.CancelReminder(e.Author.Id, updateTask);
                    }

                    string winnerText = string.Join("\n", winners.Select(x => x.Username + "#" + x.Discriminator).ToArray());
                    if (string.IsNullOrEmpty(winnerText))
                    {
                        winnerText = "nobody!";
                    }

                    await msg.EditAsync(new EditMessageArgs
                    {
                        embed = CreateGiveawayEmbed(e, giveAwayText)
                                .AddField("Winners", winnerText)
                                .ToEmbed()
                    });
                }
            }, "description var", timeLeft);
        }