private async Task LinkAccount(CommandContext ctx, DiscordUser discordUser, string subject) { using (var db = new DatabaseDbContext()) { var guild = db.GuildConfigs.FirstOrDefault(g => g.Guild == ctx.Guild.Id); var playerRank = await ValorantApiService.GetPlayerRank(guild.Region, subject); if (playerRank == null) { await ctx.Channel.SendMessageAsync("Could not retrieve Player rank for selected id"); Logger.LogError($"Could not retrieve Player rank for {subject}"); return; } var playerIDs = await ValorantApiService.GetPlayerIds(guild.Region, subject); if (playerIDs == null) { await ctx.Channel.SendMessageAsync("Could not retrieve Player IDs for selected id"); Logger.LogError($"Could not retrieve Player IDs for {subject}"); return; } var newValorantAccount = new ValorantAccount { Subject = subject, Rank = playerRank.RankInt, RankName = playerRank.RankString, RankProgress = playerRank.Progress, DisplayName = $"{playerIDs.Name}#{playerIDs.Tag}" }; var valorantDbService = new ValorantDbService(); var accountLinked = await valorantDbService.LinkAccountToDiscordUser(newValorantAccount, discordUser); await valorantDbService.AsignAccountToGuild(newValorantAccount, ctx.Guild.Id); var playerRankHistoty = await ValorantApiService.GetPlayerRankHistory(guild.Region, newValorantAccount, DateTime.Today.AddDays(-50)); await valorantDbService.AddLastAccountMatch(newValorantAccount, playerRankHistoty); if (accountLinked) { await ctx.Channel.SendMessageAsync( $"Account {newValorantAccount.DisplayName} ( {newValorantAccount.RankName} ) lined to user {discordUser.Username}"); } else { await ctx.Channel.SendMessageAsync( $"Account {newValorantAccount.DisplayName} ( {newValorantAccount.RankName} ) already linked to user {discordUser.Username}"); } } }
public async Task AddLastAccountMatch(ValorantAccount account, List <RankInfo> history) { using (var db = new DatabaseDbContext()) { foreach (var rankInfo in history) { if (account.RankInfos.Any(info => info.DateTime == rankInfo.DateTime) == false) { account.RankInfos.Add(rankInfo); } } db.Update(account); await db.SaveChangesAsync(); } }
public async Task AsignAccountToGuild(ValorantAccount accountToAssign, ulong guildId) { using (var db = new DatabaseDbContext()) { var guild = accountToAssign.RegisteredGuilds.FirstOrDefault(g => g.GuildID == guildId); if (guild == null) { accountToAssign.RegisteredGuilds.Add(new RegisteredGuild() { GuildID = guildId, ValorantAccount = accountToAssign }); db.Update(accountToAssign); await db.SaveChangesAsync(); } } }
public Stream GetHistoryPlot(ValorantAccount account) { if (account.RankInfos.Count == 0) { return(null); } var plt = new Plot(600, 400); plt.Style(ColorTranslator.FromHtml("#111111"), ColorTranslator.FromHtml("#111111"), ColorTranslator.FromHtml("#22F9F9F9"), ColorTranslator.FromHtml("#FF4654"), ColorTranslator.FromHtml("#FF4654"), ColorTranslator.FromHtml("#F9F9F9")); var values = account.RankInfos.OrderBy(r => r.DateTime) .Select(info => (double)info.RankInt * 100 + info.Progress).ToArray(); var minValue = (double)((int)values.Min() / 100 - 1) * 100; var maxValue = (double)((int)values.Max() / 100 + 1) * 100; var dates = account.RankInfos.OrderBy(r => r.DateTime).Select(r => r.DateTime.ToOADate()).ToArray(); plt.PlotScatter(dates, values, ColorTranslator.FromHtml("#FF4654")); plt.Legend(); plt.Axis(y1: minValue, y2: maxValue); plt.Title(account.DisplayName); plt.XLabel("Date"); plt.YLabel("Rank"); var positions = _rank_map.Select((s, i) => (double)i * 100).ToArray(); plt.YTicks(positions, _rank_map); plt.Ticks(dateTimeX: true); var stream = new MemoryStream(); plt.GetBitmap().Save(stream, ImageFormat.Png); stream.Seek(0, SeekOrigin.Begin); return(stream); }
public async Task <bool> LinkAccountToDiscordUser(ValorantAccount accountToAdd, DiscordUser user) { bool result = true; using (var db = new DatabaseDbContext()) { var dbUser = db.DiscordUsers.Include(u => u.ValorantAccounts).SingleOrDefault(u => u.ID == user.Id); if (dbUser == null) { dbUser = new DbDiscordUser() { ID = user.Id, Name = user.Username }; await db.DiscordUsers.AddAsync(dbUser); await db.SaveChangesAsync(); } var valorantAccount = dbUser.ValorantAccounts.FirstOrDefault(a => a.Subject == accountToAdd.Subject); if (valorantAccount == null) { dbUser.ValorantAccounts.Add(accountToAdd); db.Update(dbUser); } else { accountToAdd.ID = valorantAccount.ID; result = false; db.Update(accountToAdd); } await db.SaveChangesAsync(); } return(result); }