예제 #1
0
        private async Task Client_GuildUpdated(Discord.WebSocket.SocketGuild arg1, Discord.WebSocket.SocketGuild arg2)
        {
            if (arg1.Name != arg2.Name)
            {
                using (MikiContext context = new MikiContext())
                {
                    GuildUser g = await context.GuildUsers.FindAsync(arg1.Id.ToDbLong());

                    g.Name = arg2.Name;
                    await context.SaveChangesAsync();
                }
            }
        }
예제 #2
0
        private async Task UpdateGuildUserCountAsync(IDiscordGuild guild)
        {
            using var scope = app.Services.CreateScope();
            var context = scope.ServiceProvider.GetService <MikiDbContext>();

            GuildUser g = await context.GuildUsers.FindAsync((long)guild.Id)
                          .ConfigureAwait(false);

            g.UserCount = guild.MemberCount;

            await context.SaveChangesAsync()
            .ConfigureAwait(false);
        }
예제 #3
0
        public async Task GuildProfile(EventContext context)
        {
            using (MikiContext database = new MikiContext())
            {
                GuildUser g = await database.GuildUsers.FindAsync(context.Guild.Id.ToDbLong());

                if (g == null)
                {
                    await GuildUser.Create(context.Guild);

                    g = await database.GuildUsers.FindAsync(context.Guild.Id.ToDbLong());
                }

                int rank  = g.GetGlobalRank();
                int level = g.CalculateLevel(g.Experience);

                EmojiBarSet onBarSet  = new EmojiBarSet("<:mbaronright:334479818924228608>", "<:mbaronmid:334479818848468992>", "<:mbaronleft:334479819003789312>");
                EmojiBarSet offBarSet = new EmojiBarSet("<:mbaroffright:334479818714513430>", "<:mbaroffmid:334479818504536066>", "<:mbaroffleft:334479818949394442>");

                EmojiBar expBar = new EmojiBar(g.CalculateMaxExperience(g.Experience), onBarSet, offBarSet, 6);

                IDiscordEmbed embed = Utils.Embed
                                      .SetAuthor(g.Name, context.Guild.AvatarUrl, "https://miki.veld.one")
                                      .SetColor(0.1f, 0.6f, 1)
                                      .SetThumbnailUrl("http://veld.one/assets/img/transparentfuckingimage.png")
                                      .AddInlineField(context.GetResource("miki_terms_level"), level.ToString());

                string expBarString = await expBar.Print(g.Experience, context.Channel);

                if (string.IsNullOrWhiteSpace(expBarString))
                {
                    embed.AddInlineField(context.GetResource("miki_terms_experience"), "[" + g.Experience + " / " + g.CalculateMaxExperience(g.Experience) + "]");
                }
                else
                {
                    embed.AddInlineField(context.GetResource("miki_terms_experience") + $" [{g.Experience} / {g.CalculateMaxExperience(g.Experience)}]", expBarString);
                }

                embed.AddInlineField(context.GetResource("miki_terms_rank"), "#" + ((rank <= 10) ? $"**{rank}**" : rank.ToString()))
                .AddInlineField(context.GetResource("miki_module_general_guildinfo_users"), g.UserCount.ToString());

                if (g.RivalId != 0)
                {
                    GuildUser rival = await g.GetRival();

                    embed.AddInlineField(context.GetResource("miki_terms_rival"), $"{rival.Name} [{rival.Experience}]");
                }

                await embed.SendToChannel(context.Channel);
            }
        }
예제 #4
0
        private async Task Client_GuildUpdated(IDiscordGuild arg1, IDiscordGuild arg2)
        {
            if (arg1.Name != arg2.Name)
            {
                using (var scope = MikiApp.Instance.Services.CreateScope())
                {
                    var       context = scope.ServiceProvider.GetService <MikiDbContext>();
                    GuildUser g       = await context.GuildUsers.FindAsync(arg1.Id.ToDbLong());

                    g.Name = arg2.Name;
                    await context.SaveChangesAsync();
                }
            }
        }
예제 #5
0
        public async Task GuildProfile(IContext e)
        {
            var context = e.GetService <MikiDbContext>();

            var       locale = e.GetLocale();
            GuildUser g      = await context.GuildUsers.FindAsync(e.GetGuild().Id.ToDbLong());

            int rank = await g.GetGlobalRankAsync(context);

            int level = g.CalculateLevel(g.Experience);

            EmojiBarSet onBarSet  = new EmojiBarSet("<:mbarlefton:391971424442646534>", "<:mbarmidon:391971424920797185>", "<:mbarrighton:391971424488783875>");
            EmojiBarSet offBarSet = new EmojiBarSet("<:mbarleftoff:391971424824459265>", "<:mbarmidoff:391971424824197123>", "<:mbarrightoff:391971424862208000>");

            EmojiBar expBar = new EmojiBar(g.CalculateMaxExperience(g.Experience), onBarSet, offBarSet, 6);

            EmbedBuilder embed = new EmbedBuilder()
                                 .SetAuthor(g.Name, e.GetGuild().IconUrl, "https://miki.veld.one")
                                 .SetColor(0.1f, 0.6f, 1)
                                 .AddInlineField(locale.GetString("miki_terms_level"), level.ToString("N0"));

            if ((e.GetGuild().IconUrl ?? "") != "")
            {
                embed.SetThumbnail("http://veld.one/assets/img/transparentfuckingimage.png");
            }

            string expBarString = expBar.Print(g.Experience);

            embed.AddInlineField(e.GetLocale().GetString("miki_terms_experience"),
                                 $"[{g.Experience:N0} / {g.CalculateMaxExperience(g.Experience):N0}]\n"
                                 + (expBarString ?? ""));

            embed.AddInlineField(
                e.GetLocale().GetString("miki_terms_rank"),
                "#" + (rank <= 10 ? $"**{rank:N0}**" : rank.ToString("N0"))
                ).AddInlineField(
                e.GetLocale().GetString("miki_module_general_guildinfo_users"),
                g.UserCount.ToString()
                );

            GuildUser rival = await g.GetRivalOrDefaultAsync(context);

            if (rival != null)
            {
                embed.AddInlineField(e.GetLocale().GetString("miki_terms_rival"), $"{rival.Name} [{rival.Experience:N0}]");
            }

            await embed.ToEmbed()
            .QueueAsync(e, e.GetChannel());
        }
