From b0f840c273c906b232c80a67e0c8f75a5fa2dec1 Mon Sep 17 00:00:00 2001 From: jack1142 <6032823+jack1142@users.noreply.github.com> Date: Mon, 6 Jan 2020 00:38:59 +0100 Subject: [PATCH] [Core] Add `Red.wait_until_red_ready()` function to wait until post connection startup is done (#3273) * enhance: add `Red.wait_until_red_ready()` for post connection startup * enhance: fill `bot.owner_id` in our `on_ready` * enhance: log missing destinations in `get_owner_notification_destinations` * chore(changelog): add towncrier entries * chore(changelog): use past form of verb "add" --- changelog.d/3273.bugfix.1.rst | 1 + changelog.d/3273.bugfix.2.rst | 1 + changelog.d/3273.enhance.rst | 1 + changelog.d/3273.feature.rst | 1 + redbot/core/bot.py | 18 ++++++++++++++++++ redbot/core/events.py | 20 ++++++++++++-------- 6 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 changelog.d/3273.bugfix.1.rst create mode 100644 changelog.d/3273.bugfix.2.rst create mode 100644 changelog.d/3273.enhance.rst create mode 100644 changelog.d/3273.feature.rst diff --git a/changelog.d/3273.bugfix.1.rst b/changelog.d/3273.bugfix.1.rst new file mode 100644 index 000000000..e747c5a31 --- /dev/null +++ b/changelog.d/3273.bugfix.1.rst @@ -0,0 +1 @@ +:attr:`redbot.core.bot.Bot.owner_id` is now set in our post connection startup. \ No newline at end of file diff --git a/changelog.d/3273.bugfix.2.rst b/changelog.d/3273.bugfix.2.rst new file mode 100644 index 000000000..39982c295 --- /dev/null +++ b/changelog.d/3273.bugfix.2.rst @@ -0,0 +1 @@ +:meth:`redbot.core.bot.Bot.send_to_owners()` and :meth:`redbot.core.bot.Bot.get_owner_notification_destinations()` now wait until Red is done with post connection startup to ensure owner ID is available. \ No newline at end of file diff --git a/changelog.d/3273.enhance.rst b/changelog.d/3273.enhance.rst new file mode 100644 index 000000000..363a086e1 --- /dev/null +++ b/changelog.d/3273.enhance.rst @@ -0,0 +1 @@ +:meth:`redbot.core.bot.Bot.send_to_owners()` and :meth:`redbot.core.bot.Bot.get_owner_notification_destinations()` now log that they weren't able to find owner notification destination. \ No newline at end of file diff --git a/changelog.d/3273.feature.rst b/changelog.d/3273.feature.rst new file mode 100644 index 000000000..215698ffc --- /dev/null +++ b/changelog.d/3273.feature.rst @@ -0,0 +1 @@ +Added :meth:`redbot.core.bot.Bot.wait_until_red_ready()` method that waits until our post connection startup is done. diff --git a/redbot/core/bot.py b/redbot/core/bot.py index 81b0abb24..4a8f1a9e5 100644 --- a/redbot/core/bot.py +++ b/redbot/core/bot.py @@ -146,6 +146,7 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d self.add_command(commands.help.red_help) self._permissions_hooks: List[commands.CheckPredicate] = [] + self._red_ready = asyncio.Event() @property def cog_mgr(self) -> NoReturn: @@ -942,6 +943,7 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d """ Gets the users and channels to send to """ + await self.wait_until_red_ready() destinations = [] opt_outs = await self._config.owner_opt_out_list() for user_id in (self.owner_id, *self._co_owners): @@ -949,12 +951,24 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d user = self.get_user(user_id) if user: destinations.append(user) + else: + log.warning( + "Owner with ID %s is missing in user cache," + " ignoring owner notification destination.", + user_id, + ) channel_ids = await self._config.extra_owner_destinations() for channel_id in channel_ids: channel = self.get_channel(channel_id) if channel: destinations.append(channel) + else: + log.warning( + "Channel with ID %s is not available," + " ignoring owner notification destination.", + channel_id, + ) return destinations @@ -979,6 +993,10 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d sends = [wrapped_send(d, content, **kwargs) for d in destinations] await asyncio.gather(*sends) + async def wait_until_red_ready(self): + """Wait until our post connection startup is done.""" + await self._red_ready.wait() + class Red(RedBase, discord.AutoShardedClient): """ diff --git a/redbot/core/events.py b/redbot/core/events.py index 44e5a9e11..e72c505a4 100644 --- a/redbot/core/events.py +++ b/redbot/core/events.py @@ -48,9 +48,12 @@ def init_events(bot, cli_flags): guilds = len(bot.guilds) users = len(set([m for m in bot.get_all_members()])) + app_info = await bot.application_info() + if bot.owner_id is None: + bot.owner_id = app_info.owner.id + try: - data = await bot.application_info() - invite_url = discord.utils.oauth_url(data.id) + invite_url = discord.utils.oauth_url(app_info.id) except: invite_url = "Could not fetch invite url" @@ -75,6 +78,7 @@ def init_events(bot, cli_flags): INFO.append("{} cogs with {} commands".format(len(bot.cogs), len(bot.commands))) + outdated_red_message = "" with contextlib.suppress(aiohttp.ClientError, discord.HTTPException): async with aiohttp.ClientSession() as session: async with session.get("https://pypi.python.org/pypi/red-discordbot/json") as r: @@ -84,13 +88,10 @@ def init_events(bot, cli_flags): "Outdated version! {} is available " "but you're using {}".format(data["info"]["version"], red_version) ) - - await bot.send_to_owners( + outdated_red_message = ( "Your Red instance is out of date! {} is the current " - "version, however you are using {}!".format( - data["info"]["version"], red_version - ) - ) + "version, however you are using {}!" + ).format(data["info"]["version"], red_version) INFO2 = [] reqs_installed = {"docs": None, "test": None} @@ -123,6 +124,9 @@ def init_events(bot, cli_flags): print("\nInvite URL: {}\n".format(invite_url)) bot._color = discord.Colour(await bot._config.color()) + bot._red_ready.set() + if outdated_red_message: + await bot.send_to_owners(outdated_red_message) @bot.event async def on_command_error(ctx, error, unhandled_by_cog=False):