diff options
| -rw-r--r-- | botcore/_bot.py | 4 | ||||
| -rw-r--r-- | botcore/site_api.py | 5 | ||||
| -rw-r--r-- | botcore/utils/_monkey_patches.py | 5 | ||||
| -rw-r--r-- | botcore/utils/members.py | 9 | ||||
| -rw-r--r-- | botcore/utils/scheduling.py | 32 | ||||
| -rw-r--r-- | docs/changelog.rst | 5 | 
6 files changed, 36 insertions, 24 deletions
| diff --git a/botcore/_bot.py b/botcore/_bot.py index e9eba5c5..ed31d624 100644 --- a/botcore/_bot.py +++ b/botcore/_bot.py @@ -197,7 +197,7 @@ class BotBase(commands.Bot):          if not guild.roles or not guild.members or not guild.channels:              msg = "Guild available event was dispatched but the cache appears to still be empty!" -            self.log_to_dev_log(msg) +            await self.log_to_dev_log(msg)              return          self._guild_available.set() @@ -249,7 +249,7 @@ class BotBase(commands.Bot):          except Exception as e:              raise StartupError(e) -    async def ping_services() -> None: +    async def ping_services(self) -> None:          """Ping all required services on setup to ensure they are up before starting."""          ... diff --git a/botcore/site_api.py b/botcore/site_api.py index dbdf4f3b..44309f9d 100644 --- a/botcore/site_api.py +++ b/botcore/site_api.py @@ -26,7 +26,7 @@ class ResponseCodeError(ValueError):          Args:              response (:obj:`aiohttp.ClientResponse`): The response object from the request.              response_json: The JSON response returned from the request, if any. -            request_text: The text of the request, if any. +            response_text: The text of the request, if any.          """          self.status = response.status          self.response_json = response_json or {} @@ -76,7 +76,8 @@ class APIClient:          """Close the aiohttp session."""          await self.session.close() -    async def maybe_raise_for_status(self, response: aiohttp.ClientResponse, should_raise: bool) -> None: +    @staticmethod +    async def maybe_raise_for_status(response: aiohttp.ClientResponse, should_raise: bool) -> None:          """          Raise :exc:`ResponseCodeError` for non-OK response if an exception should be raised. diff --git a/botcore/utils/_monkey_patches.py b/botcore/utils/_monkey_patches.py index f2c6c100..c2f8aa10 100644 --- a/botcore/utils/_monkey_patches.py +++ b/botcore/utils/_monkey_patches.py @@ -1,6 +1,7 @@  """Contains all common monkey patches, used to alter discord to fit our needs."""  import logging +import typing  from datetime import datetime, timedelta  from functools import partial, partialmethod @@ -46,9 +47,9 @@ def _patch_typing() -> None:      log.debug("Patching send_typing, which should fix things breaking when Discord disables typing events. Stay safe!")      original = http.HTTPClient.send_typing -    last_403 = None +    last_403: typing.Optional[datetime] = None -    async def honeybadger_type(self, channel_id: int) -> None:  # noqa: ANN001 +    async def honeybadger_type(self: http.HTTPClient, channel_id: int) -> None:          nonlocal last_403          if last_403 and (datetime.utcnow() - last_403) < timedelta(minutes=5):              log.warning("Not sending typing event, we got a 403 less than 5 minutes ago.") diff --git a/botcore/utils/members.py b/botcore/utils/members.py index e89b4618..1536a8d1 100644 --- a/botcore/utils/members.py +++ b/botcore/utils/members.py @@ -1,6 +1,6 @@  """Useful helper functions for interactin with :obj:`discord.Member` objects.""" -  import typing +from collections import abc  import discord @@ -30,18 +30,19 @@ async def get_or_fetch_member(guild: discord.Guild, member_id: int) -> typing.Op  async def handle_role_change(      member: discord.Member, -    coro: typing.Callable[..., typing.Coroutine], +    coro: typing.Callable[[discord.Role], abc.Coroutine],      role: discord.Role  ) -> None:      """ -    Await the given ``coro`` with ``member`` as the sole argument. +    Await the given ``coro`` with ``role`` as the sole argument.      Handle errors that we expect to be raised from      :obj:`discord.Member.add_roles` and :obj:`discord.Member.remove_roles`.      Args: -        member: The member to pass to ``coro``. +        member: The member that is being modified for logging purposes.          coro: This is intended to be :obj:`discord.Member.add_roles` or :obj:`discord.Member.remove_roles`. +        role: The role to be passed to ``coro``.      """      try:          await coro(role) diff --git a/botcore/utils/scheduling.py b/botcore/utils/scheduling.py index 164f6b10..ebc42665 100644 --- a/botcore/utils/scheduling.py +++ b/botcore/utils/scheduling.py @@ -4,6 +4,7 @@ import asyncio  import contextlib  import inspect  import typing +from collections import abc  from datetime import datetime  from functools import partial @@ -38,9 +39,9 @@ class Scheduler:          self.name = name          self._log = logging.get_logger(f"{__name__}.{name}") -        self._scheduled_tasks: typing.Dict[typing.Hashable, asyncio.Task] = {} +        self._scheduled_tasks: dict[abc.Hashable, asyncio.Task] = {} -    def __contains__(self, task_id: typing.Hashable) -> bool: +    def __contains__(self, task_id: abc.Hashable) -> bool:          """          Return :obj:`True` if a task with the given ``task_id`` is currently scheduled. @@ -52,7 +53,7 @@ class Scheduler:          """          return task_id in self._scheduled_tasks -    def schedule(self, task_id: typing.Hashable, coroutine: typing.Coroutine) -> None: +    def schedule(self, task_id: abc.Hashable, coroutine: abc.Coroutine) -> None:          """          Schedule the execution of a ``coroutine``. @@ -79,7 +80,7 @@ class Scheduler:          self._scheduled_tasks[task_id] = task          self._log.debug(f"Scheduled task #{task_id} {id(task)}.") -    def schedule_at(self, time: datetime, task_id: typing.Hashable, coroutine: typing.Coroutine) -> None: +    def schedule_at(self, time: datetime, task_id: abc.Hashable, coroutine: abc.Coroutine) -> None:          """          Schedule ``coroutine`` to be executed at the given ``time``. @@ -106,8 +107,8 @@ class Scheduler:      def schedule_later(          self,          delay: typing.Union[int, float], -        task_id: typing.Hashable, -        coroutine: typing.Coroutine +        task_id: abc.Hashable, +        coroutine: abc.Coroutine      ) -> None:          """          Schedule ``coroutine`` to be executed after ``delay`` seconds. @@ -122,7 +123,7 @@ class Scheduler:          """          self.schedule(task_id, self._await_later(delay, task_id, coroutine)) -    def cancel(self, task_id: typing.Hashable) -> None: +    def cancel(self, task_id: abc.Hashable) -> None:          """          Unschedule the task identified by ``task_id``. Log a warning if the task doesn't exist. @@ -150,8 +151,8 @@ class Scheduler:      async def _await_later(          self,          delay: typing.Union[int, float], -        task_id: typing.Hashable, -        coroutine: typing.Coroutine +        task_id: abc.Hashable, +        coroutine: abc.Coroutine      ) -> None:          """Await ``coroutine`` after ``delay`` seconds."""          try: @@ -173,7 +174,7 @@ class Scheduler:              else:                  self._log.debug(f"Finally block reached for #{task_id}; {state=}") -    def _task_done_callback(self, task_id: typing.Hashable, done_task: asyncio.Task) -> None: +    def _task_done_callback(self, task_id: abc.Hashable, done_task: asyncio.Task) -> None:          """          Delete the task and raise its exception if one exists. @@ -208,13 +209,16 @@ class Scheduler:                  self._log.error(f"Error in task #{task_id} {id(done_task)}!", exc_info=exception) +TASK_RETURN = typing.TypeVar("TASK_RETURN") + +  def create_task( -    coro: typing.Awaitable, +    coro: abc.Coroutine[typing.Any, typing.Any, TASK_RETURN],      *, -    suppressed_exceptions: tuple[typing.Type[Exception]] = (), +    suppressed_exceptions: tuple[type[Exception]] = (),      event_loop: typing.Optional[asyncio.AbstractEventLoop] = None,      **kwargs, -) -> asyncio.Task: +) -> asyncio.Task[TASK_RETURN]:      """      Wrapper for creating an :obj:`asyncio.Task` which logs exceptions raised in the task. @@ -238,7 +242,7 @@ def create_task(      return task -def _log_task_exception(task: asyncio.Task, *, suppressed_exceptions: typing.Tuple[typing.Type[Exception]]) -> None: +def _log_task_exception(task: asyncio.Task, *, suppressed_exceptions: tuple[type[Exception]]) -> None:      """Retrieve and log the exception raised in ``task`` if one exists."""      with contextlib.suppress(asyncio.CancelledError):          exception = task.exception() diff --git a/docs/changelog.rst b/docs/changelog.rst index cba9e090..1ba60bd2 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,11 @@  Changelog  ========= +- :bug:`91` Fix incorrect docstring for ``botcore.utils.member.handle_role_change``. +- :bug:`91` Pass missing self parameter to ``BotBase.ping_services``. +- :bug:`91` Add missing await to ``BotBase.ping_services`` in some cases. + +  - :release:`7.2.0 <28th June 2022>`  - :support:`93` Bump Discord.py to :literal-url:`0eb3d26 <https://github.com/Rapptz/discord.py/commit/0eb3d26343969a25ffc43ba72eca42538d2e7e7a>`: | 
