示例#1
0
        //[Command(Name = "mybadges")]
        //public async Task MyBadgesAsync(EventContext e)
        //{
        //	int page = 0;
        //	using (var context = new MikiContext())
        //	{
        //		User u = await context.Users.FindAsync(e.Author.Id.ToDbLong());

        //		string output = string.Join<long>(" ", u.BadgesOwned.Select(x => x.Id).ToList());

        //		await e.Channel.SendMessage(output.DefaultIfEmpty("none, yet!"));
        //	}
        //}

        public async Task ShowLeaderboardsAsync(IDiscordMessage mContext, LeaderboardsOptions leaderboardOptions)
        {
            using (var context = new MikiContext())
            {
                Locale locale = Locale.GetEntity(mContext.Channel.Id.ToDbLong());

                int p = Math.Max(leaderboardOptions.pageNumber - 1, 0);

                IDiscordEmbed embed = Utils.Embed
                                      .SetColor(1.0f, 0.6f, 0.4f);

                switch (leaderboardOptions.type)
                {
                case LeaderboardsType.COMMANDS:
                {
                    embed.Title = locale.GetString("miki_module_accounts_leaderboards_commands_header");
                    if (leaderboardOptions.mentionedUserId != 0)
                    {
                        long mentionedId = leaderboardOptions.mentionedUserId.ToDbLong();

                        var mentionedUser = await context.Users.FindAsync(mentionedId);

                        p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalCommandsRankAsync()) - 1) / 12));
                    }
                    List <User> output = await context.Users
                                         .OrderByDescending(x => x.Total_Commands)
                                         .Skip(12 * p)
                                         .Take(12)
                                         .ToListAsync();

                    for (int i = 0; i < output.Count; i++)
                    {
                        string nameToOutput = leaderboardOptions.mentionedUserId != 0 ? string.Join("", output[i].Name.Take(16)) : "~" + string.Join("", output[i].Name.Take(16)) + "~";
                        embed.AddInlineField($"#{i + (12 * p) + 1}: {nameToOutput}", $"{output[i].Total_Commands} commands used!");
                    }
                }
                break;

                case LeaderboardsType.CURRENCY:
                {
                    embed.Title = locale.GetString("miki_module_accounts_leaderboards_mekos_header");
                    if (leaderboardOptions.mentionedUserId != 0)
                    {
                        long mentionedId   = leaderboardOptions.mentionedUserId.ToDbLong();
                        var  mentionedUser = await context.Users.FindAsync(mentionedId);

                        p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalMekosRankAsync()) - 1) / 12));
                    }
                    List <User> output = await context.Users
                                         .OrderByDescending(x => x.Currency)
                                         .Skip(12 * p)
                                         .Take(12)
                                         .ToListAsync();

                    for (int i = 0; i < output.Count; i++)
                    {
                        embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}",
                                             $"{output[i].Currency} mekos!");
                    }
                }
                break;

                case LeaderboardsType.EXP:
                {
                    embed.Title = locale.GetString("miki_module_accounts_leaderboards_header");
                    if (leaderboardOptions.mentionedUserId != 0)
                    {
                        long mentionedId   = leaderboardOptions.mentionedUserId.ToDbLong();
                        var  mentionedUser = await context.Users.FindAsync(mentionedId);

                        p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalRankAsync()) - 1) / 12));
                    }
                    List <User> output = await context.Users
                                         .OrderByDescending(x => x.Total_Experience)
                                         .Skip(12 * p)
                                         .Take(12)
                                         .ToListAsync();

                    for (int i = 0; i < output.Count; i++)
                    {
                        embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}",
                                             $"{output[i].Total_Experience} experience!");
                    }
                }
                break;

                case LeaderboardsType.REPUTATION:
                {
                    embed.Title = locale.GetString("miki_module_accounts_leaderboards_reputation_header");
                    if (leaderboardOptions.mentionedUserId != 0)
                    {
                        long mentionedId   = leaderboardOptions.mentionedUserId.ToDbLong();
                        var  mentionedUser = await context.Users.FindAsync(mentionedId);

                        p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalReputationRankAsync()) - 1) / 12));
                    }
                    List <User> output = await context.Users
                                         .OrderByDescending(x => x.Reputation)
                                         .Skip(12 * p)
                                         .Take(12)
                                         .ToListAsync();

                    for (int i = 0; i < output.Count; i++)
                    {
                        embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}",
                                             $"{output[i].Reputation} reputation!");
                    }
                }
                break;

                case LeaderboardsType.PASTA:
                {
                    List <GlobalPasta> leaderboards = await context.Pastas
                                                      .OrderByDescending(x => x.Score)
                                                      .Skip(12 * p)
                                                      .Take(12)
                                                      .ToListAsync();

                    embed.SetTitle(locale.GetString("toppasta_title"));

                    foreach (GlobalPasta t in leaderboards)
                    {
                        int amount = t.Score;
                        embed.AddInlineField(t.Id, (t == leaderboards.First() ? "💖 " + amount : (amount < 0 ? "💔 " : "� ") + amount));
                    }
                }
                break;
                }

                await embed
                .SetFooter(locale.GetString("page_index", p + 1, Math.Ceiling(context.Users.Count() / 12f)), "")
                .QueueToChannel(mContext.Channel);
            }
        }
示例#2
0
        public async Task RedeemKeyAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                long       id   = (long)e.Author.Id;
                Guid       guid = Guid.Parse(e.Arguments.Join().Argument);
                DonatorKey key  = await context.DonatorKey.FindAsync(guid);

                IsDonator donatorStatus = await context.IsDonator.FindAsync(id);

                if (key != null)
                {
                    if (donatorStatus == null)
                    {
                        donatorStatus = (await context.IsDonator.AddAsync(new IsDonator()
                        {
                            UserId = id
                        })).Entity;
                    }

                    donatorStatus.KeysRedeemed++;

                    if (donatorStatus.ValidUntil > DateTime.Now)
                    {
                        donatorStatus.ValidUntil += key.StatusTime;
                    }
                    else
                    {
                        donatorStatus.ValidUntil = DateTime.Now + key.StatusTime;
                    }

                    new EmbedBuilder()
                    {
                        Title        = ($"🎉 Congratulations, {e.Author.Username}"),
                        Color        = new Color(226, 46, 68),
                        Description  = ($"You have successfully redeemed a donator key, I've given you **{key.StatusTime.TotalDays}** days of donator status."),
                        ThumbnailUrl = ("https://i.imgur.com/OwwA5fV.png")
                    }.AddInlineField("When does my status expire?", donatorStatus.ValidUntil.ToLongDateString())
                    .ToEmbed().QueueToChannel(e.Channel);

                    context.DonatorKey.Remove(key);
                    await context.SaveChangesAsync();

                    // cheap hack.

                    var achievements = AchievementManager.Instance.GetContainerById("donator");

                    if (donatorStatus.KeysRedeemed == 1)
                    {
                        await achievements.Achievements[0].UnlockAsync(e.Channel, e.Author, 0);
                    }
                    else if (donatorStatus.KeysRedeemed == 5)
                    {
                        await achievements.Achievements[1].UnlockAsync(e.Channel, e.Author, 1);
                    }
                    else if (donatorStatus.KeysRedeemed == 25)
                    {
                        await achievements.Achievements[2].UnlockAsync(e.Channel, e.Author, 2);
                    }
                }
                else
                {
                    e.ErrorEmbed("Your donation key is invalid!");
                }
            }
        }
示例#3
0
        public GamblingModule()
        {
            if (!Global.Config.IsMainBot)
            {
                lotteryId = taskScheduler.AddTask(0, (s) =>
                {
                    long size = Global.RedisClient.Database.ListLength(lotteryKey);

                    if (size == 0)
                    {
                        return;
                    }

                    string value = Global.RedisClient.Database.ListGetByIndex(lotteryKey, MikiRandom.Next(size));

                    ulong winnerId = ulong.Parse(value);
                    int wonAmount  = (int)Math.Round(size * 100 * 0.75);

                    IDiscordUser user = null;                     //Bot.Instance.Client.GetUser(winnerId);

                    using (var context = new MikiContext())
                    {
                        long id          = winnerId.ToDbLong();
                        User profileUser = context.Users.Find(id);

                        if (user != null)
                        {
                            IDiscordChannel channel = user.GetDMChannel().Result;

                            EmbedBuilder embed = new EmbedBuilder()
                            {
                                Author = new EmbedAuthor()
                                {
                                    Name    = "Winner winner chicken dinner",
                                    IconUrl = user.GetAvatarUrl()
                                },
                                Description = $"Wow! You won the lottery and gained {wonAmount} mekos!"
                            };

                            profileUser.AddCurrencyAsync(wonAmount, channel);

                            embed.ToEmbed().QueueToChannel(channel);

                            context.SaveChanges();

                            Global.RedisClient.Database.KeyDelete(lotteryKey);
                            Global.RedisClient.Database.StringSet("lottery:winner", profileUser.Name ?? "unknown");
                            lotteryDict.ClearAsync();

                            var lotteryAchievement = AchievementManager.Instance.GetContainerById("lottery");

                            if (wonAmount > 100000)
                            {
                                lotteryAchievement.Achievements[0].UnlockAsync(channel, user, 0);
                            }

                            if (wonAmount > 10000000)
                            {
                                lotteryAchievement.Achievements[1].UnlockAsync(channel, user, 1);
                            }

                            if (wonAmount > 250000000)
                            {
                                lotteryAchievement.Achievements[2].UnlockAsync(channel, user, 1);
                            }
                        }
                    }
                }, "", new TimeSpan(0, 1, 0, 0), true);
            }
        }