예제 #6
0
        public void User_ShouldAddInvalidXpAmount()
        {
            GuildUser testUser = new GuildUser(00000001, 000000001, 0);

            int exp = -1000;

            int expect = 0;

            testUser.Xp += exp;

            int actual = testUser.Xp;

            Assert.Equal(expect, actual);
        }
예제 #7
0
        public async Task GuildNewRival(EventContext e)
        {
            using (MikiContext db = new MikiContext())
            {
                GuildUser thisGuild = await db.GuildUsers.FindAsync(e.Guild.Id.ToDbLong());

                if (thisGuild == null)
                {
                    e.ErrorEmbed(e.GetResource("guild_error_null"))
                    .Build().QueueToChannel(e.Channel);
                    return;
                }

                if (thisGuild.LastRivalRenewed.AddDays(1) > DateTime.Now)
                {
                    Utils.Embed
                    .WithTitle(e.GetResource("miki_terms_rival"))
                    .WithDescription(e.GetResource("guildnewrival_error_timer_running"))
                    .Build().QueueToChannel(e.Channel);
                    return;
                }

                List <GuildUser> rivalGuilds = await db.GuildUsers
                                               .Where((g) => Math.Abs(g.UserCount - thisGuild.UserCount) < (g.UserCount / 4) && g.RivalId == 0 && g.Id != thisGuild.Id)
                                               .ToListAsync();

                if (rivalGuilds.Count == 0)
                {
                    e.ErrorEmbed(e.GetResource("guildnewrival_error_matchmaking_failed"))
                    .Build().QueueToChannel(e.Channel);
                    return;
                }

                int random = MikiRandom.Next(0, rivalGuilds.Count);

                GuildUser rivalGuild = await db.GuildUsers.FindAsync(rivalGuilds[random].Id);

                thisGuild.RivalId  = rivalGuild.Id;
                rivalGuild.RivalId = thisGuild.Id;

                thisGuild.LastRivalRenewed = DateTime.Now;

                await db.SaveChangesAsync();

                Utils.Embed
                .WithTitle(e.GetResource("miki_terms_rival"))
                .WithDescription(e.GetResource("guildnewrival_success", rivalGuild.Name))
                .Build().QueueToChannel(e.Channel);
            }
        }
예제 #8
0
        public async Task GuildProfile(EventContext e)
        {
            using (MikiContext context = new MikiContext())
            {
                GuildUser g = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong());

                int rank  = g.GetGlobalRank(context);
                int level = g.CalculateLevel(g.Experience);

                EmojiBarSet onBarSet  = new EmojiBarSet("<:mbarlefton:391971424442646534>", "<:mbarmidon:391971424920797185>", "<:mbarrighton:391971424488783875>");
                EmojiBarSet offBarSet = new EmojiBarSet("<:mbarleftoff:391971424824459265>", "<:mbarmidoff:391971424824197123>", "<:mbarrightoff:391971424862208000>");

                EmojiBar expBar = new EmojiBar(g.CalculateMaxExperience(g.Experience), onBarSet, offBarSet, 6);

                EmbedBuilder embed = new EmbedBuilder()
                                     .SetAuthor(g.Name, e.Guild.IconUrl, "https://miki.veld.one")
                                     .SetColor(0.1f, 0.6f, 1)
                                     .SetThumbnail("http://veld.one/assets/img/transparentfuckingimage.png")
                                     .AddInlineField(e.Locale.GetString("miki_terms_level"), level.ToString());

                string expBarString = await expBar.Print(g.Experience, e.Guild, e.Channel as IDiscordGuildChannel);

                if (string.IsNullOrWhiteSpace(expBarString))
                {
                    embed.AddInlineField(e.Locale.GetString("miki_terms_experience"), "[" + g.Experience + " / " + g.CalculateMaxExperience(g.Experience) + "]");
                }
                else
                {
                    embed.AddInlineField(e.Locale.GetString("miki_terms_experience") + $" [{g.Experience} / {g.CalculateMaxExperience(g.Experience)}]", expBarString);
                }

                embed.AddInlineField(
                    e.Locale.GetString("miki_terms_rank"),
                    "#" + ((rank <= 10) ? $"**{rank}**" : rank.ToString())
                    ).AddInlineField(
                    e.Locale.GetString("miki_module_general_guildinfo_users"),
                    g.UserCount.ToString()
                    );

                if (g.RivalId != 0)
                {
                    GuildUser rival = await g.GetRival(context);

                    embed.AddInlineField(e.Locale.GetString("miki_terms_rival"), $"{rival.Name} [{rival.Experience}]");
                }

                embed.ToEmbed().QueueToChannel(e.Channel);
            }
        }
