public async Task <ActionResult <GuildLeaderboard> > GetLocalLeaderboard(ulong guildId) { var guild = _client.GetGuild(guildId); if (guild == null) { return(NotFound("The specified guild could not be found!")); } var gl = new GuildLeaderboard() { AvatarUrl = guild.IconUrl ?? _client.CurrentUser.GetAvatarUrl(), GuildName = guild.Name, Ranks = new List <GuildRank>(guild.MemberCount > 100 ? 100: guild.MemberCount) // Properly set capacity already for best performance! }; var gUsersO = await _profileRepo.GetGuildUsersSorted(guildId); if (!gUsersO) { return(NotFound("Guild has no saved users!")); } var g = await _restClient.GetGuildAsync(guildId); // Create dictionary for easy and fast lookups later :) var users = (await g.GetUsersAsync().FlattenAsync()).ToDictionary(x => x.Id, x => x); var gUsers = (~gUsersO); for (var i = 0; i < gUsers.Count; i++) { var user = gUsers[i]; int rank = i + 1; if (rank > 100) { break; } if (!users.TryGetValue(user.UserId, out var u)) { continue; } gl.Ranks.Add(new GuildRank() { AvatarUrl = u.GetAvatarUrl() ?? u.GetDefaultAvatarUrl(), Discrim = u.Discriminator, Exp = user.Exp, Name = u.Username, Rank = rank, UserId = u.Id.ToString() }); } return(Ok(gl)); }
public async Task <GuildLeaderboard> GetGuildLeaderboard(ulong guildId) { try { using (var soraContext = new SoraContext()) { var guild = _client.GetGuild(guildId); if (guild == null) { return(new GuildLeaderboard() { Success = false }); } var resp = new GuildLeaderboard() { Success = true, AvatarUrl = guild.IconUrl ?? "https://i.imgur.com/PvYs6dc.png", GuildName = guild.Name }; var levelRoles = soraContext.GuildLevelRoles.Where(x => x.GuildId == guildId).ToList(); var guildUsers = soraContext.GuildUsers.Where(x => x.GuildId == guildId).ToList(); var sorted = guildUsers.OrderByDescending(x => x.Exp).ToList(); var sortedLvls = levelRoles.OrderBy(x => x.RequiredLevel).ToList(); for (int i = 0; i < sortedLvls.Count; i++) { var role = sortedLvls[i]; var r = guild.GetRole(role.RoleId); if (r == null || role.Banned) { continue; } resp.RoleRewards.Add(new RoleReward() { Name = r.Name, Color = $"rgb({r.Color.R}, {r.Color.G}, {r.Color.B})", LevelReq = role.RequiredLevel }); } int rank = 1; for (int i = 0; i < sorted.Count; i++) { var user = sorted[i]; if (rank > 100) { break; } IUser u = _client.GetUser(user.UserId) ?? await _restClient.GetUserAsync(user.UserId) as IUser; if (u == null) { continue; } resp.Ranks.Add(new GuildRank() { AvatarUrl = u.GetAvatarUrl() ?? "https://i.imgur.com/PvYs6dc.png", Discrim = u.Discriminator, Exp = (int)user.Exp, Name = u.Username, NextExp = ExpService.CalculateNeededExp(ExpService.CalculateLevel(user.Exp) + 1), Rank = rank }); rank++; } return(resp); } } catch (Exception e) { Console.WriteLine(e); } return(new GuildLeaderboard() { Success = false }); }