Add MessageChannel.typing context manager for prolonged typing.
This commit is contained in:
		| @@ -31,6 +31,7 @@ import asyncio | ||||
|  | ||||
| from .message import Message | ||||
| from .iterators import LogsFromIterator | ||||
| from .context_managers import Typing | ||||
|  | ||||
| class Snowflake(metaclass=abc.ABCMeta): | ||||
|     __slots__ = () | ||||
| @@ -182,6 +183,20 @@ class MessageChannel(metaclass=abc.ABCMeta): | ||||
|         channel_id, _ = self._get_destination() | ||||
|         yield from self._state.http.send_typing(channel_id) | ||||
|  | ||||
|     def typing(self): | ||||
|         """Returns a context manager that allows you to type for an indefinite period of time. | ||||
|  | ||||
|         This is useful for denoting long computations in your bot. | ||||
|  | ||||
|         Example Usage: :: | ||||
|  | ||||
|             with channel.typing(): | ||||
|                 # do expensive stuff here | ||||
|                 await channel.send_message('done!') | ||||
|  | ||||
|         """ | ||||
|         return Typing(self) | ||||
|  | ||||
|     @asyncio.coroutine | ||||
|     def upload(self, fp, *, filename=None, content=None, tts=False): | ||||
|         """|coro| | ||||
|   | ||||
							
								
								
									
										60
									
								
								discord/context_managers.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								discord/context_managers.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| """ | ||||
| The MIT License (MIT) | ||||
|  | ||||
| Copyright (c) 2015-2016 Rapptz | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a | ||||
| copy of this software and associated documentation files (the "Software"), | ||||
| to deal in the Software without restriction, including without limitation | ||||
| the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
| and/or sell copies of the Software, and to permit persons to whom the | ||||
| Software is furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in | ||||
| all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||||
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||||
| DEALINGS IN THE SOFTWARE. | ||||
| """ | ||||
|  | ||||
| import asyncio | ||||
|  | ||||
| from .compat import create_task | ||||
|  | ||||
| class Typing: | ||||
|     def __init__(self, channel): | ||||
|         http = channel._state.http | ||||
|         self.loop = http.loop | ||||
|         self.channel = channel | ||||
|         self.typing = http.send_typing | ||||
|  | ||||
|     @asyncio.coroutine | ||||
|     def do_typing(self): | ||||
|         while True: | ||||
|             yield from self.typing(self.channel.id) | ||||
|             yield from asyncio.sleep(5) | ||||
|  | ||||
|     def __enter__(self): | ||||
|         self.task = create_task(self.do_typing(), loop=self.loop) | ||||
|         return self | ||||
|  | ||||
|     def __exit__(self, exc_type, exc, tb): | ||||
|         try: | ||||
|             self.task.cancel() | ||||
|         except: | ||||
|             pass | ||||
|  | ||||
|     @asyncio.coroutine | ||||
|     def __aenter__(self): | ||||
|         return self.__enter__() | ||||
|  | ||||
|     @asyncio.coroutine | ||||
|     def __aexit__(self, exc_type, exc, tb): | ||||
|         self.__exit__(exc_type, exc, tb) | ||||
		Reference in New Issue
	
	Block a user