示例#4
0
        public async Task IAmAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                string roleName = e.Arguments.ToString();

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

                IDiscordRole role = null;

                // checking if the role has a duplicate name.
                if (roles.Count > 1)
                {
                    List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync();

                    if (levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).Count() > 1)
                    {
                        e.ErrorEmbed("two roles configured have the same name.")
                        .ToEmbed().QueueToChannel(e.Channel);
                        return;
                    }
                    else
                    {
                        role = levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).FirstOrDefault().GetRoleAsync().Result;
                    }
                }
                else
                {
                    role = roles.FirstOrDefault();
                }

                // checking if the role is null
                if (role == null)
                {
                    e.ErrorEmbedResource("error_role_null")
                    .ToEmbed().QueueToChannel(e.Channel);
                    return;
                }

                IDiscordGuildUser author = await e.Guild.GetMemberAsync(e.Author.Id);

                if (author.RoleIds.Contains(role.Id))
                {
                    e.ErrorEmbed(e.Locale.GetString("error_role_already_given"))
                    .ToEmbed().QueueToChannel(e.Channel);
                    return;
                }

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

                IDiscordRole discordRole = await newRole.GetRoleAsync();

                User user = (await context.Users.FindAsync(e.Author.Id.ToDbLong()));

                IDiscordGuildUser discordUser = await e.Guild.GetMemberAsync(user.Id.FromDbLong());

                LocalExperience localUser = await LocalExperience.GetAsync(context, e.Guild.Id.ToDbLong(), discordUser.Id.ToDbLong(), discordUser.Username);

                if (!newRole?.Optable ?? false)
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_forbidden"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                int level = User.CalculateLevel(localUser.Experience);

                if (newRole.RequiredLevel > level)
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_level_low", newRole.RequiredLevel - level))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                if (newRole.RequiredRole != 0 && !discordUser.RoleIds.Contains(newRole.RequiredRole.FromDbLong()))
                {
                    var requiredRole = await e.Guild.GetRoleAsync(newRole.RequiredRole.FromDbLong());

                    e.ErrorEmbed(
                        e.Locale.GetString(
                            "error_role_required", $"**{requiredRole.Name}**"
                            )
                        ).ToEmbed().QueueToChannel(e.Channel);
                    return;
                }

                if (newRole.Price > 0)
                {
                    if (user.Currency >= newRole.Price)
                    {
                        user.RemoveCurrency(newRole.Price);
                        await context.SaveChangesAsync();
                    }
                    else
                    {
                        await e.ErrorEmbed(e.Locale.GetString("user_error_insufficient_mekos"))
                        .ToEmbed().SendToChannel(e.Channel);

                        return;
                    }
                }

                var me = await e.Guild.GetSelfAsync();

                if (!await me.HasPermissionsAsync(GuildPermission.ManageRoles))
                {
                    e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannel(e.Channel);
                    return;
                }

                if (discordRole.Position >= await me.GetHierarchyAsync())
                {
                    e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannel(e.Channel);
                    return;
                }

                await author.AddRoleAsync(discordRole);

                new EmbedBuilder()
                .SetTitle("I AM")
                .SetColor(128, 255, 128)
                .SetDescription($"You're a(n) {role.Name} now!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
示例#5
0
        public async Task <List <EventMessageObject> > GetMessage(IDiscordGuild guild, EventMessageType type, IDiscordUser user)
        {
            long guildId = guild.Id.ToDbLong();

            var channels = await guild.GetTextChannelsAsync();

            var channelIds = channels.Select(x => x.Id.ToDbLong());

            var guildCount = (await guild.GetUsersAsync()).Count;

            IDiscordGuildUser owner = await guild.GetOwnerAsync();

            var ownerMention = owner.Mention;
            var ownerName    = owner.Username;

            List <EventMessageObject> output = new List <EventMessageObject>();

            using (var context = new MikiContext())
            {
                var messageObjects = await context.EventMessages
                                     .Where(x => channelIds.Contains(x.ChannelId) && (short)type == x.EventType)
                                     .ToListAsync();

                var allUsers = await guild.GetUsersAsync();

                foreach (var c in messageObjects)
                {
                    if (c == null)
                    {
                        continue;
                    }

                    if (string.IsNullOrEmpty(c.Message))
                    {
                        continue;
                    }

                    IDiscordGuild g = await(user as IDiscordGuildUser).GetGuildAsync();


                    string modifiedMessage = c.Message;

                    modifiedMessage = modifiedMessage.Replace("-um", user.Mention);
                    modifiedMessage = modifiedMessage.Replace("-uc",
                                                              (await g.GetUsersAsync()).Count().ToString());
                    modifiedMessage = modifiedMessage.Replace("-u", user.Username);

                    modifiedMessage = modifiedMessage.Replace("-ru", allUsers.ElementAt(MikiRandom.Next(0, allUsers.Count())).Username);

                    modifiedMessage = modifiedMessage.Replace("-now", DateTime.Now.ToShortDateString());
                    modifiedMessage = modifiedMessage.Replace("-sc", guildCount.ToString());
                    modifiedMessage = modifiedMessage.Replace("-s",
                                                              g.Name);


                    modifiedMessage = modifiedMessage.Replace("-om", ownerMention);
                    modifiedMessage = modifiedMessage.Replace("-o", ownerName);

                    modifiedMessage = modifiedMessage.Replace("-cc", (await g.GetChannelsAsync()).Count.ToString());
                    modifiedMessage = modifiedMessage.Replace("-vc", (await g.GetVoiceChannelsAsync()).Count().ToString());

                    output.Add(new EventMessageObject()
                    {
                        message            = modifiedMessage,
                        destinationChannel = channels.FirstOrDefault(x => x.Id.ToDbLong() == c.ChannelId)
                    });
                }
                return(output);
            }
        }
示例#6
0
        public async Task StartSlots(EventContext e, int bet)
        {
            using (var context = new MikiContext())
            {
                User u = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                Locale locale = Locale.GetEntity(e.Channel.Id.ToDbLong());

                int moneyReturned = 0;

                string[] objects =
                {
                    "🍒", "🍒", "🍒", "🍒",
                    "🍊", "🍊", "🍊",
                    "🍓", "🍓",
                    "🍍", "🍍",
                    "🍇", "🍇",
                    "🍉", "🍉",
                    "⭐", "⭐",
                    "🍉",
                    "🍍", "🍍",
                    "🍓", "🍓",
                    "🍊", "🍊", "🍊",
                    "🍒", "🍒", "🍒", "🍒",
                };

                IDiscordEmbed embed = Utils.Embed
                                      .SetAuthor(locale.GetString(Locale.SlotsHeader) + " | " + e.Author.Username, e.Author.AvatarUrl, "https://patreon.com/mikibot");

                string[] objectsChosen =
                {
                    objects[MikiRandom.Next(objects.Length)],
                    objects[MikiRandom.Next(objects.Length)],
                    objects[MikiRandom.Next(objects.Length)]
                };

                Dictionary <string, int> score = new Dictionary <string, int>();

                foreach (string o in objectsChosen)
                {
                    if (score.ContainsKey(o))
                    {
                        score[o]++;
                        continue;
                    }
                    score.Add(o, 1);
                }

                if (score.ContainsKey("🍒"))
                {
                    if (score["🍒"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 0.5f);
                    }
                    else if (score["🍒"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1f);
                    }
                }
                if (score.ContainsKey("🍊"))
                {
                    if (score["🍊"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 0.8f);
                    }
                    else if (score["🍊"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1.5f);
                    }
                }
                if (score.ContainsKey("🍓"))
                {
                    if (score["🍓"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1f);
                    }
                    else if (score["🍓"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 2f);
                    }
                }
                if (score.ContainsKey("🍍"))
                {
                    if (score["🍍"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1f);
                    }
                    if (score["🍍"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 4f);
                    }
                }
                if (score.ContainsKey("🍇"))
                {
                    if (score["🍇"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1.2f);
                    }
                    if (score["🍇"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 6f);
                    }
                }
                if (score.ContainsKey("🍉"))
                {
                    if (score["🍉"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1.5f);
                    }
                    if (score["🍉"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 10f);
                    }
                }
                if (score.ContainsKey("⭐"))
                {
                    if (score["⭐"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 2f);
                    }
                    if (score["⭐"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 12f);
                    }
                }

                if (moneyReturned == 0)
                {
                    moneyReturned = -bet;
                    embed.AddField(locale.GetString("miki_module_fun_slots_lose_header"),
                                   locale.GetString("miki_module_fun_slots_lose_amount", bet, u.Currency - bet));
                }
                else
                {
                    embed.AddField(locale.GetString(Locale.SlotsWinHeader),
                                   locale.GetString(Locale.SlotsWinMessage, moneyReturned, u.Currency + moneyReturned));
                }

                embed.Description = string.Join(" ", objectsChosen);
                await u.AddCurrencyAsync(moneyReturned, e.Channel);

                await context.SaveChangesAsync();

                await embed.SendToChannel(e.Channel);
            }
        }
示例#7
0
        public async Task IAmNotAsync(EventContext e)
        {
            string roleName = e.Arguments.ToString();

            using (var context = new MikiContext())
            {
                List <IDiscordRole> roles = await GetRolesByName(e.Guild, roleName);

                IDiscordRole role = null;

                if (roles.Count > 1)
                {
                    List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync();

                    if (levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).Count() > 1)
                    {
                        e.ErrorEmbed("two roles configured have the same name.")
                        .ToEmbed().QueueToChannel(e.Channel);
                        return;
                    }
                    else
                    {
                        role = levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).FirstOrDefault().GetRoleAsync().Result;
                    }
                }
                else
                {
                    role = roles.FirstOrDefault();
                }

                if (role == null)
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_null"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

                IDiscordGuildUser author = await e.Guild.GetMemberAsync(e.Author.Id);

                IDiscordGuildUser me = await e.Guild.GetSelfAsync();

                if (!author.RoleIds.Contains(role.Id))
                {
                    await e.ErrorEmbed(e.Locale.GetString("error_role_forbidden"))
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

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

                User user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                if (!await me.HasPermissionsAsync(GuildPermission.ManageRoles))
                {
                    e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannel(e.Channel);
                    return;
                }

                if (role.Position >= await me.GetHierarchyAsync())
                {
                    e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed()
                    .QueueToChannel(e.Channel);
                    return;
                }

                await author.RemoveRoleAsync(role);

                new EmbedBuilder()
                .SetTitle("I AM NOT")
                .SetColor(255, 128, 128)
                .SetDescription($"You're no longer a(n) {role.Name}!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
示例#8
0
        public async Task FavouritePastaList(EventContext e, bool lovedPastas = true)
        {
            IUser targetUser   = e.Author;
            float totalPerPage = 25f;
            int   page         = 0;

            ArgObject arg = e.Arguments.FirstOrDefault();

            if (arg == null)
            {
                // TODO: error no user found
                return;
            }

            IUser user = await arg.GetUserAsync(e.Guild);

            if (user != null)
            {
                arg = arg.Next();
            }
            else
            {
                user = e.Author;
            }

            page = arg.AsInt() ?? 0;

            using (MikiContext context = new MikiContext())
            {
                long authorId = targetUser.Id.ToDbLong();
                IEnumerable <PastaVote> pastaVotes = context.Votes.Where(x => x.UserId == authorId && x.PositiveVote == lovedPastas);

                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.GetResource("miki_module_pasta_loved") : e.GetResource("miki_module_pasta_hated"));
                    string errorString = e.GetResource("miki_module_pasta_favlist_self_none", loveString);
                    if (e.message.MentionedUserIds.Count() >= 1)
                    {
                        errorString = e.GetResource("miki_module_pasta_favlist_mention_none", loveString);
                    }
                    Utils.ErrorEmbed(e, errorString).Build().QueueToChannel(e.Channel);
                    return;
                }

                EmbedBuilder     embed        = Utils.Embed;
                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.WithTitle($"{(lovedPastas ? e.GetResource("miki_module_pasta_loved_header") : e.GetResource("miki_module_pasta_hated_header"))} - {useName}");
                embed.WithDescription(resultString);
                embed.WithFooter(e.GetResource("page_index", page + 1, Math.Ceiling(pastaVotes.Count() / totalPerPage)), "");

                embed.Build().QueueToChannel(e.Channel);
            }
        }
示例#9
0
        public async Task StartSlots(EventContext e, int bet)
        {
            using (var context = new MikiContext())
            {
                User u = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                int moneyReturned = 0;

                string[] objects =
                {
                    "🍒", "🍒", "🍒", "🍒",
                    "🍊", "🍊", "🍊",
                    "🍓", "🍓",
                    "🍍", "🍍",
                    "🍇", "🍇",
                    "🍉", "🍉",
                    "⭐", "⭐",
                    "🍉",
                    "🍍", "🍍",
                    "🍓", "🍓",
                    "🍊", "🍊", "🍊",
                    "🍒", "🍒", "🍒", "🍒",
                };

                EmbedBuilder embed = new EmbedBuilder()
                                     .SetAuthor(e.Locale.GetString(LocaleTags.SlotsHeader) + " | " + e.Author.Username, e.Author.GetAvatarUrl(), "https://patreon.com/mikibot");

                string[] objectsChosen =
                {
                    objects[MikiRandom.Next(objects.Length)],
                    objects[MikiRandom.Next(objects.Length)],
                    objects[MikiRandom.Next(objects.Length)]
                };

                Dictionary <string, int> score = new Dictionary <string, int>();

                foreach (string o in objectsChosen)
                {
                    if (score.ContainsKey(o))
                    {
                        score[o]++;
                        continue;
                    }
                    score.Add(o, 1);
                }

                if (score.ContainsKey("🍒"))
                {
                    if (score["🍒"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 0.5f);
                    }
                    else if (score["🍒"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1f);
                    }
                }
                if (score.ContainsKey("🍊"))
                {
                    if (score["🍊"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 0.8f);
                    }
                    else if (score["🍊"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1.5f);
                    }
                }
                if (score.ContainsKey("🍓"))
                {
                    if (score["🍓"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1f);
                    }
                    else if (score["🍓"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 2f);
                    }
                }
                if (score.ContainsKey("🍍"))
                {
                    if (score["🍍"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1f);
                    }
                    if (score["🍍"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 4f);
                    }
                }
                if (score.ContainsKey("🍇"))
                {
                    if (score["🍇"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1.2f);
                    }
                    if (score["🍇"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 6f);
                    }
                }
                if (score.ContainsKey("🍉"))
                {
                    if (score["🍉"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 1.5f);
                    }
                    if (score["🍉"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 10f);
                    }
                }
                if (score.ContainsKey("⭐"))
                {
                    if (score["⭐"] == 2)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 2f);
                    }
                    if (score["⭐"] == 3)
                    {
                        moneyReturned = (int)Math.Ceiling(bet * 12f);

                        await AchievementManager.Instance.GetContainerById("slots").CheckAsync(new BasePacket()
                        {
                            discordChannel = e.Channel,
                            discordUser    = e.Author
                        });
                    }
                }

                if (moneyReturned == 0)
                {
                    moneyReturned = -bet;
                    embed.AddField(e.Locale.GetString("miki_module_fun_slots_lose_header"),
                                   e.Locale.GetString("miki_module_fun_slots_lose_amount", bet, u.Currency - bet));
                }
                else
                {
                    embed.AddField(e.Locale.GetString(LocaleTags.SlotsWinHeader),
                                   e.Locale.GetString(LocaleTags.SlotsWinMessage, moneyReturned, u.Currency + moneyReturned));
                }

                embed.Description = string.Join(" ", objectsChosen);
                await u.AddCurrencyAsync(moneyReturned, e.Channel);

                await context.SaveChangesAsync();

                embed.ToEmbed().QueueToChannel(e.Channel);
            }
        }
