예제 #1
0
        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));
        }
예제 #2
0
        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
            });
        }