Esempio n. 1
0
        public List <GuildUser> GetGuildUsers(ulong guildId)
        {
            SocketGuild guild = DiscordService.DiscordClient.GetGuild(guildId);

            if (guild == null)
            {
                throw new Exception("Unable to access guild");
            }

            // Get the guild users
            IReadOnlyCollection <Discord.IGuildUser> guildUsers = guild.GetUsersAsync().ToEnumerable().FirstOrDefault();

            // Get database users
            List <User> users = UserService.GetAllUsersForGuild(guildId).Result;

            List <GuildUser> results = new List <GuildUser>();

            foreach (User guildUser in users)
            {
                string             username = "******";
                Discord.IGuildUser user     = guildUsers.FirstOrDefault(x => x.Id == guildUser.DiscordUserId);
                if (user != null)
                {
                    username = user.Nickname ?? user.Username;
                }

                results.Add(new GuildUser(guildUser.DiscordUserId, username, guildUser.TotalKupoNutsCurrent, guildUser.TotalXPCurrent, guildUser.Level, guildUser.Reputation));
            }

            return(results);
        }
Esempio n. 2
0
        protected async Task <KeyValuePair <bool, Dictionary <string, string> > > ListMembers(string givenserverid)
        {
            DiscordSocketClient Discord = bot.getDiscordClient();

            if (ulong.TryParse(givenserverid, out ulong serverid) == false)
            {
                return(new KeyValuePair <bool, Dictionary <string, string> >(false, new Dictionary <string, string>()));
            }
            SocketGuild server             = Discord.GetGuild(serverid);
            IEnumerable <IGuildUser> users = await server.GetUsersAsync().FlattenAsync().ConfigureAwait(true);

            Dictionary <string, string> membersList = new Dictionary <string, string>();

            foreach (IGuildUser user in users)
            {
                if (user.Nickname != null)
                {
                    membersList.Add(user.Id.ToString(), user.Nickname + "|" + user.Username);
                }
                else
                {
                    membersList.Add(user.Id.ToString(), user.Username);
                }
            }
            return(new KeyValuePair <bool, Dictionary <string, string> >(true, membersList));
        }
Esempio n. 3
0
        protected async Task <bool> MessageMember(string givenserverid, string givenmemberid, string givenmessage)
        {
            DiscordSocketClient Discord = bot.getDiscordClient();

            if (ulong.TryParse(givenserverid, out ulong serverid) == false)
            {
                return(false);
            }
            if (ulong.TryParse(givenmemberid, out ulong memberid) == false)
            {
                return(false);
            }
            try
            {
                SocketGuild server             = Discord.GetGuild(serverid);
                IEnumerable <IGuildUser> users = await server.GetUsersAsync().FlattenAsync().ConfigureAwait(true);

                bool sent = false;
                foreach (IGuildUser user in users)
                {
                    if (user.Id == memberid)
                    {
                        sent = true;
                        await user.SendMessageAsync(givenmessage);

                        break;
                    }
                }
                return(sent);
            }
            catch
            {
                return(false);
            }
        }
Esempio n. 4
0
    private async Task RoleRestore(SocketGuild guild)
    {
        _logger.LogInformation("RoleRestore");

        var members = (await guild.GetUsersAsync().ToListAsync()).SelectMany(e => e).ToDictionary(k => k.Id);

        var roles = EmojiRolePairs
                    .Select(s => new { Key = guild.Emotes.First(e => e.Id == s.EmojiId) !, Value = guild.GetRole(s.RoleId) })
Esempio n. 5
0
            public async Task <(IReadOnlyDictionary <ulong, int> Data, DateTimeOffset?WhenCached)> GetOrFillAsync(SocketGuild guild, TimeSpan maxAge, Func <double, Task> onProgress = null)
            {
                if (maxAge < TimeSpan.Zero)
                {
                    throw new ArgumentException("Can't be negative", nameof(maxAge));
                }

                using (await _lock.ClaimAsync())
                {
                    if (_data != null && _updated + maxAge > DateTimeOffset.UtcNow && _boundGuildId == guild.Id)
                    {
                        return(_data, _updated);
                    }

                    _data         = new Dictionary <ulong, int>();
                    _updated      = DateTimeOffset.UtcNow;
                    _boundGuildId = guild.Id;

                    foreach (var role in guild.Roles.Select(x => x.Id))
                    {
                        _data[role] = 0;
                    }

                    if (onProgress != null)
                    {
                        await onProgress(0);
                    }

                    var processed = 0;
                    var batches   = 0;
                    await foreach (var batch in guild.GetUsersAsync())
                    {
                        _logger.LogInformation("Fetched {Count} users", batch.Count);
                        foreach (var user in batch)
                        {
                            foreach (var role in user.RoleIds)
                            {
                                if (_data.TryGetValue(role, out var value))
                                {
                                    _data[role] = value + 1;
                                }

                                // No else to track only existing roles (sometimes Discord is stupid and keeps deleted roles on users)
                            }
                        }

                        processed += batch.Count;
                        batches++;
                        if (onProgress != null && batches % 3 == 0)
                        {
                            await onProgress((double)processed / guild.MemberCount);
                        }
                    }

                    return(_data, null);
                }
            }