示例#10
0
        public async Task CheckAsync(IDiscordMessage e)
        {
            if (e.Author.IsBot)
            {
                return;
            }

            if (!lastTimeExpGranted.ContainsKey(e.Author.Id))
            {
                lastTimeExpGranted.Add(e.Author.Id, DateTime.MinValue);
            }

            if (lastTimeExpGranted[e.Author.Id].AddMinutes(1) < DateTime.Now)
            {
                using (var context = new MikiContext())
                {
                    User a = await context.Users.FindAsync(e.Author.Id.ToDbLong());

                    if (a == null)
                    {
                        a = User.Create(context, e);
                    }

                    try
                    {
                        LocalExperience experience = await context.Experience.FindAsync(e.Guild.Id.ToDbLong(), a.Id);

                        if (experience == null)
                        {
                            experience = context.Experience.Add(new LocalExperience()
                            {
                                server_id = e.Guild.Id.ToDbLong(), user_id = a.Id, Experience = 0, LastExperienceTime = DateTime.Now - new TimeSpan(1)
                            });
                        }

                        GuildUser guildUser = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong());

                        if (guildUser == null)
                        {
                            int value = await context.Database.SqlQuery <int>
                                            ("select Sum(Experience) as value from LocalExperience where ServerId = @p0;", e.Guild.Id.ToDbLong())
                                        .FirstAsync();

                            guildUser = context.GuildUsers.Add(new GuildUser()
                            {
                                Name              = e.Guild.Name,
                                Id                = e.Guild.Id.ToDbLong(),
                                Experience        = value,
                                UserCount         = Bot.instance.Client.GetGuild(e.Guild.Id).Users.Count,
                                LastRivalRenewed  = DateTime.Now.AddYears(-1),
                                LastRewardClaimed = DateTime.Now.AddYears(-1)
                            });
                            await context.SaveChangesAsync();
                        }

                        if (experience.LastExperienceTime == null)
                        {
                            experience.LastExperienceTime = DateTime.Now;
                        }

                        int currentLocalLevel  = a.CalculateLevel(experience.Experience);
                        int currentGlobalLevel = a.CalculateLevel(a.Total_Experience);
                        int addedExperience    = Global.random.Next(1, 10);

                        experience.Experience += addedExperience;
                        a.Total_Experience    += addedExperience;
                        guildUser.Experience  += addedExperience;

                        if (currentLocalLevel != a.CalculateLevel(experience.Experience))
                        {
                            await LevelUpLocalAsync(e, a, currentLocalLevel + 1);
                        }
                        if (currentGlobalLevel != a.CalculateLevel(a.Total_Experience))
                        {
                            await LevelUpGlobalAsync(e, a, currentGlobalLevel + 1);
                        }

                        experience.LastExperienceTime   = DateTime.Now;
                        lastTimeExpGranted[e.Author.Id] = DateTime.Now;
                    }
                    catch (Exception ex)
                    {
                        Log.ErrorAt("Accounts.Check", ex.Message + ex.StackTrace + ex.Source);
                    }

                    await context.SaveChangesAsync();
                }
            }
        }