예제 #9
0
        public static async Task LogWarn(GuildUser user, Punishment warn)
        {
            try
            {
                var socketGuild = Global.Client.GetGuild(user.GuildID);
                var discordUser = socketGuild.GetUser(user.ID);
                var guild       = await Guilds.GetAsync(discordUser.Guild);

                var log   = ValidateLog(guild, socketGuild, LogEvent.Warn);
                var embed = CreatePunishmentEmbed(warn, discordUser, log.Colour, LogEvent.Warn);

                await log.Channel.SendMessageAsync(embed : embed);
            }
            catch (Exception) {}
        }
예제 #10
0
        private async Task UpdateGuildUserCountAsync(ulong id)
        {
            using (MikiContext context = new MikiContext())
            {
                GuildUser g = await context.GuildUsers.FindAsync(id.ToDbLong());

                if (g == null)
                {
                    return;
                }

                g.UserCount = Bot.instance.Client.GetGuild(id).Users.Count;
                await context.SaveChangesAsync();
            }
        }
예제 #11
0
        public async Task GuildBankInfoAsync(EventContext e, GuildUser c)
        {
            string prefix = await e.EventSystem.GetCommandHandler <SimpleCommandHandler>().GetDefaultPrefixValueAsync(e.Guild.Id);

            e.CreateEmbedBuilder()
            .WithTitle(new LanguageResource("guildbank_title", e.Guild.Name))
            .WithDescription(new LanguageResource("guildbank_info_description"))
            .WithColor(new Color(255, 255, 255))
            .WithThumbnailUrl("https://imgur.com/KXtwIWs.png")
            .AddField(
                new LanguageResource("guildbank_info_help"),
                new LanguageResource("guildbank_info_help_description", prefix),
                true
                ).Build().QueueToChannel(e.Channel);
        }
예제 #12
0
        private static void trackVoiceChannel(GuildUser guildUser)
        {
            SocketGuildUser trackedUser = client.GetGuild(guildUser.GuildId).Users.ToList().Find(u => u.Id == guildUser.Id);

            if (trackedUser == null)
            {
                return;
            }
            if (trackedUser.VoiceChannel == null)
            {
                return;
            }
            guildUser.Xp        += credentials.gainedXp;
            guildUser.LastXpTime = DateTime.Now;
        }
예제 #13
0
        public void GuildBankBalance(EventContext e, MikiContext context, GuildUser c)
        {
            BankAccount.GetAsync(context, c, e.Author);

            e.CreateEmbedBuilder()
            .WithTitle(new LanguageResource("guildbank_title", e.Guild.Name))
            .WithColor(new Color(255, 255, 255))
            .WithThumbnailUrl("https://imgur.com/KXtwIWs.png")
            .AddField(
                new LanguageResource("guildbank_balance_title"),
                new LanguageResource("guildbank_balance", c.Currency),
                true
                )
            .AddField(
                new LanguageResource("guildbank_balance_total_deposited", )
                ).Build().QueueToChannel(e.Channel);
        }
예제 #14
0
        public async Task GuildBankBalance(EventContext e, MikiContext context, GuildUser c)
        {
            var account = await BankAccount.GetAsync(context, e.Author.Id, e.Guild.Id);

            e.CreateEmbedBuilder()
            .WithTitle(new LanguageResource("guildbank_title", e.Guild.Name))
            .WithColor(new Color(255, 255, 255))
            .WithThumbnailUrl("https://imgur.com/KXtwIWs.png")
            .AddField(
                new LanguageResource("guildbank_balance_title"),
                new LanguageResource("guildbank_balance", c.Currency),
                true
                )
            .AddField(
                new LanguageResource("guildbank_contributed", "{0}"), new StringResource(account.TotalDeposited.ToString())
                ).Build().QueueToChannel(e.Channel);
        }
예제 #15
0
        public async Task SetGuildConfig(EventContext e)
        {
            using (MikiContext context = new MikiContext())
            {
                string[]  arguments = e.arguments.Split(' ');
                GuildUser g         = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong());

                switch (arguments[0])
                {
                case "expneeded":
                {
                    if (arguments.Length > 1)
                    {
                        if (int.TryParse(arguments[1], out int value))
                        {
                            g.MinimalExperienceToGetRewards = value;

                            await Utils.Embed
                            .SetTitle(e.GetResource("miki_terms_config"))
                            .SetDescription(e.GetResource("guildconfig_expneeded", value))
                            .QueueToChannel(e.Channel);
                        }
                    }
                }
                break;

                case "visible":
                {
                    if (arguments.Length > 1)
                    {
                        g.VisibleOnLeaderboards = arguments[1].ToBool();

                        string resourceString = g.VisibleOnLeaderboards ? "guildconfig_visibility_true" : "guildconfig_visibility_false";

                        await Utils.Embed
                        .SetTitle(e.GetResource("miki_terms_config"))
                        .SetDescription(resourceString)
                        .QueueToChannel(e.Channel);
                    }
                }
                break;
                }
                await context.SaveChangesAsync();
            }
        }
