public async Task FindAnimeAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { return; } int page = 0; page = e.Arguments.LastOrDefault().AsInt() ?? 0; arg = arg.TakeUntilEnd((page != 0) ? 1 : 0); string searchQuery = arg.Argument; arg = arg.Next(); ISearchResult <IMediaSearchResult> result = (await anilistClient.SearchMediaAsync(searchQuery, page, (e.Channel as ITextChannel).IsNsfw, MediaFormat.MANGA, MediaFormat.NOVEL)); if (result.Items.Count == 0) { if (page > result.PageInfo.TotalPages && page != 0) { e.ErrorEmbed($"You've exceeded the total amount of pages available, might want to move back a bit!") .Build().QueueToChannel(e.Channel); } else { e.ErrorEmbed($"No characters listed containing `{e.Arguments.ToString()}`, try something else!") .Build().QueueToChannel(e.Channel); } return; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < result.Items.Count; i++) { sb.AppendLine($"`{result.Items[i].Id.ToString().PadRight(5)}:` {result.Items[i].DefaultTitle}"); } Utils.Embed.SetAuthor($"Search result for `{searchQuery}`", "https://anilist.co/img/logo_al.png", "") .WithDescription(sb.ToString()) .WithColor(0, 170, 255) .WithFooter($"Page {result.PageInfo.CurrentPage} of {result.PageInfo.TotalPages} | Powered by anilist.co", "") .Build().QueueToChannel(e.Channel); }
public async Task SearchPasta(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { e.ErrorEmbed(e.Locale.GetString("searchpasta_error_no_arg")) .ToEmbed().QueueToChannel(e.Channel); return; } string query = arg.Argument; arg = arg.Next(); int page = (arg?.TakeInt() ?? 0); using (var context = new MikiContext()) { var pastasFound = await context.Pastas.Where(x => x.Id.ToLower().Contains(query.ToLower())) .OrderByDescending(x => x.Id) .Skip(25 * page) .Take(25) .ToListAsync(); var totalCount = await context.Pastas.Where(x => x.Id.Contains(query)) .CountAsync(); if (pastasFound?.Count > 0) { string resultString = ""; pastasFound.ForEach(x => { resultString += "`" + x.Id + "` "; }); new EmbedBuilder { Title = e.Locale.GetString("miki_module_pasta_search_header"), Description = resultString }.SetFooter(e.Locale.GetString("page_index", page + 1, (Math.Ceiling((double)totalCount / 25)).ToString())) .ToEmbed().QueueToChannel(e.Channel); return; } e.ErrorEmbed(e.Locale.GetString("miki_module_pasta_search_error_no_results", query)) .ToEmbed().QueueToChannel(e.Channel); } }
public async Task OnBlackjackNew(EventContext e, ArgObject args) { int?bet = await ValidateBetAsync(e, args); if (bet.HasValue) { using (var context = new MikiContext()) { var user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (user == null) { return; } user.Currency -= bet.Value; await context.SaveChangesAsync(); } if (await Global.RedisClient.ExistsAsync($"miki:blackjack:{e.Channel.Id}:{e.Author.Id}")) { e.ErrorEmbed("You still have a blackjack game running here, please either stop it by using `>blackjack stay` or finish playing it. This game will expire in 24 hours.") .ToEmbed().QueueToChannel(e.Channel); return; } BlackjackManager manager = new BlackjackManager(bet.Value); CardHand dealer = manager.AddPlayer(0); CardHand player = manager.AddPlayer(e.Author.Id); manager.DealAll(); manager.DealAll(); dealer.Hand[1].isPublic = false; IDiscordMessage message = await manager.CreateEmbed(e) .ToEmbed() .SendToChannel(e.Channel); manager.MessageId = message.Id; await Global.RedisClient.UpsertAsync($"miki:blackjack:{e.Channel.Id}:{e.Author.Id}", manager.ToContext(), TimeSpan.FromHours(24)); } }
public async Task OnBlackjackNew(EventContext e, ArgObject args) { int?bet = await ValidateBetAsync(e, args); if (bet.HasValue) { if (await Global.RedisClient.ExistsAsync($"miki:blackjack:{e.Channel.Id}:{e.Author.Id}")) { e.ErrorEmbedResource(new LanguageResource("blackjack_session_exists")) .ToEmbed().QueueToChannel(e.Channel); return; } using (var context = new MikiContext()) { var user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (user == null) { return; } user.RemoveCurrency(bet.Value); await context.SaveChangesAsync(); } BlackjackManager manager = new BlackjackManager(bet.Value); CardHand dealer = manager.AddPlayer(0); CardHand player = manager.AddPlayer(e.Author.Id); manager.DealAll(); manager.DealAll(); dealer.Hand[1].isPublic = false; IDiscordMessage message = await manager.CreateEmbed(e) .ToEmbed().SendToChannel(e.Channel); manager.MessageId = message.Id; await Global.RedisClient.UpsertAsync($"miki:blackjack:{e.Channel.Id}:{e.Author.Id}", manager.ToContext(), TimeSpan.FromHours(24)); } }
public async Task BlackjackAsync(EventContext e) { ArgObject args = e.Arguments.FirstOrDefault(); string subCommand = args?.Argument.ToLower() ?? ""; args = args?.Next(); switch (subCommand) { case "new": { await OnBlackjackNew(e, args); } break; case "hit": case "draw": { await OnBlackjackHit(e); } break; case "stay": case "stand": { await OnBlackjackHold(e); } break; default: { new EmbedBuilder() .SetTitle("🎲 Blackjack") .SetColor(234, 89, 110) .SetDescription("Play a game of blackjack against miki!\n\n" + "`>blackjack new <bet> [ok]` to start a new game\n" + "`>blackjack hit` to draw a card\n" + "`>blackjack stay` to stand") .ToEmbed() .QueueToChannel(e.Channel); } break; } }
//[Command(Name = "reportpasta")] //public async Task ReportPastaAsync(EventContext e) //{ // ArgObject arg = e.Arguments.FirstOrDefault(); // if(arg == null) // { // // TODO: error message // return; // } // string pastaId = arg.Argument; // arg = arg.Next(); // string reason = arg?.TakeUntilEnd()?.Argument ?? ""; // if(string.IsNullOrEmpty(reason)) // { // // TODO: reason empty error // return; // } // Utils.SuccessEmbed(e.Channel.Id, "Your report has been received!").QueueToChannel(e.Channel); // Utils.Embed.SetAuthor(e.Author.Username, e.Author.GetAvatarUrl(), "") // .SetDescription($"Reported pasta `{pastaId}`.```{reason}```") // .SetColor(255, 0 , 0) // .SetFooter(DateTime.Now.ToString(), "") // .ToEmbed().QueueToChannel(Bot.Instance.Client.GetChannel(PastaReportsChannelId) as IMessageChannel); //} public async Task FavouritePastaList(EventContext e, bool lovedPastas = true) { IDiscordUser targetUser = e.Author; float totalPerPage = 25f; int page = 0; ArgObject arg = e.Arguments.FirstOrDefault(); page = arg?.TakeInt() ?? 0; using (MikiContext context = new MikiContext()) { long authorId = targetUser.Id.ToDbLong(); List <PastaVote> pastaVotes = await context.Votes.Where(x => x.UserId == authorId && x.PositiveVote == lovedPastas).ToListAsync(); int maxPage = (int)Math.Floor(pastaVotes.Count() / totalPerPage); page = page > maxPage ? maxPage : page; page = page < 0 ? 0 : page; if (pastaVotes.Count() <= 0) { string loveString = (lovedPastas ? e.Locale.GetString("miki_module_pasta_loved") : e.Locale.GetString("miki_module_pasta_hated")); string errorString = e.Locale.GetString("miki_module_pasta_favlist_self_none", loveString); if (e.message.MentionedUserIds.Count() >= 1) { errorString = e.Locale.GetString("miki_module_pasta_favlist_mention_none", loveString); } Utils.ErrorEmbed(e, errorString).ToEmbed().QueueToChannel(e.Channel); return; } EmbedBuilder embed = new EmbedBuilder(); List <PastaVote> neededPastas = pastaVotes.Skip((int)totalPerPage * page).Take((int)totalPerPage).ToList(); string resultString = string.Join(" ", neededPastas.Select(x => $"`{x.Id}`")); string useName = string.IsNullOrEmpty(targetUser.Username) ? targetUser.Username : targetUser.Username; embed.SetTitle($"{(lovedPastas ? e.Locale.GetString("miki_module_pasta_loved_header") : e.Locale.GetString("miki_module_pasta_hated_header"))} - {useName}"); embed.SetDescription(resultString); embed.SetFooter(e.Locale.GetString("page_index", page + 1, Math.Ceiling(pastaVotes.Count() / totalPerPage)), ""); embed.ToEmbed().QueueToChannel(e.Channel); } }
private Task CancelReminderAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); arg = arg?.Next(); if (arg == null) { e.ErrorEmbed(e.Locale.GetString("error_argument_null", "id")) .ToEmbed().QueueToChannel(e.Channel); return(Task.CompletedTask); } if (Utils.IsAll(arg)) { if (reminders.GetAllInstances(e.Author.Id) is List <TaskInstance <string> > instances) { instances.ForEach(i => i.Cancel()); } new EmbedBuilder() .SetTitle($"⏰ {e.Locale.GetString("reminders")}") .SetColor(0.86f, 0.18f, 0.26f) .SetDescription(e.Locale.GetString("reminder_cancelled_all")) .ToEmbed().QueueToChannel(e.Channel); return(Task.CompletedTask); } else if (int.TryParse(arg.Argument, out int id)) { if (reminders.CancelReminder(e.Author.Id, id) is TaskInstance <string> i) { new EmbedBuilder() .SetTitle($"⏰ {e.Locale.GetString("reminders")}") .SetColor(0.86f, 0.18f, 0.26f) .SetDescription(e.Locale.GetString("reminder_cancelled", $"`{i.Context}`")) .ToEmbed().QueueToChannel(e.Channel); return(Task.CompletedTask); } } e.ErrorEmbed(e.Locale.GetString("error_reminder_null")) .ToEmbed().QueueToChannel(e.Channel); return(Task.CompletedTask); }
public async Task SetModuleAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { return; } string moduleName = arg.Argument; Module m = e.EventSystem.GetCommandHandler <SimpleCommandHandler>().Modules.FirstOrDefault(x => x.Name == moduleName); if (m == null) { e.ErrorEmbed($"{arg.Argument} is not a valid module.") .ToEmbed().QueueToChannel(e.Channel); return; } arg = arg?.Next(); bool?setValue = arg.TakeBoolean(); if (!setValue.HasValue) { setValue = arg.Argument.ToLower() == "yes" || arg.Argument == "1"; } if (!m.CanBeDisabled && !setValue.Value) { e.ErrorEmbed(e.Locale.GetString("miki_admin_cannot_disable", $"`{moduleName}`")) .ToEmbed().QueueToChannel(e.Channel); return; } arg = arg?.Next(); await m.SetEnabled(Global.RedisClient, e.Guild.Id, (setValue ?? false)); e.SuccessEmbed(((setValue ?? false) ? e.Locale.GetString("miki_generic_enabled") : e.Locale.GetString("miki_generic_disabled")) + $" {m.Name}") .QueueToChannel(e.Channel); }
public override async Task SelectAsync() { Args a = await MenuInstance.ListenMessageAsync(); ArgObject arg = a.FirstOrDefault(); if (arg != null) { int?pageId = arg.AsInt(); if (pageId != null) { pageId = Math.Clamp(pageId.Value, 1, Children.Count + 1); await(MenuInstance.Message as IUserMessage).ModifyAsync(x => { x.Embed = Children[pageId.Value - 1].Build(); }); await Children[pageId.Value - 1].SelectAsync(); } } }
public async Task GetCharacterAsync(EventContext e) { ICharacter character = null; ArgObject arg = e.Arguments.Join(); int?characterId = arg.TakeInt(); if (characterId != null) { character = await anilistClient.GetCharacterAsync(characterId.Value); } else { character = await anilistClient.GetCharacterAsync(arg.Argument); } if (character != null) { string description = character.Description; if (description.Length > 1024) { description = new string(description.Take(1020).ToArray()); description = new string(description.Take(description.LastIndexOf(' ')).ToArray()) + "..."; } new EmbedBuilder() .SetAuthor($"{character.FirstName} {character.LastName}", "https://anilist.co/img/logo_al.png", character.SiteUrl) .SetDescription(character.NativeName) .AddInlineField("Description", description) .SetColor(0, 170, 255) .SetThumbnail(character.LargeImageUrl) .SetFooter("Powered by anilist.co", "") .ToEmbed().QueueToChannel(e.Channel); } else { e.ErrorEmbed("Character not found!") .ToEmbed().QueueToChannel(e.Channel); } }
public override async Task SelectAsync() { Args a = await MenuInstance.ListenMessageAsync(); ArgObject arg = a.FirstOrDefault(); if (arg != null) { int?pageId = arg.TakeInt(); if (pageId != null) { pageId = Math.Clamp(pageId.Value, 1, Children.Count + 1); await MenuInstance.Message.EditAsync(new EditMessageArgs() { embed = Children[pageId.Value - 1].Build() }); await Children[pageId.Value - 1].SelectAsync(); } } }
public async Task CreatePasta(EventContext e) { if (e.Arguments.Count < 2) { e.ErrorEmbed(e.GetResource("createpasta_error_no_content")).Build().QueueToChannel(e.Channel); return; } ArgObject arg = e.Arguments.FirstOrDefault(); string id = arg.Argument; arg = arg.Next(); string text = arg.TakeUntilEnd().Argument; using (var context = new MikiContext()) { await GlobalPasta.AddAsync(context, id, text, (long)e.Author.Id); await context.SaveChangesAsync(); } }
public async Task SetMekos(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); IDiscordUser user = await arg.GetUserAsync(e.Guild); arg = arg.Next(); int amount = arg?.AsInt() ?? 0; using (var context = new MikiContext()) { User u = await context.Users.FindAsync((long)user.Id); if (u == null) { return; } u.Currency = amount; await context.SaveChangesAsync(); e.Channel.QueueMessageAsync(":ok_hand:"); } }
public async Task AvatarAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { e.Channel.QueueMessageAsync(e.Author.GetAvatarUrl()); } else { if (arg.Argument == "-s") { e.Channel.QueueMessageAsync(e.Guild.IconUrl); return; } IDiscordGuildUser user = await arg.GetUserAsync(e.Guild); if (user != null) { e.Channel.QueueMessageAsync(user.GetAvatarUrl()); } } }
public async Task DoSafe(EventContext e) { ILinkable s = null; ArgObject arg = e.Arguments.FirstOrDefault(); if (arg != null) { string useArg = arg.Argument; if (useArg.ToLower().StartsWith("use")) { arg = arg.Next(); switch (useArg.Split(':')[1].ToLower()) { case "safebooru": { s = await ImageboardProviderPool.GetProvider <SafebooruPost>().GetPostAsync(arg?.TakeUntilEnd().Argument, ImageboardRating.SAFE); } break; case "gelbooru": { s = await ImageboardProviderPool.GetProvider <GelbooruPost>().GetPostAsync(arg?.TakeUntilEnd().Argument, ImageboardRating.SAFE); } break; case "konachan": { s = await ImageboardProviderPool.GetProvider <KonachanPost>().GetPostAsync(arg?.TakeUntilEnd().Argument, ImageboardRating.SAFE); } break; case "e621": { s = await ImageboardProviderPool.GetProvider <E621Post>().GetPostAsync(arg?.TakeUntilEnd().Argument, ImageboardRating.SAFE); } break; default: { e.Channel.QueueMessageAsync("I do not support this image host :("); } break; } } else { s = await ImageboardProviderPool.GetProvider <SafebooruPost>().GetPostAsync(e.Arguments.Join()?.Argument ?? "", ImageboardRating.SAFE); } } else { s = await ImageboardProviderPool.GetProvider <SafebooruPost>().GetPostAsync(e.Arguments.Join()?.Argument ?? "", ImageboardRating.SAFE); } if (s == null) { e.ErrorEmbed("We couldn't find an image with these tags!").ToEmbed().QueueToChannel(e.Channel); return; } e.Channel.QueueMessageAsync(s.Url); }
public async Task MarryAsync(EventContext e) { long askerId = 0; long receiverId = 0; ArgObject args = e.Arguments.FirstOrDefault(); if (args == null) { return; } IDiscordGuildUser user = await args.GetUserAsync(e.Guild); if (user == null) { e.Channel.QueueMessageAsync("Couldn't find this person.."); return; } if (user.Id == (await e.Guild.GetSelfAsync()).Id) { e.Channel.QueueMessageAsync("(´・ω・`)"); return; } using (MikiContext context = new MikiContext()) { User mentionedPerson = await User.GetAsync(context, user); User currentUser = await User.GetAsync(context, e.Author); askerId = currentUser.Id; receiverId = mentionedPerson.Id; if (currentUser == null || mentionedPerson == null) { e.ErrorEmbed(e.GetResource("miki_module_accounts_marry_error_null")).ToEmbed().QueueToChannel(e.Channel); return; } if (mentionedPerson.Banned) { e.ErrorEmbed("This person has been banned from Miki.").ToEmbed().QueueToChannel(e.Channel); return; } if (mentionedPerson.Id == currentUser.Id) { e.ErrorEmbed(e.GetResource("miki_module_accounts_marry_error_null")).ToEmbed().QueueToChannel(e.Channel); return; } if (await Marriage.ExistsAsync(context, mentionedPerson.Id, currentUser.Id)) { e.ErrorEmbed(e.GetResource("miki_module_accounts_marry_error_exists")).ToEmbed().QueueToChannel(e.Channel); return; } } await Marriage.ProposeAsync(askerId, receiverId); Utils.Embed .SetTitle("💍" + e.GetResource("miki_module_accounts_marry_text", $"**{e.Author.Username}**", $"**{user.Username}**")) .SetDescription(e.GetResource("miki_module_accounts_marry_text2", user.Username, e.Author.Username)) .SetColor(0.4f, 0.4f, 0.8f) .SetThumbnail("https://i.imgur.com/TKZSKIp.png") .AddInlineField("✅ To accept", $">acceptmarriage @user") .AddInlineField("❌ To decline", $">declinemarriage @user") .SetFooter("Take your time though! This proposal won't disappear", "") .ToEmbed().QueueToChannel(e.Channel); }
public async Task BuyProfileBackgroundAsync(EventContext e) { ArgObject arguments = e.Arguments.FirstOrDefault(); if (arguments == null) { e.Channel.QueueMessageAsync("Enter a number after `>buybackground` to check the backgrounds! (e.g. >buybackground 1)"); } else { if (arguments.TryParseInt(out int id)) { if (id >= Global.Backgrounds.Backgrounds.Count || id < 0) { e.ErrorEmbed("This background does not exist!") .ToEmbed() .QueueToChannel(e.Channel); return; } Background background = Global.Backgrounds.Backgrounds[id]; var embed = new EmbedBuilder() .SetTitle("Buy Background") .SetImage(background.ImageUrl); if (background.Price > 0) { embed.SetDescription($"This background for your profile will cost {background.Price.ToFormattedString()} mekos, Type `>buybackground {id} yes` to buy."); } else { embed.SetDescription($"This background is not for sale."); } arguments = arguments.Next(); if (arguments?.Argument.ToLower() == "yes") { if (background.Price > 0) { using (var context = new MikiContext()) { User user = await User.GetAsync(context, e.Author.Id, e.Author.Username); long userId = (long)e.Author.Id; BackgroundsOwned bo = await context.BackgroundsOwned.FindAsync(userId, background.Id); if (bo == null) { user.RemoveCurrency(background.Price); await context.BackgroundsOwned.AddAsync(new BackgroundsOwned() { UserId = e.Author.Id.ToDbLong(), BackgroundId = background.Id, }); await context.SaveChangesAsync(); e.SuccessEmbed("Background purchased!") .QueueToChannel(e.Channel); } else { throw new BackgroundOwnedException(); } } } } else { embed.ToEmbed() .QueueToChannel(e.Channel); } } } }
public async Task LeaderboardsAsync(EventContext e) { LeaderboardsOptions options = new LeaderboardsOptions(); ArgObject argument = e.Arguments.FirstOrDefault(); switch (argument?.Argument.ToLower() ?? "") { case "commands": case "cmds": { options.Type = LeaderboardsType.COMMANDS; argument = argument?.Next(); } break; case "currency": case "mekos": case "money": case "bal": { options.Type = LeaderboardsType.CURRENCY; argument = argument?.Next(); } break; case "rep": case "reputation": { options.Type = LeaderboardsType.REPUTATION; argument = argument?.Next(); } break; case "pasta": case "pastas": { options.Type = LeaderboardsType.PASTA; argument = argument?.Next(); } break; case "experience": case "exp": { options.Type = LeaderboardsType.EXPERIENCE; argument = argument?.Next(); } break; case "guild": case "guilds": { options.Type = LeaderboardsType.GUILDS; argument = argument?.Next(); } break; default: { options.Type = LeaderboardsType.EXPERIENCE; } break; } if (argument?.Argument.ToLower() == "local") { if (options.Type != LeaderboardsType.PASTA) { options.GuildId = e.Guild.Id; } argument = argument.Next(); } if ((argument?.TakeInt() ?? 0) != 0) { options.Offset = Math.Max(0, argument.TakeInt().Value - 1) * 12; argument = argument?.Next(); } options.Amount = 12; using (var context = new MikiContext()) { int p = Math.Max(options.Offset - 1, 0); using (var api = new MikiApi(Global.Config.MikiApiBaseUrl, Global.Config.MikiApiKey)) { LeaderboardsObject obj = await api.GetPagedLeaderboardsAsync(options); Utils.RenderLeaderboards(new EmbedBuilder(), obj.items, obj.currentPage * 12) .SetFooter( e.Locale.GetString("page_index", obj.currentPage + 1, Math.Ceiling((double)obj.totalPages / 10)), "" ) .SetAuthor( "Leaderboards: " + options.Type + " (click me!)", null, api.BuildLeaderboardsUrl(options) ) .ToEmbed() .QueueToChannel(e.Channel); } } }
private async Task GetMediaAsync(EventContext e, bool manga, params MediaFormat[] format) { IMedia media = null; ArgObject arg = e.Arguments.Join(); int?mediaId = arg.AsInt(); if (mediaId != null) { media = await anilistClient.GetMediaAsync(mediaId.Value); } else { string filter = "search: $p0, format_not_in: $p1"; List <GraphQLParameter> parameters = new List <GraphQLParameter> { new GraphQLParameter(arg.Argument), new GraphQLParameter(format, "[MediaFormat]") }; if (!e.Channel.IsNsfw) { filter += ", isAdult: $p2"; parameters.Add(new GraphQLParameter(false, "Boolean")); } media = await anilistClient.GetMediaAsync(filter, parameters.ToArray()); } if (media != null) { string description = media.Description; if (description.Length > 1024) { description = new string(description.Take(1020).ToArray()); description = new string(description.Take(description.LastIndexOf(' ')).ToArray()) + "..."; } EmbedBuilder embed = Utils.Embed.SetAuthor(media.DefaultTitle, "https://anilist.co/img/logo_al.png", media.Url) .SetDescription(media.NativeTitle); if (!manga) { embed.AddInlineField("Status", media.Status ?? "Unknown") .AddInlineField("Episodes", media.Episodes ?? 0); } else { embed.AddInlineField("Volumes", media.Volumes ?? 0) .AddInlineField("Chapters", media.Chapters ?? 0); } embed.AddInlineField("Rating", $"{media.Score ?? 0}/100") .AddInlineField("Genres", string.Join("\n", media.Genres) ?? "None") .AddInlineField("Description", description ?? "None") .SetColor(0, 170, 255) .SetThumbnail(media.CoverImage) .SetFooter("Powered by anilist.co", "") .ToEmbed().QueueToChannel(e.Channel); } else { e.ErrorEmbed("Anime not found!") .ToEmbed().QueueToChannel(e.Channel); } }
public async Task SetGuildConfig(EventContext e) { using (MikiContext context = new MikiContext()) { GuildUser g = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong()); ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { // TODO: error message return; } switch (arg.Argument) { case "expneeded": { arg = arg.Next(); if (arg != null) { if (int.TryParse(arg.Argument, out int value)) { g.MinimalExperienceToGetRewards = value; Utils.Embed .WithTitle(e.GetResource("miki_terms_config")) .WithDescription(e.GetResource("guildconfig_expneeded", value)) .Build().QueueToChannel(e.Channel); } } } break; case "visible": { arg = arg.Next(); if (arg != null) { bool?result = arg.AsBoolean(); if (!result.HasValue) { return; } g.VisibleOnLeaderboards = result.Value; string resourceString = g.VisibleOnLeaderboards ? "guildconfig_visibility_true" : "guildconfig_visibility_false"; Utils.Embed .WithTitle(e.GetResource("miki_terms_config")) .WithDescription(resourceString) .Build().QueueToChannel(e.Channel); } } break; } await context.SaveChangesAsync(); } }
public async Task SetCommandAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { return; } string commandId = arg.Argument; Event command = e.EventSystem.GetCommandHandler <SimpleCommandHandler>().Commands .FirstOrDefault(x => x.Name == commandId); if (command == null) { e.ErrorEmbed($"{commandId} is not a valid command") .ToEmbed().QueueToChannel(e.Channel); return; } if (!command.CanBeDisabled) { e.ErrorEmbed(e.Locale.GetString("miki_admin_cannot_disable", $"`{commandId}`")) .ToEmbed().QueueToChannel(e.Channel); return; } arg = arg.Next(); if (arg == null) { return; } bool setValue = arg.Argument == "1" || arg.Argument.ToLower().StartsWith("y"); string localeState = (setValue) ? e.Locale.GetString("miki_generic_enabled") : e.Locale.GetString("miki_generic_disabled"); arg = arg?.Next(); bool global = false; using (var context = new MikiContext()) { if (arg?.Argument == "-g") { global = true; var channels = await e.Guild.GetChannelsAsync(); foreach (var c in channels) { await command.SetEnabled(context, Global.RedisClient, c.Id, setValue); } } else { await command.SetEnabled(context, Global.RedisClient, e.Channel.Id, setValue); } await context.SaveChangesAsync(); } string outputDesc = localeState + " " + commandId; if (global) { outputDesc += " in every channel."; } else { outputDesc += "."; } Utils.SuccessEmbed(e, outputDesc) .QueueToChannel(e.Channel); }
public async Task LeaderboardsAsync(EventContext e) { LeaderboardsOptions options = new LeaderboardsOptions(); Args args = new Args(e.arguments); ArgObject argument = args.Get(0); switch (argument?.Argument.ToLower() ?? "") { case "commands": case "cmds": { options.type = LeaderboardsType.COMMANDS; argument = argument?.Next(); } break; case "currency": case "mekos": case "money": case "bal": { options.type = LeaderboardsType.CURRENCY; argument = argument?.Next(); } break; case "rep": case "reputation": { options.type = LeaderboardsType.REPUTATION; argument = argument?.Next(); } break; case "pasta": case "pastas": { options.type = LeaderboardsType.PASTA; argument = argument?.Next(); } break; case "experience": case "exp": { options.type = LeaderboardsType.EXPERIENCE; argument = argument?.Next(); } break; default: { options.type = LeaderboardsType.EXPERIENCE; } break; } if (argument?.Argument.ToLower() == "local") { if (options.type != LeaderboardsType.PASTA) { options.guildId = e.Guild.Id; } argument = argument.Next(); } // Null-conditional operators do not apply on async methods. if (argument != null) { IDiscordUser user = (await argument.GetUserAsync(e.Guild)); if (user != null) { options.mentionedUserId = user.Id; argument = argument.Next(); } } if ((argument?.AsInt(0) ?? 0) != 0) { options.pageNumber = argument.AsInt(); argument = argument?.Next(); } await ShowLeaderboardsAsync(e.message, options); }
public async Task LeaderboardsAsync(EventContext e) { LeaderboardsOptions options = new LeaderboardsOptions(); ArgObject argument = e.Arguments.FirstOrDefault(); switch (argument?.Argument.ToLower() ?? "") { case "commands": case "cmds": { options.type = LeaderboardsType.COMMANDS; argument = argument?.Next(); } break; case "currency": case "mekos": case "money": case "bal": { options.type = LeaderboardsType.CURRENCY; argument = argument?.Next(); } break; case "rep": case "reputation": { options.type = LeaderboardsType.REPUTATION; argument = argument?.Next(); } break; case "pasta": case "pastas": { options.type = LeaderboardsType.PASTA; argument = argument?.Next(); } break; case "experience": case "exp": { options.type = LeaderboardsType.EXPERIENCE; argument = argument?.Next(); } break; case "guild": case "guilds": { options.type = LeaderboardsType.GUILDS; argument = argument?.Next(); } break; default: { options.type = LeaderboardsType.EXPERIENCE; } break; } if (argument?.Argument.ToLower() == "local") { if (options.type != LeaderboardsType.PASTA) { options.guildId = e.Guild.Id; } argument = argument.Next(); } if (argument != null) { IDiscordUser user = await argument.GetUserAsync(e.Guild); if (user != null) { options.mentionedUserId = user.Id; argument = argument.Next(); } } if ((argument?.AsInt() ?? 0) != 0) { options.pageNumber = argument.AsInt().Value - 1; argument = argument?.Next(); } using (var context = new MikiContext()) { int p = Math.Max(options.pageNumber - 1, 0); LeaderboardsObject obj = await Global.MikiApi.GetPagedLeaderboardsAsync(options); Utils.RenderLeaderboards(Utils.Embed, obj.items, obj.currentPage * 10) .SetFooter(Locale.GetString(e.Channel.Id, "page_index", obj.currentPage + 1, Math.Ceiling((double)obj.totalItems / 10)), "") .SetAuthor( "Leaderboards: " + options.type + " (click me!)", null, Global.MikiApi.BuildLeaderboardsUrl(options) ) .ToEmbed().QueueToChannel(e.Channel); } }
public async Task GiveMekosAsync(EventContext e) { if (e.Arguments.Count < 2) { e.ErrorEmbedResource("give_error_no_arg") .ToEmbed().QueueToChannel(e.Channel); return; } ArgObject arg = e.Arguments.FirstOrDefault(); IDiscordUser user = null; if (arg != null) { user = await arg.GetUserAsync(e.Guild); } if (user == null) { e.ErrorEmbedResource("give_error_no_mention") .ToEmbed().QueueToChannel(e.Channel); return; } arg = arg.Next(); int?amount = arg?.AsInt() ?? null; if (amount == null) { e.ErrorEmbedResource("give_error_amount_unparsable") .ToEmbed().QueueToChannel(e.Channel); return; } if (amount <= 0) { e.ErrorEmbedResource("give_error_min_mekos") .ToEmbed().QueueToChannel(e.Channel); return; } using (MikiContext context = new MikiContext()) { User sender = await User.GetAsync(context, e.Author); User receiver = await User.GetAsync(context, user); if (amount.Value <= sender.Currency) { await sender.AddCurrencyAsync(-amount.Value, e.Channel, sender); await receiver.AddCurrencyAsync(amount.Value, e.Channel, sender); new EmbedBuilder() { Title = "🔸 transaction", Description = e.GetResource("give_description", sender.Name, receiver.Name, amount.Value), Color = new Color(255, 140, 0), }.ToEmbed().QueueToChannel(e.Channel); await context.SaveChangesAsync(); } else { e.ErrorEmbedResource("user_error_insufficient_mekos") .ToEmbed().QueueToChannel(e.Channel); } } }
public async Task SetGuildConfig(EventContext e) { using (MikiContext context = new MikiContext()) { GuildUser g = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong()); ArgObject arg = e.Arguments.FirstOrDefault(); if (arg != null) { switch (arg.Argument) { case "expneeded": { arg = arg.Next(); if (arg != null) { if (int.TryParse(arg.Argument, out int value)) { g.MinimalExperienceToGetRewards = value; new EmbedBuilder() .SetTitle(e.Locale.GetString("miki_terms_config")) .SetDescription(e.Locale.GetString("guildconfig_expneeded", value)) .ToEmbed().QueueToChannel(e.Channel); } } } break; case "visible": { arg = arg.Next(); if (arg != null) { bool?result = arg.TakeBoolean(); if (!result.HasValue) { return; } string resourceString = result.Value ? "guildconfig_visibility_true" : "guildconfig_visibility_false"; new EmbedBuilder() .SetTitle(e.Locale.GetString("miki_terms_config")) .SetDescription(resourceString) .ToEmbed().QueueToChannel(e.Channel); } } break; } await context.SaveChangesAsync(); } else { new EmbedBuilder() { Title = e.Locale.GetString("guild_settings"), Description = e.Locale.GetString("miki_command_description_guildconfig") }.ToEmbed().QueueToChannel(e.Channel); } } }
public async Task HelpAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg != null) { CommandEvent ev = e.EventSystem.GetCommandHandler <SimpleCommandHandler>().Commands.FirstOrDefault(x => x.Name.ToLower() == arg.Argument.ToString().ToLower()); if (ev == null) { EmbedBuilder helpListEmbed = Utils.Embed; helpListEmbed.Title = e.Locale.GetString("miki_module_help_error_null_header"); helpListEmbed.Description = e.Locale.GetString("miki_module_help_error_null_message", await e.EventSystem.GetCommandHandler <SimpleCommandHandler>().GetPrefixAsync(e.Guild.Id)); helpListEmbed.Color = new Color(0.6f, 0.6f, 1.0f); API.StringComparison.StringComparer comparer = new API.StringComparison.StringComparer(e.EventSystem.GetCommandHandler <SimpleCommandHandler>().Commands.Select(x => x.Name)); API.StringComparison.StringComparison best = comparer.GetBest(arg.Argument); helpListEmbed.AddField(e.Locale.GetString("miki_module_help_didyoumean"), best.text); helpListEmbed.ToEmbed() .QueueToChannel(e.Channel); } else { if (await e.EventSystem.GetCommandHandler <SimpleCommandHandler>().GetUserAccessibility(e.message, e.Channel) < ev.Accessibility) { return; } EmbedBuilder explainedHelpEmbed = new EmbedBuilder() .SetTitle(ev.Name.ToUpper()); if (ev.Aliases.Length > 0) { explainedHelpEmbed.AddInlineField( e.Locale.GetString("miki_module_general_help_aliases"), string.Join(", ", ev.Aliases)); } explainedHelpEmbed.AddField ( e.Locale.GetString("miki_module_general_help_description"), e.Locale.HasString("miki_command_description_" + ev.Name.ToLower()) ? e.Locale.GetString("miki_command_description_" + ev.Name.ToLower()) : e.Locale.GetString("miki_placeholder_null")); explainedHelpEmbed.AddField( e.Locale.GetString("miki_module_general_help_usage"), e.Locale.HasString("miki_command_usage_" + ev.Name.ToLower()) ? e.Locale.GetString("miki_command_usage_" + ev.Name.ToLower()) : e.Locale.GetString("miki_placeholder_null")); explainedHelpEmbed.ToEmbed().QueueToChannel(e.Channel); } return; } new EmbedBuilder() { Description = e.Locale.GetString("miki_module_general_help_dm"), Color = new Color(0.6f, 0.6f, 1.0f) }.ToEmbed().QueueToChannel(e.Channel); EmbedBuilder embedBuilder = new EmbedBuilder(); foreach (Module m in e.EventSystem.GetCommandHandler <SimpleCommandHandler>().Modules.OrderBy(x => x.Name)) { List <CommandEvent> events = m.Events .Where(x => e.EventSystem.GetCommandHandler <SimpleCommandHandler>().GetUserAccessibility(e.message, e.Channel).Result >= x.Accessibility).ToList(); if (events.Count > 0) { embedBuilder.AddField(m.Name.ToUpper(), string.Join(", ", events.Select(x => "`" + x.Name + "`"))); } } embedBuilder.ToEmbed().QueueToChannel(await e.Author.GetDMChannelAsync()); }
public async Task GiveReputationAsync(EventContext e) { using (var context = new MikiContext()) { User giver = await context.Users.FindAsync(e.Author.Id.ToDbLong()); var repObject = Global.RedisClient.Get <ReputationObject>($"user:{giver.Id}:rep"); if (repObject == null) { repObject = new ReputationObject() { LastReputationGiven = DateTime.Now, ReputationPointsLeft = 3 }; await Global.RedisClient.AddAsync($"user:{giver.Id}:rep", repObject, new DateTimeOffset(DateTime.UtcNow.AddDays(1).Date)); } ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { TimeSpan pointReset = (DateTime.Now.AddDays(1).Date - DateTime.Now); new EmbedBuilder() { Title = (e.GetResource("miki_module_accounts_rep_header")), Description = (e.GetResource("miki_module_accounts_rep_description")) }.AddInlineField(e.GetResource("miki_module_accounts_rep_total_received"), giver.Reputation.ToString()) .AddInlineField(e.GetResource("miki_module_accounts_rep_reset"), pointReset.ToTimeString(e.Channel.Id)) .AddInlineField(e.GetResource("miki_module_accounts_rep_remaining"), repObject.ReputationPointsLeft) .ToEmbed().QueueToChannel(e.Channel); return; } else { Dictionary <IDiscordUser, int> usersMentioned = new Dictionary <IDiscordUser, int>(); EmbedBuilder embed = new EmbedBuilder(); int totalAmountGiven = 0; bool mentionedSelf = false; while (true || totalAmountGiven <= repObject.ReputationPointsLeft) { if (arg == null) { break; } IDiscordUser u = await arg.GetUserAsync(e.Guild); int amount = 1; if (u == null) { break; } arg = arg?.Next(); if ((arg?.AsInt() ?? -1) != -1) { amount = arg.AsInt().Value; arg = arg.Next(); } else if (Utils.IsAll(arg)) { amount = repObject.ReputationPointsLeft; arg = arg.Next(); } if (u.Id == e.Author.Id) { mentionedSelf = true; continue; } totalAmountGiven += amount; if (usersMentioned.Keys.Where(x => x.Id == u.Id).Count() > 0) { usersMentioned[usersMentioned.Keys.Where(x => x.Id == u.Id).First()] += amount; } else { usersMentioned.Add(u, amount); } } if (mentionedSelf) { embed.Footer = new EmbedFooter() { Text = e.GetResource("warning_mention_self"), }; } if (usersMentioned.Count == 0) { return; } else { if (totalAmountGiven <= 0) { e.ErrorEmbedResource("miki_module_accounts_rep_error_zero") .ToEmbed().QueueToChannel(e.Channel); return; } if (usersMentioned.Sum(x => x.Value) > repObject.ReputationPointsLeft) { e.ErrorEmbedResource("error_rep_limit", usersMentioned.Count, usersMentioned.Sum(x => x.Value), repObject.ReputationPointsLeft) .ToEmbed().QueueToChannel(e.Channel); return; } } embed.Title = (e.GetResource("miki_module_accounts_rep_header")); embed.Description = (e.GetResource("rep_success")); foreach (var user in usersMentioned) { User receiver = await User.GetAsync(context, user.Key); receiver.Reputation += user.Value; embed.AddInlineField(receiver.Name, string.Format("{0} => {1} (+{2})", receiver.Reputation - user.Value, receiver.Reputation, user.Value)); } repObject.ReputationPointsLeft -= (short)(usersMentioned.Sum(x => x.Value)); await Global.RedisClient.AddAsync($"user:{giver.Id}:rep", repObject, new DateTimeOffset(DateTime.UtcNow.AddDays(1).Date)); embed.AddInlineField(e.GetResource("miki_module_accounts_rep_points_left"), repObject.ReputationPointsLeft) .ToEmbed().QueueToChannel(e.Channel); await context.SaveChangesAsync(); } } }
public async Task <int?> ValidateBetAsync(EventContext e, ArgObject arg, int maxBet = 1000000) { if (arg != null) { const int noAskLimit = 10000; using (MikiContext context = new MikiContext()) { User user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (user == null) { // TODO: add user null error return(null); } string checkArg = arg?.Argument; if (int.TryParse(checkArg, out int bet)) { } else if (checkArg.ToLower() == "all" || checkArg == "*") { bet = user.Currency > maxBet ? maxBet : user.Currency; } else { e.ErrorEmbed(e.GetResource("miki_error_gambling_parse_error")) .ToEmbed().QueueToChannel(e.Channel); return(null); } if (bet < 1) { e.ErrorEmbed(e.GetResource("miki_error_gambling_zero_or_less")) .ToEmbed().QueueToChannel(e.Channel); return(null); } else if (bet > user.Currency) { e.ErrorEmbed(e.GetResource("miki_mekos_insufficient")) .ToEmbed().QueueToChannel(e.Channel); return(null); } else if (bet > maxBet) { e.ErrorEmbed($"you cannot bet more than {maxBet} mekos!") .ToEmbed().QueueToChannel(e.Channel); return(null); } else if (bet > noAskLimit) { arg = arg?.Next(); if (arg?.Argument.ToLower() == "ok") { return(bet); } else { EmbedBuilder embed = Utils.Embed; embed.Description = $"Are you sure you want to bet **{bet}**? You currently have `{user.Currency}` mekos.\n\nAppend your command with `>my_command ... <bet> ok` to confirm."; embed.Color = new Color(0.4f, 0.6f, 1f); embed.ToEmbed().QueueToChannel(e.Channel); return(null); } } else { return(bet); } } } else { e.ErrorEmbed(e.GetResource("miki_error_gambling_no_arg")) .ToEmbed().QueueToChannel(e.Channel); return(null); } }
public async Task KickAsync(EventContext e) { IDiscordGuildUser currentUser = await e.Guild.GetSelfAsync(); ArgObject arg = e.Arguments.FirstOrDefault(); if ((await(e.Channel as IDiscordGuildChannel).GetPermissionsAsync(currentUser)).HasFlag(GuildPermission.KickMembers)) { IDiscordGuildUser bannedUser = null; bannedUser = await arg?.GetUserAsync(e.Guild) ?? null; if (bannedUser == null) { e.ErrorEmbed(e.GetResource("ban_error_user_null")) .ToEmbed().QueueToChannel(e.Channel); return; } if ((bannedUser as IDiscordGuildUser).Hierarchy >= (e.Author as IDiscordGuildUser).Hierarchy) { e.ErrorEmbed(e.GetResource("permission_error_low", "kick")).ToEmbed() .QueueToChannel(e.Channel); return; } if ((bannedUser as IDiscordGuildUser).Hierarchy >= (currentUser as IDiscordGuildUser).Hierarchy) { e.ErrorEmbed(e.GetResource("permission_error_low", "kick")).ToEmbed() .QueueToChannel(e.Channel); return; } string reason = ""; if (!arg.IsLast) { arg = arg.Next(); reason = arg.TakeUntilEnd().Argument; } EmbedBuilder embed = new EmbedBuilder(); embed.Title = e.GetResource("miki_module_admin_kick_header"); embed.Description = e.GetResource("miki_module_admin_kick_description", new object[] { e.Guild.Name }); if (!string.IsNullOrWhiteSpace(reason)) { embed.AddField(e.GetResource("miki_module_admin_kick_reason"), reason, true); } embed.AddField(e.GetResource("miki_module_admin_kick_by"), e.Author.Username + "#" + e.Author.Discriminator, true); embed.Color = new Color(1, 1, 0); await embed.ToEmbed().SendToUser(bannedUser); await bannedUser.KickAsync(reason); } else { e.ErrorEmbed(e.GetResource("permission_needed_error", $"`{e.GetResource("permission_kick_members")}`")) .ToEmbed().QueueToChannel(e.Channel); } }
public async Task LotteryAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { long totalTickets = await(Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).ListLengthAsync(lotteryKey); long yourTickets = 0; string latestWinner = (Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).StringGet("lottery:winner"); if (await lotteryDict.ContainsAsync(e.Author.Id)) { yourTickets = long.Parse(await lotteryDict.GetAsync(e.Author.Id)); } string timeLeft = taskScheduler?.GetInstance(0, lotteryId).TimeLeft.ToTimeString(e.Channel.Id, true) ?? "1h?m?s - will be fixed soon!"; new EmbedBuilder() { Title = "🍀 Lottery", Description = "Make the biggest gamble, and get paid off massively if legit.", Color = new Color(119, 178, 85) }.AddInlineField("Tickets Owned", yourTickets) .AddInlineField("Drawing In", timeLeft) .AddInlineField("Total Tickets", totalTickets) .AddInlineField("Ticket price", $"{100} mekos") .AddInlineField("Latest Winner", latestWinner ?? "no name") .AddInlineField("How to buy?", ">lottery buy [amount]") .ToEmbed().QueueToChannel(e.Channel); return; } switch (arg.Argument.ToLower()) { case "buy": { arg = arg.Next(); int amount = arg?.AsInt() ?? 1; if (amount < 1) { amount = 1; } using (var context = new MikiContext()) { User u = await User.GetAsync(context, e.Author); if (amount * 100 > u.Currency) { e.ErrorEmbedResource("miki_mekos_insufficient") .ToEmbed().QueueToChannel(e.Channel); return; } await u.AddCurrencyAsync(-amount * 100, e.Channel); RedisValue[] tickets = new RedisValue[amount]; for (int i = 0; i < amount; i++) { tickets[i] = e.Author.Id.ToString(); } await(Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).ListRightPushAsync(lotteryKey, tickets); int totalTickets = 0; if (await lotteryDict.ContainsAsync(e.Author.Id.ToString())) { totalTickets = int.Parse(await lotteryDict.GetAsync(e.Author.Id.ToString())); } await lotteryDict.AddAsync(e.Author.Id, amount + totalTickets); await context.SaveChangesAsync(); Utils.SuccessEmbed(e.Channel.Id, $"Successfully bought {amount} tickets!") .QueueToChannel(e.Channel); } } break; } }