示例#11
0
        public async Task MyPasta(EventContext e)
        {
            int page = 0;

            if (!string.IsNullOrWhiteSpace(e.Arguments.ToString()))
            {
                if (int.TryParse(e.Arguments.FirstOrDefault().Argument, out page))
                {
                    page -= 1;
                }
            }
            long   userId;
            string userName;

            if (e.message.MentionedUserIds.Count() > 0)
            {
                userId   = e.message.MentionedUserIds.First().ToDbLong();
                userName = (await e.Guild.GetUserAsync(userId.FromDbLong())).Username;
            }
            else
            {
                userId   = e.Author.Id.ToDbLong();
                userName = e.Author.Username;
            }

            using (var context = new MikiContext())
            {
                var pastasFound = context.Pastas.Where(x => x.CreatorId == userId)
                                  .OrderByDescending(x => x.Id)
                                  .Skip(page * 25)
                                  .Take(25)
                                  .ToList();

                var totalCount = context.Pastas.Where(x => x.CreatorId == userId)
                                 .Count();

                if (page * 25 > totalCount)
                {
                    e.ErrorEmbed(e.GetResource("pasta_error_out_of_index"))
                    .Build().QueueToChannel(e.Channel);
                    return;
                }

                if (pastasFound?.Count > 0)
                {
                    string resultString = "";

                    pastasFound.ForEach(x => { resultString += "`" + x.Id + "` "; });

                    Utils.Embed
                    .WithTitle(e.GetResource("mypasta_title", userName))
                    .WithDescription(resultString)
                    .WithFooter(e.GetResource("page_index", page + 1, (Math.Ceiling((double)totalCount / 25)).ToString()), null)
                    .Build().QueueToChannel(e.Channel);
                    return;
                }

                e.ErrorEmbed(e.GetResource("mypasta_error_no_pastas"))
                .Build().QueueToChannel(e.Channel);
            }
        }
示例#12
0
 public override async Task <bool> CheckAsync(MikiContext context, BasePacket packet)
 {
     return(await CheckCommand(packet as CommandPacket));
 }
示例#13
0
        public async Task GuildWeekly(EventContext context)
        {
            using (MikiContext database = new MikiContext())
            {
                Locale          locale   = Locale.GetEntity(context.Channel.Id);
                LocalExperience thisUser = await database.Experience.FindAsync(context.Guild.Id.ToDbLong(), context.Author.Id.ToDbLong());

                GuildUser thisGuild = await database.GuildUsers.FindAsync(context.Guild.Id.ToDbLong());

                Timer timer = await database.Timers.FindAsync(context.Guild.Id.ToDbLong(), context.Author.Id.ToDbLong());

                if (thisUser == null)
                {
                    Log.ErrorAt("Guildweekly", "User is null");
                    return;
                }

                if (thisGuild == null)
                {
                    Log.ErrorAt("Guildweekly", "Guild is null");
                    return;
                }

                if (thisUser.Experience > thisGuild.MinimalExperienceToGetRewards)
                {
                    if (timer == null)
                    {
                        timer = database.Timers.Add(new Timer()
                        {
                            GuildId = context.Guild.Id.ToDbLong(),
                            UserId  = context.Author.Id.ToDbLong(),
                            Value   = DateTime.Now.AddDays(-30)
                        });
                        await database.SaveChangesAsync();
                    }

                    if (timer.Value.AddDays(7) <= DateTime.Now)
                    {
                        SocketGuild guild = Bot.instance.Client.GetGuild(thisGuild.Id.FromDbLong());

                        GuildUser rival = await thisGuild.GetRival();

                        if (rival == null)
                        {
                            await Utils.Embed
                            .SetTitle(locale.GetString("miki_terms_weekly"))
                            .SetDescription(context.GetResource("guildweekly_error_no_rival"))
                            .SendToChannel(context.Channel);

                            return;
                        }

                        if (rival.Experience > thisGuild.Experience)
                        {
                            await Utils.Embed
                            .SetTitle(locale.GetString("miki_terms_weekly"))
                            .SetDescription(context.GetResource("guildweekly_error_low_level"))
                            .SendToChannel(context.Channel);

                            return;
                        }

                        int mekosGained = (int)Math.Round((((Global.random.NextDouble() + 1.25) * 0.5) * 10) * thisGuild.CalculateLevel(thisGuild.Experience));

                        User user = await database.Users.FindAsync(context.Author.Id.ToDbLong());

                        if (user == null)
                        {
                            // TODO: Add response
                            return;
                        }

                        await user.AddCurrencyAsync(mekosGained, context.Channel);

                        await Utils.Embed
                        .SetTitle(locale.GetString("miki_terms_weekly"))
                        .AddInlineField("Mekos", mekosGained.ToString())
                        .SendToChannel(context.Channel);

                        timer.Value = DateTime.Now;
                        await database.SaveChangesAsync();
                    }
                    else
                    {
                        await Utils.Embed
                        .SetTitle(locale.GetString("miki_terms_weekly"))
                        .SetDescription(context.GetResource("guildweekly_error_timer_running", (timer.Value.AddDays(7) - DateTime.Now).ToTimeString(locale)))
                        .SendToChannel(context.Channel);
                    }
                }
                else
                {
                    await Utils.Embed
                    .SetTitle(locale.GetString("miki_terms_weekly"))
                    .SetDescription(locale.GetString("miki_guildweekly_insufficient_exp", thisGuild.MinimalExperienceToGetRewards))
                    .SendToChannel(context.Channel);
                }
            }
        }
示例#14
0
 public static async Task <User> GetUserAsync(MikiContext context, IDiscordUser discordUser)
 => await User.GetAsync(context, (long)discordUser.Id, discordUser.Username);
示例#15
0
        public AccountManager(DiscordBot bot)
        {
            OnGlobalLevelUp += (a, e, l) =>
            {
                DogStatsd.Counter("levels.global", l);
                return(Task.CompletedTask);
            };
            OnLocalLevelUp += async(a, e, l) =>
            {
                DogStatsd.Counter("levels.local", l);

                var  guild   = await(e as IDiscordGuildChannel).GetGuildAsync();
                long guildId = guild.Id.ToDbLong();

                List <LevelRole> rolesObtained = new List <LevelRole>();

                using (var context = new MikiContext())
                {
                    rolesObtained = await context.LevelRoles
                                    .Where(p => p.GuildId == guildId && p.RequiredLevel == l && p.Automatic)
                                    .ToListAsync();

                    var setting = (LevelNotificationsSetting)
                                  await Setting.GetAsync(context, e.Id, DatabaseSettingId.LEVEL_NOTIFICATIONS);

                    if (setting == LevelNotificationsSetting.NONE)
                    {
                        return;
                    }

                    if (setting == LevelNotificationsSetting.REWARDS_ONLY && rolesObtained.Count == 0)
                    {
                        return;
                    }

                    LocaleInstance instance = await Locale.GetLanguageInstanceAsync(e.Id);

                    EmbedBuilder embed = new EmbedBuilder()
                    {
                        Title       = instance.GetString("miki_accounts_level_up_header"),
                        Description = instance.GetString("miki_accounts_level_up_content", $"{a.Username}#{a.Discriminator}", l),
                        Color       = new Color(1, 0.7f, 0.2f)
                    };

                    if (rolesObtained.Count > 0)
                    {
                        var roles = await guild.GetRolesAsync();

                        var guildUser = await guild.GetMemberAsync(a.Id);

                        if (guildUser != null)
                        {
                            foreach (var role in rolesObtained)
                            {
                                var r = roles.FirstOrDefault(x => x.Id == (ulong)role.RoleId);

                                if (r != null)
                                {
                                    await guildUser.AddRoleAsync(r);
                                }
                            }
                        }

                        embed.AddInlineField("Rewards",
                                             string.Join("\n", rolesObtained.Select(x => $"New Role: **{roles.FirstOrDefault(z => z.Id.ToDbLong() == x.RoleId).Name}**")));
                    }

                    embed.ToEmbed().QueueToChannel(e);
                }
            };

            //bot.Discord.Guild += Client_GuildUpdated;
            bot.Discord.GuildMemberCreate += Client_UserJoined;
            bot.Discord.MessageCreate     += CheckAsync;
        }
