From 2a387773793e6fe8fe1418d8d99ac5ca7f87645c Mon Sep 17 00:00:00 2001 From: jack1142 <6032823+jack1142@users.noreply.github.com> Date: Fri, 24 Jan 2020 18:38:42 +0100 Subject: [PATCH] [Downloader] Do the initialization in task to avoid timeout on bot startup (#3440) * enhance(downloader): run init in task * chore(changelog): add towncrier entry * fix: address review --- changelog.d/downloader/3415.bugfix.rst | 1 + redbot/cogs/downloader/__init__.py | 2 +- redbot/cogs/downloader/downloader.py | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 changelog.d/downloader/3415.bugfix.rst diff --git a/changelog.d/downloader/3415.bugfix.rst b/changelog.d/downloader/3415.bugfix.rst new file mode 100644 index 000000000..305377c9c --- /dev/null +++ b/changelog.d/downloader/3415.bugfix.rst @@ -0,0 +1 @@ +Downloader will now do the initialization in background to avoid timeout issues during bot startup. \ No newline at end of file diff --git a/redbot/cogs/downloader/__init__.py b/redbot/cogs/downloader/__init__.py index 7c50e3395..1c8d1b710 100644 --- a/redbot/cogs/downloader/__init__.py +++ b/redbot/cogs/downloader/__init__.py @@ -3,5 +3,5 @@ from .downloader import Downloader async def setup(bot): cog = Downloader(bot) - await cog.initialize() bot.add_cog(cog) + cog.create_init_task() diff --git a/redbot/cogs/downloader/downloader.py b/redbot/cogs/downloader/downloader.py index eb063157c..c0099bf14 100644 --- a/redbot/cogs/downloader/downloader.py +++ b/redbot/cogs/downloader/downloader.py @@ -53,6 +53,8 @@ class Downloader(commands.Cog): self._create_lib_folder() self._repo_manager = RepoManager() + self._ready = asyncio.Event() + self._init_task = None def _create_lib_folder(self, *, remove_first: bool = False) -> None: if remove_first: @@ -62,9 +64,21 @@ class Downloader(commands.Cog): with self.SHAREDLIB_INIT.open(mode="w", encoding="utf-8") as _: pass + async def cog_before_invoke(self, ctx: commands.Context) -> None: + async with ctx.typing(): + await self._ready.wait() + + def cog_unload(self): + if self._init_task is not None: + self._init_task.cancel() + + def create_init_task(self): + self._init_task = asyncio.create_task(self.initialize()) + async def initialize(self) -> None: await self._repo_manager.initialize() await self._maybe_update_config() + self._ready.set() async def _maybe_update_config(self) -> None: schema_version = await self.conf.schema_version()