diff --git a/discord/abc.py b/discord/abc.py index 726fe5567..dfc96761a 100644 --- a/discord/abc.py +++ b/discord/abc.py @@ -1391,15 +1391,10 @@ class Messageable: await self._state.http.send_typing(channel.id) def typing(self) -> Typing: - """Returns a context manager that allows you to type for an indefinite period of time. + """Returns an asynchronous context manager that allows you to type for an indefinite period of time. This is useful for denoting long computations in your bot. - .. note:: - - This is both a regular context manager and an async context manager. - This means that both ``with`` and ``async with`` work with this. - Example Usage: :: async with channel.typing(): @@ -1408,6 +1403,8 @@ class Messageable: await channel.send('done!') + .. versionchanged:: 2.0 + This no longer works with the ``with`` syntax, ``async with`` must be used instead. """ return Typing(self) diff --git a/discord/context_managers.py b/discord/context_managers.py index 5ba6efbc1..e6aa67901 100644 --- a/discord/context_managers.py +++ b/discord/context_managers.py @@ -25,15 +25,13 @@ DEALINGS IN THE SOFTWARE. from __future__ import annotations import asyncio -from typing import TYPE_CHECKING, TypeVar, Optional, Type +from typing import TYPE_CHECKING, Optional, Type if TYPE_CHECKING: from .abc import Messageable from types import TracebackType - TypingT = TypeVar('TypingT', bound='Typing') - # fmt: off __all__ = ( 'Typing', @@ -66,23 +64,11 @@ class Typing: await typing(channel.id) await asyncio.sleep(5) - def __enter__(self: TypingT) -> TypingT: - self.task: asyncio.Task = self.loop.create_task(self.do_typing()) - self.task.add_done_callback(_typing_done_callback) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - self.task.cancel() - - async def __aenter__(self: TypingT) -> TypingT: + async def __aenter__(self) -> None: self._channel = channel = await self.messageable._get_channel() await channel._state.http.send_typing(channel.id) - return self.__enter__() + self.task: asyncio.Task = self.loop.create_task(self.do_typing()) + self.task.add_done_callback(_typing_done_callback) async def __aexit__( self,