示例#16
0
        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.Locale, 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.ToString())
                .AddInlineField("Drawing In", timeLeft)
                .AddInlineField("Total Tickets", totalTickets.ToString())
                .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();

                    e.SuccessEmbed($"Successfully bought {amount} tickets!")
                    .QueueToChannel(e.Channel);
                }
            }
            break;
            }
        }
示例#17
0
        private async Task StartFlip(EventContext e, int bet)
        {
            string[] arguments = e.arguments.Split(' ');

            if (bet <= 0)
            {
                return;
            }

            if (arguments.Length < 2)
            {
                return;
            }

            int pickedSide = -1;

            if (arguments[1].ToLower() == "heads" || arguments[1].ToLower() == "h")
            {
                pickedSide = 1;
            }
            else if (arguments[1].ToLower() == "tails" || arguments[1].ToLower() == "t")
            {
                pickedSide = 0;
            }

            if (pickedSide == -1)
            {
                return;
            }

            string headsUrl = "https://miki.ai/assets/img/miki-default-heads.png";
            string tailsUrl = "https://miki.ai/assets/img/miki-default-tails.png";

            if (e.arguments.Contains("-bonus"))
            {
                headsUrl = "https://miki.ai/assets/img/miki-secret-heads.png";
                tailsUrl = "https://miki.ai/assets/img/miki-secret-tails.png";
            }

            int    side     = MikiRandom.Next(2);
            string imageUrl = side == 1 ? headsUrl : tailsUrl;

            bool win         = (side == pickedSide);
            int  currencyNow = 0;

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

                if (!win)
                {
                    bet = -bet;
                }
                u.Currency += bet;
                currencyNow = u.Currency;
                await context.SaveChangesAsync();
            }

            string output = "";

            if (win)
            {
                output = e.GetResource("flip_description_win", $"`{bet}`");
            }
            else
            {
                output = e.GetResource("flip_description_lose");
            }

            output += "\n" + e.GetResource("miki_blackjack_new_balance", currencyNow);

            IDiscordEmbed embed = Utils.Embed
                                  .SetAuthor(e.GetResource("flip_header") + " | " + e.Author.Username, e.Author.AvatarUrl,
                                             "https://patreon.com/mikibot")
                                  .SetDescription(output)
                                  .SetThumbnailUrl(imageUrl);

            await embed.SendToChannel(e.Channel);
        }
示例#18
0
        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.Locale.GetString("miki_error_gambling_parse_error"))
                        .ToEmbed().QueueToChannel(e.Channel);
                        return(null);
                    }

                    if (bet < 1)
                    {
                        e.ErrorEmbed(e.Locale.GetString("miki_error_gambling_zero_or_less"))
                        .ToEmbed().QueueToChannel(e.Channel);
                        return(null);
                    }
                    else if (bet > user.Currency)
                    {
                        e.ErrorEmbed(e.Locale.GetString("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.Locale.GetString("miki_error_gambling_no_arg"))
                .ToEmbed().QueueToChannel(e.Channel);
                return(null);
            }
        }
示例#19
0
        public async Task ValidateBet(EventContext e, Func <EventContext, int, Task> callback = null, int maxBet = 1000000)
        {
            if (!string.IsNullOrEmpty(e.arguments))
            {
                int       bet;
                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;
                    }

                    string checkArg = e.arguments.Split(' ')[0];

                    if (int.TryParse(checkArg, out bet))
                    {
                    }
                    else if (checkArg.ToLower() == "all" || e.arguments == "*")
                    {
                        bet = user.Currency;
                    }
                    else
                    {
                        await e.ErrorEmbed(e.GetResource("miki_error_gambling_parse_error"))
                        .SendToChannel(e.Channel);

                        return;
                    }

                    if (bet < 1)
                    {
                        await e.ErrorEmbed(e.GetResource("miki_error_gambling_zero_or_less"))
                        .SendToChannel(e.Channel);
                    }
                    else if (bet > user.Currency)
                    {
                        await e.ErrorEmbed(e.GetResource("miki_mekos_insufficient"))
                        .SendToChannel(e.Channel);
                    }
                    else if (bet > maxBet)
                    {
                        await e.ErrorEmbed($"you cannot bet more than {maxBet} mekos!")
                        .SendToChannel(e.Channel);

                        return;
                    }
                    else if (bet > noAskLimit)
                    {
                        IDiscordEmbed embed = Utils.Embed;
                        embed.Description =
                            $"Are you sure you want to bet **{bet}**? You currently have `{user.Currency}` mekos.\n\nType `yes` to confirm.";
                        embed.Color = new IA.SDK.Color(0.4f, 0.6f, 1f);
                        await embed.SendToChannel(e.Channel);

                        CommandHandler confirmCommand = new CommandHandlerBuilder(Bot.instance.Events)
                                                        .AddPrefix("")
                                                        .DisposeInSeconds(20)
                                                        .SetOwner(e.message)
                                                        .AddCommand(
                            new RuntimeCommandEvent("yes")
                            .Default(async(ec) =>
                        {
                            await ec.commandHandler.RequestDisposeAsync();
                            await ec.message.DeleteAsync();
                            if (callback != null)
                            {
                                if (bet > user.Currency)
                                {
                                    await e.ErrorEmbed(e.GetResource("miki_mekos_insufficient"))
                                    .SendToChannel(e.Channel);
                                    return;
                                }
                                await callback(e, bet);
                            }
                        })).Build();

                        Bot.instance.Events.AddPrivateCommandHandler(e.message, confirmCommand);
                    }
                    else
                    {
                        if (callback != null)
                        {
                            await callback(e, bet);
                        }
                    }
                }
            }
            else
            {
                await Utils.ErrorEmbed(e.Channel.GetLocale(), e.GetResource("miki_error_gambling_no_arg"))
                .SendToChannel(e.Channel);
            }
        }
示例#20
0
        public async Task AcceptMarriageAsync(EventContext e)
        {
            IDiscordUser user = await e.Arguments.Join().GetUserAsync(e.Guild);

            if (user == null)
            {
                e.ErrorEmbed("I couldn't find this user!")
                .ToEmbed().QueueToChannel(e.Channel);
            }

            if (user.Id == e.Author.Id)
            {
                e.ErrorEmbed("Please mention someone else than yourself.")
                .ToEmbed().QueueToChannel(e.Channel);
                return;
            }

            using (var context = new MikiContext())
            {
                MarriageRepository repository = new MarriageRepository(context);

                User accepter = await DatabaseHelpers.GetUserAsync(context, e.Author);

                User asker = await DatabaseHelpers.GetUserAsync(context, user);

                UserMarriedTo marriage = await repository.GetEntryAsync(accepter.Id, asker.Id);

                if (marriage != null)
                {
                    if (accepter.MarriageSlots < (await repository.GetMarriagesAsync(accepter.Id)).Count)
                    {
                        throw new InsufficientMarriageSlotsException(accepter);
                    }

                    if (asker.MarriageSlots < (await repository.GetMarriagesAsync(asker.Id)).Count)
                    {
                        throw new InsufficientMarriageSlotsException(asker);
                    }

                    if (marriage.ReceiverId != e.Author.Id.ToDbLong())
                    {
                        e.Channel.QueueMessageAsync($"You can not accept your own responses!");
                        return;
                    }

                    if (marriage.Marriage.IsProposing)
                    {
                        marriage.Marriage.AcceptProposal();

                        await context.SaveChangesAsync();

                        new EmbedBuilder()
                        {
                            Title       = ("❤️ Happily married"),
                            Color       = new Color(190, 25, 49),
                            Description = ($"Much love to { e.Author.Username } and { user.Username } in their future adventures together!")
                        }.ToEmbed().QueueToChannel(e.Channel);
                    }
                    else
                    {
                        e.ErrorEmbed("You're already married to this person ya doofus!")
                        .ToEmbed().QueueToChannel(e.Channel);
                    }
                }
                else
                {
                    e.Channel.QueueMessageAsync("This user hasn't proposed to you!");
                    return;
                }
            }
        }
