Example #1
0
    async def query_member_by_id(self, bot: _Bot, guild: discord.Guild, user_id: int) -> Optional[discord.Member]:
        ws = bot._get_websocket(shard_id=guild.shard_id)
        cache = guild._state.member_cache_flags.joined
        if ws.is_ratelimited():
            # If we're being rate limited on the WS, then fall back to using the HTTP API
            # So we don't have to wait ~60 seconds for the query to finish
            try:
                member = await guild.fetch_member(user_id)
            except discord.HTTPException:
                return None

            if cache:
                guild._add_member(member)
            return member

        # If we're not being rate limited then we can use the websocket to actually query
        members = await guild.query_members(limit=1, user_ids=[user_id], cache=cache)
        if not members:
            return None
        return members[0]
Example #2
0
    async def get_member_async(self, guild: discord.Guild, user_id: int) \
            -> discord.Member:
        member = guild.get_member(user_id)
        if member:
            return member
        elif self.get_shard(guild.shard_id).is_ws_ratelimited():
            # If we're being rate limited on the WS, then fall back to using
            # the HTTP API so we don't have to wait ~60 seconds for the query
            # to finish
            try:
                member = await guild.fetch_member(user_id)
            except discord.HTTPException:
                return None
        else:
            members = await guild.query_members(limit=1,
                                                user_ids=[user_id],
                                                cache=True)
            if members is None or len(members) != 1:
                return None
            member = next(iter(members))

        guild._add_member(member, force=True)
        return member