예제 #16
0
        public async Task GuildBankDepositAsync(EventContext e, MikiContext context, GuildUser c)
        {
            int?totalDeposited = e.Arguments.Get(1).AsInt() ?? 0;

            User user = await User.GetAsync(context, e.Author);

            await user.AddCurrencyAsync(-totalDeposited.Value);

            c.AddCurrency(totalDeposited.Value, user);

            e.CreateEmbedBuilder()
            .WithTitle(new LanguageResource("guildbank_deposit_title", e.Author.Username, totalDeposited))
            .WithColor(new Color(255, 255, 255))
            .WithThumbnailUrl("https://imgur.com/KXtwIWs.png")
            .Build().QueueToChannel(e.Channel);

            await context.SaveChangesAsync();
        }
예제 #17
0
        private static async Task voiceChannelLeft(SocketUser disUser, SocketVoiceState voiceStateOld, SocketVoiceState voiceStateNew)
        {
            if (voiceStateNew.VoiceChannel != null || voiceStateOld.VoiceChannel?.Id == voiceStateNew.VoiceChannel?.Id || disUser.IsBot)
            {
                return;
            }
            User      currentUser = DatabaseAccess.Instance.Users.Find(u => u.Id == disUser.Id);
            GuildUser guildUser   = currentUser.GuildSpecificUser[voiceStateOld.VoiceChannel.Guild.Id];

            if ((!currentUser.HasMuted && (DateTime.Now - currentUser.LastFarewell).TotalHours > 12) && hasCleverbotApiKey)
            {
                //send private message
                await disUser.SendMessageAsync(MoodDictionary.getMoodMessage("Bye"));//Bye

                currentUser.LastFarewell = DateTime.Now;
            }
            stopTrackingVoiceChannel(guildUser);
        }
예제 #18
0
        public static async Task LogUnmute(GuildUser user, Punishment mute = null)
        {
            try
            {
                var socketGuild = Global.Client.GetGuild(user.GuildID);
                var discordUser = socketGuild.GetUser(user.ID);
                var guild       = await Guilds.GetAsync(discordUser.Guild);

                mute ??= user.Status.Mutes.LastOrDefault();

                var log        = ValidateLog(guild, socketGuild, LogEvent.Unmute);
                var instigator = discordUser.Guild.GetUser(mute?.InstigatorID ?? 0);
                var embed      = CreatePunishmentEmbed(mute, discordUser, log.Colour, LogEvent.Unmute);

                await log.Channel.SendMessageAsync(embed : embed);
            }
            catch (Exception) {}
        }
예제 #19
0
        private static async Task voiceChannelJoined(SocketUser disUser, SocketVoiceState voiceStateOld, SocketVoiceState voiceStateNew)
        {
            //if guild joined
            if (voiceStateOld.VoiceChannel?.Id == voiceStateNew.VoiceChannel?.Id || voiceStateNew.VoiceChannel == null || disUser.IsBot)
            {
                return;
            }
            User      currentUser = DatabaseAccess.Instance.Users.Find(u => u.Id == disUser.Id);
            GuildUser guildUser   = currentUser.GuildSpecificUser[voiceStateNew.VoiceChannel.Guild.Id];

            if ((!currentUser.HasMuted && (DateTime.Now - currentUser.LastGreeting).TotalHours > 12) && hasCleverbotApiKey)
            {
                //send private message
                await disUser.SendMessageAsync(String.Format(MoodDictionary.getMoodMessage("Hello"), disUser.Username));//Hello

                currentUser.LastGreeting = DateTime.Now;
            }
            StartTrackingVoiceChannel(guildUser);
        }
예제 #20
0
        public async Task GuildBankDepositAsync(EventContext e, MikiContext context, GuildUser c)
        {
            int totalDeposited = e.Arguments.Get(1).TakeInt() ?? 0;

            User user = await User.GetAsync(context, e.Author.Id, e.Author.Username);

            user.RemoveCurrency(totalDeposited);
            c.Currency += totalDeposited;

            BankAccount account = await BankAccount.GetAsync(context, e.Author.Id, e.Guild.Id);

            account.Deposit(totalDeposited);

            new EmbedBuilder()
            .SetAuthor("Guild bank", "https://imgur.com/KXtwIWs.png")
            .SetDescription(e.Locale.GetString("guildbank_deposit_title", e.Author.Username, totalDeposited.ToFormattedString()))
            .SetColor(new Color(255, 255, 255))
            .ToEmbed().QueueToChannel(e.Channel);
        }