示例#21
0
        public async Task IAmListAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                int page = Math.Max((e.Arguments.Join()?.TakeInt() ?? 0) - 1, 0);

                long guildId = e.Guild.Id.ToDbLong();

                List <LevelRole> roles = await context.LevelRoles
                                         .Where(x => x.GuildId == guildId)
                                         .OrderBy(x => x.RoleId)
                                         .Skip(page * 25)
                                         .Take(25)
                                         .ToListAsync();

                StringBuilder stringBuilder = new StringBuilder();

                var guildRoles = await e.Guild.GetRolesAsync();

                List <Tuple <IDiscordRole, LevelRole> > availableRoles = roles
                                                                         .Where(x => guildRoles.Any(y => x.RoleId == (long)y.Id))
                                                                         .Select(x => new Tuple <IDiscordRole, LevelRole>(guildRoles
                                                                                                                          .Single(y => x.RoleId == (long)y.Id), x)
                                                                                 ).ToList();

                foreach (var role in availableRoles)
                {
                    if (role.Item2.Optable)
                    {
                        if (role.Item1 == null)
                        {
                            context.LevelRoles.Remove(role.Item2);
                            continue;
                        }

                        stringBuilder.Append($"`{role.Item1.Name.PadRight(20)}|`");

                        if (role.Item2.RequiredLevel > 0)
                        {
                            stringBuilder.Append($"⭐{role.Item2.RequiredLevel} ");
                        }

                        if (role.Item2.Automatic)
                        {
                            stringBuilder.Append($"⚙️");
                        }

                        if (role.Item2.RequiredRole != 0)
                        {
                            var roleRequired = await e.Guild.GetRoleAsync(role.Item2.RequiredRole.FromDbLong());

                            stringBuilder.Append($"🔨`{roleRequired?.Name ?? "non-existing role"}`");
                        }

                        if (role.Item2.Price != 0)
                        {
                            stringBuilder.Append($"🔸{role.Item2.Price} ");
                        }

                        stringBuilder.AppendLine();
                    }
                }

                if (stringBuilder.Length == 0)
                {
                    stringBuilder.Append(e.Locale.GetString("miki_placeholder_null"));
                }

                await context.SaveChangesAsync();

                new EmbedBuilder().SetTitle("📄 Available Roles")
                .SetDescription(stringBuilder.ToString())
                .SetColor(204, 214, 221)
                .SetFooter("page " + (page + 1))
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
示例#22
0
        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())
            {
                MarriageRepository repository = new MarriageRepository(context);

                User mentionedPerson = await User.GetAsync(context, user.Id.ToDbLong(), user.Username);

                User currentUser = await DatabaseHelpers.GetUserAsync(context, e.Author);

                askerId    = currentUser.Id;
                receiverId = mentionedPerson.Id;

                if (currentUser == null || mentionedPerson == null)
                {
                    e.ErrorEmbed(e.Locale.GetString("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.Locale.GetString("miki_module_accounts_marry_error_null")).ToEmbed().QueueToChannel(e.Channel);
                    return;
                }

                if (await repository.ExistsAsync(mentionedPerson.Id, currentUser.Id))
                {
                    e.ErrorEmbed(e.Locale.GetString("miki_module_accounts_marry_error_exists")).ToEmbed().QueueToChannel(e.Channel);
                    return;
                }

                await repository.ProposeAsync(askerId, receiverId);

                await context.SaveChangesAsync();
            }

            new EmbedBuilder()
            .SetTitle("💍" + e.Locale.GetString("miki_module_accounts_marry_text", $"**{e.Author.Username}**", $"**{user.Username}**"))
            .SetDescription(e.Locale.GetString("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);
        }
示例#23
0
        /*public async Task ConfigRoleInteractiveAsync(EventContext e)
         * {
         *      using (var context = new MikiContext())
         *      {
         *              EmbedBuilder sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                      .SetDescription("Type out the role name you want to config")
         *                      .SetColor(138, 182, 239);
         *              IDiscordMessage sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *              IDiscordMessage msg = null;
         *
         *              while (true)
         *              {
         *                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                      if (msg.Content.Length < 20)
         *                      {
         *                              break;
         *                      }
         *                      else
         *                      {
         *                              await sourceMessage.EditAsync(new EditMessageArgs
         *                              {
         *                                      embed = e.ErrorEmbed("That role name is way too long! Try again.")
         *                                              .ToEmbed()
         *                              });
         *                      }
         *              }
         *
         *              string roleName = msg.Content;
         *
         *              List<IDiscordRole> rolesFound = await GetRolesByName(e.Guild, roleName.ToLower());
         *              IDiscordRole role = null;
         *
         *              if(rolesFound.Count == 0)
         *              {
         *                      // Hey, I couldn't find this role, Can I make a new one?
         *                      await sourceMessage.EditAsync(new EditMessageArgs
         *                      {
         *                              embed = e.ErrorEmbed($"There's no role that is named `{roleName}`, Shall I create it? Y/N").ToEmbed()
         *                      });
         *
         *                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                      if (msg.Content.ToLower()[0] != 'y')
         *                      {
         *                              throw new RoleNullException();
         *                      }
         *
         *                      role = await e.Guild.CreateRoleAsync(new CreateRoleArgs
         *                      {
         *                              Name = roleName,
         *                      });
         *              }
         *              else if (rolesFound.Count > 1)
         *              {
         *                      string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));
         *
         *                      if (roleIds.Length > 1024)
         *                      {
         *                              roleIds = roleIds.Substring(0, 1024);
         *                      }
         *
         *                      sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                                      .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
         *                                      .AddInlineField("Roles - Ids", roleIds)
         *                                      .SetColor(138, 182, 239);
         *
         *                      sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *                      while(true)
         *                      {
         *                              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *                              if (ulong.TryParse(msg.Content, out ulong id))
         *                              {
         *                                      role = rolesFound.Where(x => x.Id == id)
         *                                              .FirstOrDefault();
         *
         *                                      if (role != null)
         *                                      {
         *                                              break;
         *                                      }
         *                                      else
         *                                      {
         *                                              await sourceMessage.EditAsync(new EditMessageArgs {
         *                                                      embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
         *                                                      .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                              });
         *                                      }
         *                              }
         *                              else
         *                              {
         *                                      await sourceMessage.EditAsync(new EditMessageArgs
         *                                      {
         *                                              embed = e.ErrorEmbed("I couldn't find that role. Try again!")
         *                                              .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                      });
         *                              }
         *                      }
         *              }
         *              else
         *              {
         *                      role = rolesFound.FirstOrDefault();
         *              }
         *
         *              LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong());
         *              if(newRole == null)
         *              {
         *                      newRole = (await context.LevelRoles.AddAsync(new LevelRole()
         *                      {
         *                              RoleId = role.Id.ToDbLong(),
         *                              GuildId = e.Guild.Id.ToDbLong()
         *                      })).Entity;
         *              }
         *
         *              sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                      .SetDescription("Is there a role that is needed to get this role? Type out the role name, or `-` to skip")
         *                      .SetColor(138, 182, 239);
         *
         *              sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *
         *              while (true)
         *              {
         *                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                      rolesFound = (await GetRolesByName(e.Guild, msg.Content.ToLower()));
         *                      IDiscordRole parentRole = null;
         *
         *                      if (rolesFound.Count > 1)
         *                      {
         *                              string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}"));
         *
         *                              if (roleIds.Length > 1024)
         *                              {
         *                                      roleIds = roleIds.Substring(0, 1024);
         *                              }
         *
         *                              sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                                              .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID")
         *                                              .AddInlineField("Roles - Ids", roleIds)
         *                                              .SetColor(138, 182, 239);
         *
         *                              sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *                              while (true)
         *                              {
         *                                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *                                      if (ulong.TryParse(msg.Content, out ulong id))
         *                                      {
         *                                              parentRole = rolesFound.Where(x => x.Id == id)
         *                                                      .FirstOrDefault();
         *
         *                                              if (parentRole != null)
         *                                              {
         *                                                      break;
         *                                              }
         *                                              else
         *                                              {
         *                                                      await sourceMessage.EditAsync(new EditMessageArgs {
         *                                                              embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!")
         *                                                              .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                                      }) ;
         *                                              }
         *                                      }
         *                                      else
         *                                      {
         *                                              await sourceMessage.EditAsync(new EditMessageArgs
         *                                              {
         *                                                      embed = e.ErrorEmbed("I couldn't find that role. Try again!")
         *                                                      .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed()
         *                                              });
         *                                      }
         *                              }
         *                      }
         *                      else
         *                      {
         *                              parentRole = rolesFound.FirstOrDefault();
         *                      }
         *
         *                      if (parentRole != null || msg.Content == "-")
         *                      {
         *                              newRole.RequiredRole = (long?)parentRole?.Id ?? 0;
         *                              break;
         *                      }
         *
         *                      await sourceMessage.EditAsync(new EditMessageArgs
         *                      {
         *                              embed = e.ErrorEmbed("I couldn't find that role. Try again!").ToEmbed()
         *                      });
         *              }
         *
         *              sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                      .SetDescription($"Is there a level requirement? type a number, if there is no requirement type 0")
         *                      .SetColor(138, 182, 239);
         *
         *              sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *
         *              while (true)
         *              {
         *                      msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *                      if (int.TryParse(msg.Content, out int r))
         *                      {
         *                              if (r >= 0)
         *                              {
         *                                      newRole.RequiredLevel = r;
         *                                      break;
         *                              }
         *                              else
         *                              {
         *                                      await sourceMessage.EditAsync(new EditMessageArgs
         *                                      {
         *                                              embed = sourceEmbed.SetDescription($"Please pick a number above 0. Try again")
         *                                                      .ToEmbed()
         *                                      });
         *                              }
         *                      }
         *                      else
         *                      {
         *                              await sourceMessage.EditAsync(new EditMessageArgs
         *                              {
         *                                      embed = sourceEmbed.SetDescription($"Are you sure `{msg.Content}` is a number? Try again").ToEmbed()
         *                              });
         *                      }
         *              }
         *
         *              sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                      .SetDescription($"Should I give them when the user level ups? type `yes`, otherwise it will be considered as no")
         *                      .SetColor(138, 182, 239);
         *
         *              sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *
         *              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *              if (msg == null)
         *              {
         *                      return;
         *              }
         *
         *              newRole.Automatic = msg.Content.ToLower()[0] == 'y';
         *
         *              sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                      .SetDescription($"Should users be able to opt in? type `yes`, otherwise it will be considered as no")
         *                      .SetColor(138, 182, 239);
         *
         *              sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *
         *              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *              newRole.Optable = msg.Content.ToLower()[0] == 'y';
         *
         *              if (newRole.Optable)
         *              {
         *                      sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode")
         *                              .SetDescription($"Do you want the user to pay mekos for the role? Enter any amount. Enter 0 to keep the role free.")
         *                              .SetColor(138, 182, 239);
         *
         *                      sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel);
         *
         *                      while (true)
         *                      {
         *                              msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession());
         *
         *      if (msg == null)
         *                              {
         *                                      return;
         *                              }
         *
         *                              if (int.TryParse(msg.Content, out int r))
         *                              {
         *                                      if (r >= 0)
         *                                      {
         *                                              newRole.Price = r;
         *                                              break;
         *                                      }
         *                                      else
         *                                      {
         *                                              await sourceMessage.EditAsync(new EditMessageArgs
         *                                              {
         *                                                      embed = e.ErrorEmbed($"Please pick a number above 0. Try again").ToEmbed()
         *                                              });
         *                                      }
         *                              }
         *                              else
         *                              {
         *                                      await sourceMessage.EditAsync(new EditMessageArgs
         *                                      {
         *                                              embed = e.ErrorEmbed($"Not quite sure if this is a number 🤔").ToEmbed()
         *                                      });
         *                              }
         *                      }
         *              }
         *
         *              await context.SaveChangesAsync();
         *              Utils.Embed.SetTitle("⚙ Role Config")
         *                      .SetColor(102, 117, 127)
         *                      .SetDescription($"Updated {role.Name}!")
         *                      .ToEmbed().QueueToChannel(e.Channel);
         *      }
         * }*/

        public async Task ConfigRoleQuickAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                string roleName = e.Arguments.ToString().Split('"')[1];

                IDiscordRole role = null;
                if (ulong.TryParse(roleName, out ulong s))
                {
                    role = await e.Guild.GetRoleAsync(s);
                }
                else
                {
                    role = (await GetRolesByName(e.Guild, roleName)).FirstOrDefault();
                }

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

                MSLResponse arguments = new MMLParser(e.Arguments.ToString().Substring(roleName.Length + 3))
                                        .Parse();

                if (role.Name.Length > 20)
                {
                    await e.ErrorEmbed("Please keep role names below 20 letters.")
                    .ToEmbed().SendToChannel(e.Channel);

                    return;
                }

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

                if (arguments.HasKey("automatic"))
                {
                    newRole.Automatic = arguments.GetBool("automatic");
                }

                if (arguments.HasKey("optable"))
                {
                    newRole.Optable = arguments.GetBool("optable");
                }

                if (arguments.HasKey("level-required"))
                {
                    newRole.RequiredLevel = arguments.GetInt("level-required");
                }

                if (arguments.HasKey("price"))
                {
                    newRole.Price = arguments.GetInt("price");
                    if (newRole.Price < 0)
                    {
                        throw new ArgumentLessThanZeroException();
                    }
                }

                if (arguments.HasKey("role-required"))
                {
                    long id = 0;
                    if (arguments.TryGet("role-required", out long l))
                    {
                        id = l;
                    }
                    else
                    {
                        var r = (await e.Guild.GetRolesAsync())
                                .Where(x => x.Name.ToLower() == arguments.GetString("role-required").ToLower())
                                .FirstOrDefault();

                        if (r != null)
                        {
                            id = r.Id.ToDbLong();
                        }
                    }

                    if (id != 0)
                    {
                        newRole.RequiredRole = id;
                    }
                }

                await context.SaveChangesAsync();

                new EmbedBuilder()
                .SetTitle("⚙ Role Config")
                .SetColor(102, 117, 127)
                .SetDescription($"Updated {role.Name}!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
        }
示例#24
0
        public async Task ShowProposalsAsync(EventContext e)
        {
            int page = e.Arguments.FirstOrDefault()?.TakeInt() - 1 ?? 0;

            using (var context = new MikiContext())
            {
                MarriageRepository repository = new MarriageRepository(context);

                List <UserMarriedTo> proposals = await repository.GetProposalsReceived(e.Author.Id.ToDbLong());

                List <string> proposalNames = new List <string>();

                foreach (UserMarriedTo p in proposals)
                {
                    long   id = p.GetOther(e.Author.Id.ToDbLong());
                    string u  = (await Global.Client.Discord.GetUserAsync(id.FromDbLong())).Username;
                    proposalNames.Add($"{u} [{id}]");
                }

                int pageCount = (int)Math.Ceiling((float)proposalNames.Count / 35);

                proposalNames = proposalNames.Skip(page * 35)
                                .Take(35)
                                .ToList();

                EmbedBuilder embed = new EmbedBuilder()
                                     .SetTitle(e.Author.Username)
                                     .SetDescription("Here it shows both the people who you've proposed to and who have proposed to you.");

                string output = string.Join("\n", proposalNames);

                embed.AddField("Proposals Recieved", string.IsNullOrEmpty(output) ? "none (yet!)" : output);

                proposals = await repository.GetProposalsSent(e.Author.Id.ToDbLong());

                proposalNames = new List <string>();

                foreach (UserMarriedTo p in proposals)
                {
                    long   id = p.GetOther(e.Author.Id.ToDbLong());
                    string u  = (await Global.Client.Discord.GetUserAsync(id.FromDbLong())).Username;
                    proposalNames.Add($"{u} [{id}]");
                }

                pageCount = Math.Max(pageCount, (int)Math.Ceiling((float)proposalNames.Count / 35));

                proposalNames = proposalNames.Skip(page * 35)
                                .Take(35)
                                .ToList();

                output = string.Join("\n", proposalNames);

                embed.AddField("Proposals Sent", string.IsNullOrEmpty(output) ? "none (yet!)" : output);

                embed.Color        = new Color(1, 0.5f, 0);
                embed.ThumbnailUrl = (await e.Guild.GetMemberAsync(e.Author.Id)).GetAvatarUrl();
                if (pageCount > 1)
                {
                    embed.SetFooter(e.Locale.GetString("page_footer", page + 1, pageCount));
                }
                embed.ToEmbed().QueueToChannel(e.Channel);
            }
        }
示例#25
0
        public async Task CheckAsync(IDiscordMessage e)
        {
            if (e.Author.IsBot)
            {
                return;
            }

            if (isSyncing)
            {
                return;
            }

            try
            {
                if (await e.GetChannelAsync() is IDiscordGuildChannel channel)
                {
                    string key = GetContextKey(channel.GuildId, e.Author.Id);

                    if (lastTimeExpGranted.GetOrAdd(e.Author.Id, DateTime.Now).AddMinutes(1) < DateTime.Now)
                    {
                        int currentExp = 0;
                        if (!await Global.RedisClient.ExistsAsync(key))
                        {
                            using (var context = new MikiContext())
                            {
                                LocalExperience user = await LocalExperience.GetAsync(
                                    context,
                                    channel.GuildId,
                                    e.Author.Id,
                                    e.Author.Username
                                    );

                                await Global.RedisClient.UpsertAsync(key, user.Experience);

                                currentExp = user.Experience;
                            }
                        }
                        else
                        {
                            currentExp = await Global.RedisClient.GetAsync <int>(key);
                        }

                        var bonusExp = MikiRandom.Next(1, 4);
                        currentExp += bonusExp;

                        if (!experienceQueue.ContainsKey(e.Author.Id))
                        {
                            var expObject = new ExperienceAdded()
                            {
                                UserId     = e.Author.Id.ToDbLong(),
                                GuildId    = channel.GuildId.ToDbLong(),
                                Experience = bonusExp,
                                Name       = e.Author.Username,
                            };

                            experienceQueue.AddOrUpdate(e.Author.Id, expObject, (u, eo) =>
                            {
                                eo.Experience += expObject.Experience;
                                return(eo);
                            });
                        }
                        else
                        {
                            experienceQueue[e.Author.Id].Experience += bonusExp;
                        }

                        int level = User.CalculateLevel(currentExp);

                        if (User.CalculateLevel(currentExp - bonusExp) != level)
                        {
                            await LevelUpLocalAsync(e, level);
                        }

                        lastTimeExpGranted.AddOrUpdate(e.Author.Id, DateTime.Now, (x, d) => DateTime.Now);

                        await Global.RedisClient.UpsertAsync(key, currentExp);
                    }
                }

                if (DateTime.Now >= lastDbSync + new TimeSpan(0, 1, 0))
                {
                    isSyncing = true;
                    Log.Message($"Applying Experience for {experienceQueue.Count} users");
                    lastDbSync = DateTime.Now;

                    try
                    {
                        await UpdateGlobalDatabase();
                        await UpdateLocalDatabase();
                        await UpdateGuildDatabase();
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex.Message + "\n" + ex.StackTrace);
                    }
                    finally
                    {
                        experienceQueue.Clear();
                        isSyncing = false;
                    }
                    Log.Message($"Done Applying!");
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }
        }
示例#26
0
        private async Task <EmbedBuilder> BuildMarriageEmbedAsync(EmbedBuilder embed, long userId, MikiContext context, List <UserMarriedTo> marriages)
        {
            StringBuilder builder = new StringBuilder();

            for (int i = 0; i < marriages.Count; i++)
            {
                builder.AppendLine($"`{(i + 1).ToString().PadLeft(2)}:` {(await Global.Client.Discord.GetUserAsync(marriages[i].GetOther(userId).FromDbLong())).Username}");
            }

            embed.Description += "\n\n" + builder.ToString();

            return(embed);
        }
示例#27
0
        public async Task StartRPS(EventContext e, int bet)
        {
            float rewardMultiplier = 1f;

            if (e.Arguments.Count < 2)
            {
                e.ErrorEmbed("You need to choose a weapon!")
                .ToEmbed().QueueToChannel(e.Channel);
            }
            else
            {
                User         user;
                RPSManager   rps           = RPSManager.Instance;
                EmbedBuilder resultMessage = Utils.Embed
                                             .SetTitle("Rock, Paper, Scissors!");

                if (rps.TryParse(e.Arguments.Get(1).Argument, out RPSWeapon playerWeapon))
                {
                    RPSWeapon botWeapon = rps.GetRandomWeapon();

                    resultMessage.SetDescription($"{playerWeapon.Name.ToUpper()} {playerWeapon.Emoji} vs. {botWeapon.Emoji} {botWeapon.Name.ToUpper()}");

                    switch (rps.CalculateVictory(playerWeapon, botWeapon))
                    {
                    case RPSManager.VictoryStatus.WIN:
                    {
                        using (var context = new MikiContext())
                        {
                            user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

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

                                await context.SaveChangesAsync();
                            }
                        }
                        resultMessage.Description += $"\n\nYou won `{(int)(bet * rewardMultiplier)}` mekos! Your new balance is `{user.Currency}`.";
                    }
                    break;

                    case RPSManager.VictoryStatus.LOSE:
                    {
                        using (var context = new MikiContext())
                        {
                            user = await context.Users.FindAsync(e.Author.Id.ToDbLong());

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

                                await context.SaveChangesAsync();
                            }
                        }
                        resultMessage.Description += $"\n\nYou lost `{bet}` mekos ! Your new balance is `{user.Currency}`.";
                    }
                    break;

                    case RPSManager.VictoryStatus.DRAW:
                    {
                        resultMessage.Description += $"\n\nIt's a draw! no mekos were lost!.";
                    }
                    break;
                    }
                }
                else
                {
                    resultMessage.SetDescription("Invalid weapon!").ToEmbed()
                    .QueueToChannel(e.Channel);
                    return;
                }
                resultMessage.ToEmbed().QueueToChannel(e.Channel);
            }
        }
示例#28
0
 public static async Task <ProfileVisuals> GetAsync(ulong userId, MikiContext context)
 => await GetAsync(userId.ToDbLong(), context);
示例#29
0
        private async Task StartFlip(EventContext e, int bet)
        {
            if (e.Arguments.Count < 2)
            {
                e.ErrorEmbed("Please pick either `heads` or `tails`!")
                .ToEmbed().QueueToChannel(e.Channel);
                return;
            }

            string sideParam = e.Arguments.Get(1).Argument.ToLower();

            if (bet <= 0)
            {
                // TODO: add a error message
                return;
            }

            int pickedSide = -1;

            if (sideParam[0] == 'h')
            {
                pickedSide = 1;
            }
            else if (sideParam[0] == 't')
            {
                pickedSide = 0;
            }

            if (pickedSide == -1)
            {
                e.ErrorEmbed("This is not a valid option!")
                .ToEmbed().QueueToChannel(e.Channel);
                return;
            }

            string headsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-default-heads.png";
            string tailsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-default-tails.png";

            if (e.Arguments.Contains("-bonus"))
            {
                headsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-secret-heads.png";
                tailsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-secret-tails.png";
            }

            int    side     = MikiRandom.Next(2);
            string imageUrl = side == 1 ? headsUrl : tailsUrl;

            bool win         = (side == pickedSide);
            int  currencyNow = 0;

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

                if (!win)
                {
                    bet = -bet;
                }
                u.Currency += bet;
                currencyNow = u.Currency;
                await context.SaveChangesAsync();
            }

            string output = "";

            if (win)
            {
                output = e.GetResource("flip_description_win", $"`{bet}`");
            }
            else
            {
                output = e.GetResource("flip_description_lose");
            }

            output += "\n" + e.GetResource("miki_blackjack_new_balance", currencyNow);

            DiscordEmbed embed = Utils.Embed
                                 .SetAuthor(e.GetResource("flip_header") + " | " + e.Author.Username, e.Author.GetAvatarUrl(),
                                            "https://patreon.com/mikibot")
                                 .SetDescription(output)
                                 .SetThumbnail(imageUrl)
                                 .ToEmbed();

            embed.QueueToChannel(e.Channel);
        }
