diff --git a/discord/guild.py b/discord/guild.py index 6e2a9e626ed9..9f2350a8cfd7 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -2462,6 +2462,37 @@ async def active_threads(self) -> List[Thread]: return threads + async def fetch_members_named(self, name: str, *, limit: Optional[int] = 1000) -> List[Member]: + """|coro| + + Returns a list of members whose username or nickname starts + with the provided `name`. + + .. versionadded:: 2.? + + + Parameters + ---------- + name: :class:`str` + The string to match a username and nickname against. + limit: Optional[:class:`int`] + The maximum number of members to return. Max of 1000. + + Raises + ------ + HTTPException + Getting the members failed. +s + Returns + ------ + List[:class:`Member`] + A list of matched members. + """ + + state = self._state + data = await state.http.search_members(name, self.id, limit) + return [Member(data=raw_member, guild=self, state=state) for raw_member in data] + async def fetch_members(self, *, limit: Optional[int] = 1000, after: SnowflakeTime = MISSING) -> AsyncIterator[Member]: """Retrieves an :term:`asynchronous iterator` that enables receiving the guild's members. In order to use this, :meth:`Intents.members` must be enabled. diff --git a/discord/http.py b/discord/http.py index 9d1b85a50359..c5fc7e07fc60 100644 --- a/discord/http.py +++ b/discord/http.py @@ -1616,6 +1616,11 @@ def get_members( r = Route('GET', '/guilds/{guild_id}/members', guild_id=guild_id) return self.request(r, params=params) + def search_members(self, query: str, guild_id: Snowflake, limit: int) -> Response[List[member.MemberWithUser]]: + params: Dict[str, Any] = {'query': query, 'limit': limit} + r = Route('GET', '/guilds/{guild_id}/members/search', guild_id=guild_id) + return self.request(r, params=params) + def get_member(self, guild_id: Snowflake, member_id: Snowflake) -> Response[member.MemberWithUser]: return self.request(Route('GET', '/guilds/{guild_id}/members/{member_id}', guild_id=guild_id, member_id=member_id))