public async Task SetExp(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); IDiscordUser user = await arg.GetUserAsync(e.Guild); arg = arg.Next(); int amount = arg?.TakeInt() ?? 0; using (var context = new MikiContext()) { LocalExperience u = await LocalExperience.GetAsync(context, e.Guild.Id.ToDbLong(), user.Id.ToDbLong(), user.Username); if (u == null) { return; } u.Experience = amount; await context.SaveChangesAsync(); await Global.RedisClient.UpsertAsync($"user:{e.Guild.Id}:{e.Author.Id}:exp", u.Experience); e.Channel.QueueMessageAsync(":ok_hand:"); } }
public async Task DeclineMarriageAsync(EventContext e) { using (MikiContext context = new MikiContext()) { MarriageRepository repository = new MarriageRepository(context); ArgObject selection = e.Arguments.FirstOrDefault(); int? selectionId = null; if (selection != null) { selectionId = selection.TakeInt(); } var marriages = await repository.GetProposalsReceived(e.Author.Id.ToDbLong()); if (marriages.Count == 0) { // TODO: add no propsoals //throw new LocalizedException("error_proposals_empty"); return; } marriages = marriages.OrderByDescending(x => x.Marriage.TimeOfMarriage).ToList(); if (selectionId != null) { var m = marriages[selectionId.Value - 1]; string otherName = (await Global.Client.Discord.GetUserAsync(m.GetOther(e.Author.Id.ToDbLong()).FromDbLong())).Username; new EmbedBuilder() { Title = $"🔫 You shot down {otherName}!", Description = $"Aww, don't worry {otherName}. There is plenty of fish in the sea!", Color = new Color(191, 105, 82) }.ToEmbed().QueueToChannel(e.Channel); m.Remove(context); await context.SaveChangesAsync(); } else { var embed = new EmbedBuilder() { Title = "💍 Proposals", Footer = new EmbedFooter() { Text = $"Use {await e.Prefix.GetForGuildAsync(Global.RedisClient, e.Guild.Id)}declinemarriage <number> to decline", }, Color = new Color(154, 170, 180) }; await BuildMarriageEmbedAsync(embed, e.Author.Id.ToDbLong(), context, marriages); embed.ToEmbed().QueueToChannel(e.Channel); } } }
public async Task DivorceAsync(EventContext e) { using (MikiContext context = new MikiContext()) { MarriageRepository repository = new MarriageRepository(context); ArgObject selection = e.Arguments.FirstOrDefault(); int? selectionId = null; if (selection != null) { selectionId = selection.TakeInt(); } var marriages = await repository.GetMarriagesAsync((long)e.Author.Id); if (marriages.Count == 0) { // TODO: no proposals exception //throw BotException.CreateCustom("error_proposals_empty"); return; } marriages = marriages.OrderByDescending(x => x.Marriage.TimeOfMarriage).ToList(); if (selectionId != null) { var m = marriages[selectionId.Value - 1]; var otherUser = await Global.Client.Discord.GetUserAsync(m.GetOther(e.Author.Id.ToDbLong()).FromDbLong()); new EmbedBuilder { Title = $"🔔 {e.Locale.GetString("miki_module_accounts_divorce_header")}", Description = e.Locale.GetString("miki_module_accounts_divorce_content", e.Author.Username, otherUser.Username), Color = new Color(0.6f, 0.4f, 0.1f) }.ToEmbed().QueueToChannel(e.Channel); m.Remove(context); await context.SaveChangesAsync(); } else { var embed = new EmbedBuilder() { Title = "💍 Marriages", Footer = new EmbedFooter() { Text = $"Use {await e.Prefix.GetForGuildAsync(Global.RedisClient, e.Guild.Id)}divorce <number> to decline", }, Color = new Color(154, 170, 180) }; await BuildMarriageEmbedAsync(embed, e.Author.Id.ToDbLong(), context, marriages); embed.ToEmbed().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); } }
//[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); } }
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 SetMekos(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); IDiscordUser user = await arg.GetUserAsync(e.Guild); arg = arg.Next(); int amount = arg?.TakeInt() ?? 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 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?.TakeInt() ?? null; if (amount == null) { e.ErrorEmbedResource("give_error_amount_unparsable") .ToEmbed().QueueToChannel(e.Channel); return; } using (MikiContext context = new MikiContext()) { User sender = await DatabaseHelpers.GetUserAsync(context, e.Author); User receiver = await DatabaseHelpers.GetUserAsync(context, user); if (amount.Value <= sender.Currency) { sender.RemoveCurrency(amount.Value); await receiver.AddCurrencyAsync(amount.Value); new EmbedBuilder() { Title = "🔸 transaction", Description = e.Locale.GetString("give_description", sender.Name, receiver.Name, amount.Value.ToFormattedString()), 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 GiveReputationAsync(EventContext e) { using (var context = new MikiContext()) { User giver = await context.Users.FindAsync(e.Author.Id.ToDbLong()); var repObject = await Global.RedisClient.GetAsync <ReputationObject>($"user:{giver.Id}:rep"); if (repObject == null) { repObject = new ReputationObject() { LastReputationGiven = DateTime.Now, ReputationPointsLeft = 3 }; await Global.RedisClient.UpsertAsync( $"user:{giver.Id}:rep", repObject, DateTime.UtcNow.AddDays(1).Date - DateTime.UtcNow ); } ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { TimeSpan pointReset = (DateTime.Now.AddDays(1).Date - DateTime.Now); new EmbedBuilder() { Title = e.Locale.GetString("miki_module_accounts_rep_header"), Description = e.Locale.GetString("miki_module_accounts_rep_description") }.AddInlineField(e.Locale.GetString("miki_module_accounts_rep_total_received"), giver.Reputation.ToFormattedString()) .AddInlineField(e.Locale.GetString("miki_module_accounts_rep_reset"), pointReset.ToTimeString(e.Locale).ToString()) .AddInlineField(e.Locale.GetString("miki_module_accounts_rep_remaining"), repObject.ReputationPointsLeft.ToString()) .ToEmbed().QueueToChannel(e.Channel); return; } else { Dictionary <IDiscordUser, short> usersMentioned = new Dictionary <IDiscordUser, short>(); 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); short amount = 1; if (u == null) { break; } arg = arg?.Next(); if ((arg?.TakeInt() ?? -1) != -1) { amount = (short)arg.TakeInt().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.Locale.GetString("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.Locale.GetString("miki_module_accounts_rep_header")); embed.Description = (e.Locale.GetString("rep_success")); foreach (var user in usersMentioned) { User receiver = await DatabaseHelpers.GetUserAsync(context, user.Key); receiver.Reputation += user.Value; embed.AddInlineField( receiver.Name, string.Format("{0} => {1} (+{2})", (receiver.Reputation - user.Value).ToFormattedString(), receiver.Reputation.ToFormattedString(), user.Value) ); } repObject.ReputationPointsLeft -= (short)usersMentioned.Sum(x => x.Value); await Global.RedisClient.UpsertAsync( $"user:{giver.Id}:rep", repObject, DateTime.UtcNow.AddDays(1).Date - DateTime.UtcNow ); embed.AddInlineField(e.Locale.GetString("miki_module_accounts_rep_points_left"), repObject.ReputationPointsLeft.ToString()) .ToEmbed().QueueToChannel(e.Channel); await context.SaveChangesAsync(); } } }
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.TakeInt(); 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 = new EmbedBuilder() .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).ToString()); } else { embed.AddInlineField("Volumes", (media.Volumes ?? 0).ToString()) .AddInlineField("Chapters", (media.Chapters ?? 0).ToString()); } 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); } }