예제 #21
0
        public async Task GuildNewRival(EventContext context)
        {
            using (MikiContext db = new MikiContext())
            {
                GuildUser thisGuild = await db.GuildUsers.FindAsync(context.Guild.Id.ToDbLong());

                if (thisGuild.LastRivalRenewed.AddDays(1) > DateTime.Now)
                {
                    await Utils.Embed
                    .SetTitle(context.GetResource("miki_terms_rival"))
                    .SetDescription(context.GetResource("guildnewrival_error_timer_running"))
                    .SendToChannel(context.Channel);

                    return;
                }

                List <GuildUser> rivalGuilds = db.GuildUsers.Where((g) => Math.Abs(g.UserCount - thisGuild.UserCount) < (g.UserCount / 4) && g.RivalId == 0 && g.Id != thisGuild.Id).ToList();

                if (rivalGuilds.Count == 0)
                {
                    await context.ErrorEmbed(context.GetResource("guildnewrival_error_matchmaking_failed"))
                    .SendToChannel(context.Channel);

                    return;
                }

                int random = Global.random.Next(0, rivalGuilds.Count);

                GuildUser rivalGuild = await db.GuildUsers.FindAsync(rivalGuilds[random].Id);

                thisGuild.RivalId  = rivalGuild.Id;
                rivalGuild.RivalId = thisGuild.Id;

                thisGuild.LastRivalRenewed = DateTime.Now;

                await db.SaveChangesAsync();

                await Utils.Embed
                .SetTitle(context.GetResource("miki_terms_rival"))
                .SetDescription(context.GetResource("guildnewrival_success"))
                .SendToChannel(context.Channel);
            }
        }
예제 #22
0
        public async Task GuildBankDepositAsync(EventContext e, MikiContext context, GuildUser c)
        {
            int totalDeposited = e.Arguments.Get(1).TakeInt() ?? 0;

            User user = await User.GetAsync(context, e.Author.Id, e.Author.Username);

            await user.AddCurrencyAsync(-totalDeposited);

            c.Currency += totalDeposited;

            BankAccount account = await BankAccount.GetAsync(context, e.Author.Id, e.Guild.Id);

            account.Deposit(totalDeposited);

            e.CreateEmbedBuilder()
            .WithTitle("guildbank_deposit_title", e.Author.Username, totalDeposited)
            .WithColor(new Color(255, 255, 255))
            .WithThumbnailUrl("https://imgur.com/KXtwIWs.png")
            .Build().QueueToChannel(e.Channel);
        }
예제 #23
0
        /// <summary>
        /// Tries to get a GuildUser. If it cannot find one it creates one and adds it to the guildUser Dbset to be tracked.
        /// This does NOT save tho!
        /// If it cannot find a user it will CREATE AND SAVE a guild object bcs of the foreign key constraint!
        /// </summary>
        public static async Task <GuildUser> GetOrCreateGuildUser(ulong guildId, ulong userId, SoraContext context)
        {
            var guildUser = await context.GuildUsers
                            .FirstOrDefaultAsync(x => x.UserId == userId && x.GuildId == guildId).ConfigureAwait(false);

            if (guildUser != null)
            {
                return(guildUser);
            }
            // Create a user and return him
            // Because of the foreign key constraints we have to make sure a guild exists and a user
            // This will create the guild
            await GetOrSetAndGetGuildNoSave(guildId, context).ConfigureAwait(false);

            await context.Users.GetOrCreateUserNoSaveAsync(userId).ConfigureAwait(false);

            await context.SaveChangesAsync().ConfigureAwait(false);

            // Now we add the user
            guildUser = new GuildUser(userId, guildId, 0);
            context.GuildUsers.Add(guildUser);
            return(guildUser);
        }
예제 #24
0
 public SocketGuildUser(GuildUser guildUser) : base(guildUser)
 {
     RoleIDs     = guildUser.RoleIDs;
     Nickname    = guildUser.Nickname;
     Permissions = guildUser.Permissions;
 }
예제 #25
0
        public async Task GuildWeekly(EventContext context)
        {
            using (MikiContext database = new MikiContext())
            {
                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 (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("Weekly")
                        .SetDescription("You have no rival yet, Server admins: use `>guildnewrival` to start matchmaking!")
                        .SendToChannel(context.Channel);

                        return;
                    }

                    if (rival.Experience > thisGuild.Experience)
                    {
                        await Utils.Embed
                        .SetTitle("Weekly")
                        .SetDescription("you got to have a higher level than your rival!")
                        .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());

                    user.Currency += mekosGained;

                    await Utils.Embed
                    .SetTitle("Weekly bonus")
                    .AddInlineField("Mekos", mekosGained.ToString())
                    .SendToChannel(context.Channel);

                    timer.Value = DateTime.Now;
                    await database.SaveChangesAsync();
                }
                else
                {
                    await Utils.Embed
                    .SetTitle("Weekly")
                    .SetDescription("You've already used your weekly, available again in " + (timer.Value.AddDays(7) - DateTime.Now).ToTimeString())
                    .SendToChannel(context.Channel);
                }
            }
        }
