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(); } } }
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); }
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); } }
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(); } } }
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()); }
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); }
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); } }
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); } }
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) {} }
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(); } }
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); }
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; }
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); }
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); }
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(); } }
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(); }
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); }
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) {} }
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); }
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); }
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); } }
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); }
/// <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); }
public SocketGuildUser(GuildUser guildUser) : base(guildUser) { RoleIDs = guildUser.RoleIDs; Nickname = guildUser.Nickname; Permissions = guildUser.Permissions; }
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); } } }
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)); } });
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); } } }
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); }
public async Task SetGuildConfig(EventContext e) { using (MikiContext context = new MikiContext()) { GuildUser g = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong()); ArgObject arg = e.Arguments.FirstOrDefault(); if (arg != null) { switch (arg.Argument) { case "expneeded": { arg = arg.Next(); if (arg != null) { if (int.TryParse(arg.Argument, out int value)) { g.MinimalExperienceToGetRewards = value; new EmbedBuilder() .SetTitle(e.Locale.GetString("miki_terms_config")) .SetDescription(e.Locale.GetString("guildconfig_expneeded", value)) .ToEmbed().QueueToChannel(e.Channel); } } } break; case "visible": { arg = arg.Next(); if (arg != null) { bool?result = arg.TakeBoolean(); if (!result.HasValue) { return; } string resourceString = result.Value ? "guildconfig_visibility_true" : "guildconfig_visibility_false"; new EmbedBuilder() .SetTitle(e.Locale.GetString("miki_terms_config")) .SetDescription(resourceString) .ToEmbed().QueueToChannel(e.Channel); } } break; } await context.SaveChangesAsync(); } else { new EmbedBuilder() { Title = e.Locale.GetString("guild_settings"), Description = e.Locale.GetString("miki_command_description_guildconfig") }.ToEmbed().QueueToChannel(e.Channel); } } }
public async Task 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); } }