Esempio n. 1
0
        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:");
            }
        }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
        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);
                }
            }
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        //[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);
            }
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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();
                }
            }
        }
Esempio n. 8
0
        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:");
            }
        }
Esempio n. 9
0
        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);
                }
            }
        }
Esempio n. 10
0
        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();
                }
            }
        }
Esempio n. 11
0
        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);
                }
            }
        }
Esempio n. 12
0
        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);
            }
        }