From 862db86a155211504e9b4843c2bcb657ad75eec9 Mon Sep 17 00:00:00 2001 From: shiftinv <8530778+shiftinv@users.noreply.github.com> Date: Sat, 23 Sep 2023 12:22:06 +0200 Subject: [PATCH] refactor: deduplicate `owner_ids` logic (#1109) --- disnake/ext/commands/bot.py | 8 +++---- disnake/ext/commands/common_bot_base.py | 30 ++++++++++--------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/disnake/ext/commands/bot.py b/disnake/ext/commands/bot.py index 5e135d829c..5c3ba59eac 100644 --- a/disnake/ext/commands/bot.py +++ b/disnake/ext/commands/bot.py @@ -175,14 +175,14 @@ class Bot(BotBase, InteractionBotBase, disnake.Client): This can be provided as a parameter at creation. owner_id: Optional[:class:`int`] - The user ID that owns the bot. If this is not set and is then queried via + The ID of the user that owns the bot. If this is not set and is then queried via :meth:`.is_owner` then it is fetched automatically using :meth:`~.Bot.application_info`. This can be provided as a parameter at creation. owner_ids: Optional[Collection[:class:`int`]] - The user IDs that owns the bot. This is similar to :attr:`owner_id`. + The IDs of the users that own the bot. This is similar to :attr:`owner_id`. If this is not set and the application is team based, then it is fetched automatically using :meth:`~.Bot.application_info`. For performance reasons it is recommended to use a :class:`set` @@ -394,14 +394,14 @@ class InteractionBot(InteractionBotBase, disnake.Client): Attributes ---------- owner_id: Optional[:class:`int`] - The user ID that owns the bot. If this is not set and is then queried via + The ID of the user that owns the bot. If this is not set and is then queried via :meth:`.is_owner` then it is fetched automatically using :meth:`~.Bot.application_info`. This can be provided as a parameter at creation. owner_ids: Optional[Collection[:class:`int`]] - The user IDs that owns the bot. This is similar to :attr:`owner_id`. + The IDs of the users that own the bot. This is similar to :attr:`owner_id`. If this is not set and the application is team based, then it is fetched automatically using :meth:`~.Bot.application_info`. For performance reasons it is recommended to use a :class:`set` diff --git a/disnake/ext/commands/common_bot_base.py b/disnake/ext/commands/common_bot_base.py index dc4e81c97c..841c3df837 100644 --- a/disnake/ext/commands/common_bot_base.py +++ b/disnake/ext/commands/common_bot_base.py @@ -80,9 +80,7 @@ async def _fill_owners(self) -> None: if self.owner_id or self.owner_ids: return - await self.wait_until_first_connect() # type: ignore - - app = await self.application_info() # type: ignore + app: disnake.AppInfo = await self.application_info() # type: ignore if app.team: self.owners = set(app.team.members) self.owner_ids = {m.id for m in app.team.members} @@ -111,11 +109,14 @@ async def close(self) -> None: @disnake.utils.copy_doc(disnake.Client.login) async def login(self, token: str) -> None: - self.loop.create_task(self._fill_owners()) # type: ignore + await super().login(token=token) # type: ignore + loop: asyncio.AbstractEventLoop = self.loop # type: ignore if self.reload: - self.loop.create_task(self._watchdog()) # type: ignore - await super().login(token=token) # type: ignore + loop.create_task(self._watchdog()) + + # prefetch + loop.create_task(self._fill_owners()) async def is_owner(self, user: Union[disnake.User, disnake.Member]) -> bool: """|coro| @@ -123,7 +124,7 @@ async def is_owner(self, user: Union[disnake.User, disnake.Member]) -> bool: Checks if a :class:`~disnake.User` or :class:`~disnake.Member` is the owner of this bot. - If an :attr:`owner_id` is not set, it is fetched automatically + If :attr:`owner_id` and :attr:`owner_ids` are not set, they are fetched automatically through the use of :meth:`~.Bot.application_info`. .. versionchanged:: 1.3 @@ -140,20 +141,13 @@ async def is_owner(self, user: Union[disnake.User, disnake.Member]) -> bool: :class:`bool` Whether the user is the owner. """ + if not self.owner_id and not self.owner_ids: + await self._fill_owners() + if self.owner_id: return user.id == self.owner_id - elif self.owner_ids: - return user.id in self.owner_ids else: - app = await self.application_info() # type: ignore - if app.team: - self.owners = set(app.team.members) - self.owner_ids = ids = {m.id for m in app.team.members} - return user.id in ids - else: - self.owner = app.owner - self.owner_id = owner_id = app.owner.id - return user.id == owner_id + return user.id in self.owner_ids def add_cog(self, cog: Cog, *, override: bool = False) -> None: """Adds a "cog" to the bot.