Browse Source

*Maybe add guild methods too :(*

pull/10109/head
dolfies 3 years ago
parent
commit
c2d854ce8c
  1. 84
      discord/guild.py

84
discord/guild.py

@ -78,6 +78,7 @@ from .threads import Thread, ThreadMember
from .sticker import GuildSticker from .sticker import GuildSticker
from .file import File from .file import File
from .settings import GuildSettings from .settings import GuildSettings
from .profile import MemberProfile
__all__ = ( __all__ = (
@ -1620,35 +1621,6 @@ class Guild(Hashable):
return [convert(d) for d in data] return [convert(d) for d in data]
async def active_threads(self) -> List[Thread]:
"""|coro|
Returns a list of active :class:`Thread` that the client can access.
This includes both private and public threads.
.. versionadded:: 2.0
Raises
------
HTTPException
The request to get the active threads failed.
Returns
--------
List[:class:`Thread`]
The active threads
"""
data = await self._state.http.get_active_threads(self.id)
threads = [Thread(guild=self, state=self._state, data=d) for d in data.get('threads', [])]
thread_lookup: Dict[int, Thread] = {thread.id: thread for thread in threads}
for member in data.get('members', []):
thread = thread_lookup.get(int(member['id']))
if thread is not None:
thread._add_member(ThreadMember(parent=thread, data=member))
return threads
async def fetch_member(self, member_id: int, /) -> Member: async def fetch_member(self, member_id: int, /) -> Member:
"""|coro| """|coro|
@ -1678,6 +1650,58 @@ class Guild(Hashable):
data = await self._state.http.get_member(self.id, member_id) data = await self._state.http.get_member(self.id, member_id)
return Member(data=data, state=self._state, guild=self) return Member(data=data, state=self._state, guild=self)
async def fetch_member_profile(
self, member_id: int, /, *, with_mutuals: bool = True, fetch_note: bool = True
) -> MemberProfile:
"""|coro|
Gets an arbitrary member's profile.
Parameters
------------
member_id: :class:`int`
The ID of the member to fetch their profile for.
with_mutuals: :class:`bool`
Whether to fetch mutual guilds and friends.
This fills in :attr:`mutual_guilds` & :attr:`mutual_friends`.
fetch_note: :class:`bool`
Whether to pre-fetch the user's note.
Raises
-------
NotFound
A user with this ID does not exist.
Forbidden
Not allowed to fetch this profile.
HTTPException
Fetching the profile failed.
InvalidData
The profile is not from this guild.
Returns
--------
:class:`.MemberProfile`
The profile of the member.
"""
state = self._state
data = await state.http.get_user_profile(member_id, self.id, with_mutual_guilds=with_mutuals)
if 'guild_member' not in data:
raise InvalidData('Member not in this guild')
if with_mutuals:
if not data['user'].get('bot', False):
data['mutual_friends'] = await state.http.get_mutual_friends(member_id)
else:
data['mutual_friends'] = []
profile = MemberProfile(state=state, data=data, guild=self)
if fetch_note:
await profile.note.fetch()
return profile
async def fetch_ban(self, user: Snowflake) -> BanEntry: async def fetch_ban(self, user: Snowflake) -> BanEntry:
"""|coro| """|coro|
@ -1746,7 +1770,7 @@ class Guild(Hashable):
if ch_type in (ChannelType.group, ChannelType.private): if ch_type in (ChannelType.group, ChannelType.private):
raise InvalidData('Channel ID resolved to a private channel') raise InvalidData('Channel ID resolved to a private channel')
guild_id = int(data['guild_id']) guild_id = int(data['guild_id']) # type: ignore
if self.id != guild_id: if self.id != guild_id:
raise InvalidData('Guild ID resolved to a different guild') raise InvalidData('Guild ID resolved to a different guild')

Loading…
Cancel
Save