예제 #26
0
        public async Task <Stream> CreateXpImageAsync(AdminCommandContext context, CachedUser target)
        {
            var output = new MemoryStream();

            try
            {
                var user = await context.Database.GetOrCreateGlobalUserAsync(target.Id);

                var globalUsers = await context.Database.GlobalUsers.OrderByDescending(x => x.TotalXp).ToListAsync();

                GuildUser guildUser     = null;
                Guild     guild         = null;
                Stream    guildIcon     = null;
                var       guildPosition = 1;
                if (target is CachedMember guildTarget)
                {
                    guildUser = await context.Database.GetOrCreateGuildUserAsync(target.Id, guildTarget.Guild.Id);

                    guild = await context.Database.GetOrCreateGuildAsync(guildTarget.Guild.Id);

                    guildIcon = await _http.GetStreamAsync(guildTarget.Guild.GetIconUrl());

                    var guildUsers = await context.Database.GuildUsers.OrderByDescending(x => x.TotalXp).ToListAsync();

                    guildPosition = guildUsers.IndexOf(guildUser) + 1;
                }

                var guildOffset = guild?.Settings.HasFlag(GuildSettings.XpTracking) == true
                    ? 45
                    : 0;

                using var background   = Image.Load <Rgba32>(new FileStream("./Data/Images/01.png", FileMode.Open));
                using var avatarStream = await _http.GetStreamAsync(target.GetAvatarUrl());

                using var avatar             = Image.Load <Rgba32>(avatarStream);
                using var canvas             = new Image <Rgba32>(Configuration.Default, 450, 300);
                using var currentLevelStream = await _http.GetStreamAsync(EmojiTools.GetUrl(GetLevelEmoji(user)));

                using var currentLevel = Image.Load <Rgba32>(currentLevelStream);
                currentLevel.Mutate(x => x.Resize(45 / currentLevel.Height * currentLevel.Width, 45));

                Stream currentGuildLevelStream = null;
                if (guildUser is { })
                {
                    currentGuildLevelStream = await _http.GetStreamAsync(EmojiTools.GetUrl(GetLevelEmoji(guildUser)));
                }

                canvas.Mutate(cnvs =>
                {
                    var sb = new StringBuilder();
                    foreach (var c in target.Name)
                    {
                        if (char.IsLetterOrDigit(c))
                        {
                            sb.Append(c);
                        }
                    }

                    sb.Append($"#{target.Discriminator}");

                    var userFontSize = 20;
                    var box          = TextMeasurer.MeasureBounds(sb.ToString(),
                                                                  new RendererOptions(ImageTools.Fonts.TF2(userFontSize)));
                    while (box.Width > 420 || box.Height > 20)
                    {
                        box = TextMeasurer.MeasureBounds(sb.ToString(),
                                                         new RendererOptions(ImageTools.Fonts.TF2(--userFontSize)));
                    }

                    // Draw XP image (background)
                    cnvs.DrawImage(background, PixelColorBlendingMode.Normal, 1);

                    // Draw outer bounding box
                    cnvs.FillPolygon(ImageTools.Colors.DarkButTransparent,
                                     new PointF(10, 190 - guildOffset),
                                     new PointF(440, 190 - guildOffset),

                                     /*
                                      * new PointF(440, 210 - guildReduction),
                                      * new PointF(10, 210 - guildReduction),
                                      * new PointF(440, 210 - guildReduction),
                                      */
                                     new PointF(440, 290 - guildOffset),
                                     new PointF(10, 290 - guildOffset));

                    // Draw avatar bounding box
                    cnvs.FillPolygon(ImageTools.Colors.Blurple,
                                     new PointF(385, 215 - guildOffset),
                                     new PointF(435, 215 - guildOffset),
                                     new PointF(435, 265 - guildOffset),
                                     new PointF(385, 265 - guildOffset));

                    // Draw avatar
                    cnvs.DrawImage(avatar.Clone(x => x.Resize(50, 50)),
                                   new Point(385, 215 - guildOffset), PixelColorBlendingMode.Normal,
                                   PixelAlphaCompositionMode.SrcOver, 1);

                    // Draw avatar bounding box outline
                    cnvs.DrawPolygon(Rgba32.WhiteSmoke, 2,
                                     new PointF(386, 216 - guildOffset),
                                     new PointF(434, 216 - guildOffset),
                                     new PointF(434, 264 - guildOffset),
                                     new PointF(386, 264 - guildOffset));

                    // Write username
                    cnvs.DrawText(sb.ToString().Trim(), ImageTools.Fonts.TF2(userFontSize),
                                  Rgba32.WhiteSmoke, new PointF(15, 195 - guildOffset));

                    /* Write user info
                     * if (!string.IsNullOrWhiteSpace(global.Info))
                     * {
                     *  cnvs.DrawText(new TextGraphicsOptions { WrapTextWidth = 350 },
                     *      global.Info,
                     *      ImageTools.Fonts.TF2Secondary(13),
                     *      Rgba32.WhiteSmoke,
                     *      new PointF(15, 215 - guildOffset));
                     * }*/

                    // Draw inner box (XP bar outline)
                    cnvs.FillPolygon(ImageTools.Colors.LessDark,
                                     new PointF(75, 272 - guildOffset),
                                     new PointF(435, 272 - guildOffset),
                                     new PointF(435, 285 - guildOffset),
                                     new PointF(75, 285 - guildOffset));

                    // Draw current XP bar
                    cnvs.FillPolygon(ImageTools.Colors.XpBar,
                                     new PointF(77, 274 - guildOffset),
                                     new PointF(356F * ((float)user.CurrentLevelXp / user.NextLevelXp) + 77,
                                                274 - guildOffset),
                                     new PointF(356F * ((float)user.CurrentLevelXp / user.NextLevelXp) + 77,
                                                283 - guildOffset),
                                     new PointF(77, 283 - guildOffset));

                    // Write current level text
                    cnvs.DrawText(new TextGraphicsOptions {
                        HorizontalAlignment = HorizontalAlignment.Center
                    },
                                  $"Tier {user.Tier}, Level {user.Level} ({user.Grade} Grade)",
                                  ImageTools.Fonts.TF2(13),
                                  ImageTools.Colors.GetGradeColor(user.Grade),
                                  new PointF(255, 259 - guildOffset));

                    // Write current XP text
                    cnvs.DrawText(new TextGraphicsOptions {
                        HorizontalAlignment = HorizontalAlignment.Center
                    },
                                  $"{user.TotalXp} / {user.NextLevelTotalXp} XP",
                                  ImageTools.Fonts.TF2(13),
                                  Rgba32.WhiteSmoke,
                                  new PointF(255, 273 - guildOffset));

                    // Draw current level
                    cnvs.DrawImage(
                        currentLevel.Clone(x => x.Resize(45 / currentLevel.Height * currentLevel.Width, 45)),
                        ImageTools.Justify(new Point(45, 285 - guildOffset), currentLevel, Justification.BottomCenter),
                        PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver, 1);

                    // Write current global position
                    cnvs.DrawText(new TextGraphicsOptions {
                        HorizontalAlignment = HorizontalAlignment.Center
                    },
                                  $"Global position #{globalUsers.IndexOf(user) + 1}",
                                  ImageTools.Fonts.TF2(11),
                                  Rgba32.WhiteSmoke,
                                  new PointF(255, 248 - guildOffset));

                    if (guildUser is { } && guildOffset > 0)
                    {
                        // Draw guild bounding box
                        // 270
                        cnvs.FillPolygon(ImageTools.Colors.DarkButTransparent,
                                         new PointF(10, 250),
                                         new PointF(440, 250),
                                         new PointF(440, 295),
                                         new PointF(10, 295));

                        // Draw guild XP bar outline
                        cnvs.FillPolygon(ImageTools.Colors.LessDark,
                                         new PointF(75, 277),
                                         new PointF(435, 277),
                                         new PointF(435, 290),
                                         new PointF(75, 290));

                        // Draw guild XP bar
                        cnvs.FillPolygon(ImageTools.Colors.XpBar,
                                         new PointF(77, 279),
                                         new PointF(356F * ((float)guildUser.CurrentLevelXp / guildUser.NextLevelXp) + 77,
                                                    279),
                                         new PointF(356F * ((float)guildUser.CurrentLevelXp / guildUser.NextLevelXp) + 77,
                                                    288),
                                         new PointF(77, 288));

                        // Write current guild level text
                        cnvs.DrawText(new TextGraphicsOptions {
                            HorizontalAlignment = HorizontalAlignment.Center
                        },
                                      $"Tier {guildUser.Tier}, Level {guildUser.Level} ({guildUser.Grade} Grade)",
                                      ImageTools.Fonts.TF2(13),
                                      ImageTools.Colors.GetGradeColor(guildUser.Grade),
                                      new PointF(255, 264));

                        // Write current guild XP text
                        cnvs.DrawText(new TextGraphicsOptions {
                            HorizontalAlignment = HorizontalAlignment.Center
                        },
                                      $"{guildUser.TotalXp} / {guildUser.NextLevelTotalXp} XP",
                                      ImageTools.Fonts.TF2(13),
                                      Rgba32.WhiteSmoke,
                                      new PointF(255, 278));

                        // using (var guildLevel = Image.Load(guildLevelStream))
                        using var guildImage        = Image.Load <Rgba32>(guildIcon);
                        using var currentGuildLevel = Image.Load <Rgba32>(currentGuildLevelStream);
                        currentGuildLevel.Mutate(x =>
                                                 x.Resize(40 / currentGuildLevel.Height * currentGuildLevel.Width, 40));

                        // Draw current guild level
                        cnvs.DrawImage(currentGuildLevel,
                                       ImageTools.Justify(new Point(45, 292), currentGuildLevel, Justification.BottomCenter),
                                       PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver, 1);

                        // Draw current guild icon
                        guildImage.Mutate(img => img.Resize(18, 18));
                        cnvs.DrawImage(guildImage,
                                       ImageTools.Justify(new Point(435, 255), guildImage, Justification.TopRight),
                                       PixelColorBlendingMode.Normal, PixelAlphaCompositionMode.SrcOver, 1f);

                        // Write current guild position
                        cnvs.DrawText(new TextGraphicsOptions {
                            HorizontalAlignment = HorizontalAlignment.Center
                        },
                                      $"Guild position #{guildPosition}",
                                      ImageTools.Fonts.TF2(11),
                                      Rgba32.WhiteSmoke,
                                      new PointF(255, 253));
                    }
                });
예제 #27
0
        public async Task GuildWeekly(EventContext context)
        {
            using (MikiContext database = new MikiContext())
            {
                Locale          locale   = Locale.GetEntity(context.Channel.Id);
                LocalExperience thisUser = await database.LocalExperience.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 = (await database.Timers.AddAsync(new Timer()
                        {
                            GuildId = context.Guild.Id.ToDbLong(),
                            UserId = context.Author.Id.ToDbLong(),
                            Value = DateTime.Now.AddDays(-30)
                        })).Entity;
                        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"))
                            .QueueToChannel(context.Channel);

                            return;
                        }

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

                            return;
                        }

                        int mekosGained = (int)Math.Round((((MikiRandom.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())
                        .QueueToChannel(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)))
                        .QueueToChannel(context.Channel);
                    }
                }
                else
                {
                    await Utils.Embed
                    .SetTitle(locale.GetString("miki_terms_weekly"))
                    .SetDescription(locale.GetString("miki_guildweekly_insufficient_exp", thisGuild.MinimalExperienceToGetRewards))
                    .QueueToChannel(context.Channel);
                }
            }
        }
