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 }); } }
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))); }
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() }); } }
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); }
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); } }
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); }