示例#30
0
        public async Task SetRoleLevelAsync(EventContext e)
        {
            using (var context = new MikiContext())
            {
                Locale locale = Locale.GetEntity(e.Channel.Id.ToDbLong());

                List <string> allArgs = new List <string>();
                allArgs.AddRange(e.arguments.Split(' '));
                if (allArgs.Count >= 2)
                {
                    int levelrequirement = int.Parse(allArgs[allArgs.Count - 1]);
                    allArgs.RemoveAt(allArgs.Count - 1);
                    IDiscordRole role = e.Guild.Roles
                                        .Find(r => r.Name.ToLower() == string.Join(" ", allArgs).TrimEnd(' ').TrimStart(' ').ToLower());

                    if (role == null)
                    {
                        await e.ErrorEmbed(e.GetResource("error_role_not_found"))
                        .QueueToChannel(e.Channel);

                        return;
                    }

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

                    if (lr == null)
                    {
                        lr = context.LevelRoles.Add(new LevelRole()
                        {
                            GuildId       = e.Guild.Id.ToDbLong(),
                            RoleId        = role.Id.ToDbLong(),
                            RequiredLevel = levelrequirement
                        }).Entity;

                        IDiscordEmbed embed = Utils.Embed;
                        embed.Title       = "Added Role!";
                        embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";

                        IDiscordUser currentUser = await e.GetCurrentUserAsync();

                        if (!currentUser.HasPermissions(e.Channel, DiscordGuildPermission.ManageRoles))
                        {
                            embed.AddInlineField(e.GetResource("miki_warning"), e.GetResource("setrolelevel_error_no_permissions", $"`{e.GetResource("permission_manage_roles")}`"));
                        }

                        await embed.QueueToChannel(e.Channel);
                    }
                    else
                    {
                        lr.RequiredLevel = levelrequirement;

                        IDiscordEmbed embed = Utils.Embed;
                        embed.Title       = "Updated Role!";
                        embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!";
                        await embed.QueueToChannel(e.Channel);
                    }
                    await context.SaveChangesAsync();
                }
                else
                {
                    await Utils.ErrorEmbed(locale, "Make sure to fill out both the role and the level when creating this!")
                    .QueueToChannel(e.Channel);
                }
            }
        }