예제 #28
0
        public async Task GuildBankDepositAsync(CommandContext e, MikiDbContext context, GuildUser c)
        {
            if (!e.Arguments.Take(out int totalDeposited))
            {
                // TODO: No mekos deposit error
                return;
            }

            User user = await User.GetAsync(context, e.Author.Id, e.Author.Username);

            user.RemoveCurrency(totalDeposited);
            c.Currency += totalDeposited;

            BankAccount account = await BankAccount.GetAsync(context, e.Author.Id, e.Guild.Id);

            account.Deposit(totalDeposited);

            await new EmbedBuilder()
            .SetAuthor("Guild bank", "https://imgur.com/KXtwIWs.png")
            .SetDescription(e.Locale.GetString("guildbank_deposit_title", e.Author.Username, totalDeposited.ToFormattedString()))
            .SetColor(new Color(255, 255, 255))
            .ToEmbed().QueueToChannelAsync(e.Channel);
        }
예제 #29
0
        public async Task SetGuildConfig(EventContext e)
        {
            using (MikiContext context = new MikiContext())
            {
                GuildUser g = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong());

                ArgObject arg = e.Arguments.FirstOrDefault();

                if (arg != null)
                {
                    switch (arg.Argument)
                    {
                    case "expneeded":
                    {
                        arg = arg.Next();

                        if (arg != null)
                        {
                            if (int.TryParse(arg.Argument, out int value))
                            {
                                g.MinimalExperienceToGetRewards = value;

                                new EmbedBuilder()
                                .SetTitle(e.Locale.GetString("miki_terms_config"))
                                .SetDescription(e.Locale.GetString("guildconfig_expneeded", value))
                                .ToEmbed().QueueToChannel(e.Channel);
                            }
                        }
                    }
                    break;

                    case "visible":
                    {
                        arg = arg.Next();

                        if (arg != null)
                        {
                            bool?result = arg.TakeBoolean();

                            if (!result.HasValue)
                            {
                                return;
                            }

                            string resourceString = result.Value
                                                                        ? "guildconfig_visibility_true"
                                                                        : "guildconfig_visibility_false";

                            new EmbedBuilder()
                            .SetTitle(e.Locale.GetString("miki_terms_config"))
                            .SetDescription(resourceString)
                            .ToEmbed().QueueToChannel(e.Channel);
                        }
                    }
                    break;
                    }
                    await context.SaveChangesAsync();
                }
                else
                {
                    new EmbedBuilder()
                    {
                        Title       = e.Locale.GetString("guild_settings"),
                        Description = e.Locale.GetString("miki_command_description_guildconfig")
                    }.ToEmbed().QueueToChannel(e.Channel);
                }
            }
        }
예제 #30
0
        public async Task GuildWeeklyAsync(CommandContext e)
        {
            var database = e.GetService <MikiDbContext>();

            LocalExperience thisUser = await database.LocalExperience.FindAsync(e.Guild.Id.ToDbLong(), e.Author.Id.ToDbLong());

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

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

            if (thisUser == null)
            {
                throw new UserNullException();
            }

            if (thisGuild == null)
            {
                return;
            }

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

                if (timer.Value.AddDays(7) <= DateTime.Now)
                {
                    GuildUser rival = await thisGuild.GetRivalOrDefaultAsync(database);

                    if (rival == null)
                    {
                        throw new RivalNullException();
                    }

                    if (rival.Experience > thisGuild.Experience)
                    {
                        await new EmbedBuilder()
                        .SetTitle(e.Locale.GetString("miki_terms_weekly"))
                        .SetDescription(e.Locale.GetString("guildweekly_error_low_level"))
                        .ToEmbed().QueueToChannelAsync(e.Channel);
                        return;
                    }

                    int mekosGained = (int)Math.Round((((MikiRandom.NextDouble() + thisGuild.GuildHouseMultiplier) * 0.5) * 10) * thisGuild.CalculateLevel(thisGuild.Experience));

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

                    if (user == null)
                    {
                        throw new UserNullException();
                    }

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

                    await new EmbedBuilder()
                    .SetTitle(e.Locale.GetString("miki_terms_weekly"))
                    .AddInlineField("Mekos", mekosGained.ToFormattedString())
                    .ToEmbed().QueueToChannelAsync(e.Channel);

                    timer.Value = DateTime.Now;
                    await database.SaveChangesAsync();
                }
                else
                {
                    await new EmbedBuilder()
                    .SetTitle(e.Locale.GetString("miki_terms_weekly"))
                    .SetDescription(e.Locale.GetString("guildweekly_error_timer_running", (timer.Value.AddDays(7) - DateTime.Now).ToTimeString(e.Locale)))
                    .ToEmbed().QueueToChannelAsync(e.Channel);
                }
            }
            else
            {
                await new EmbedBuilder()
                .SetTitle(e.Locale.GetString("miki_terms_weekly"))
                .SetDescription(e.Locale.GetString("miki_guildweekly_insufficient_exp", thisGuild.MinimalExperienceToGetRewards.ToFormattedString()))
                .ToEmbed().QueueToChannelAsync(e.Channel);
            }
        }