From c88ee7ed5266cab36fd85c6b27e4500e69203875 Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Sun, 27 May 2018 22:15:22 +0300 Subject: [PATCH 1/9] Bump dev version --- aiogram/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiogram/__init__.py b/aiogram/__init__.py index 96b5a36c..ad97a44a 100644 --- a/aiogram/__init__.py +++ b/aiogram/__init__.py @@ -10,5 +10,5 @@ except ImportError: else: asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) -__version__ = '1.3.2' +__version__ = '1.3.3.dev1' __api_version__ = '3.6' From 545d470e02c52f078d4171d75684db3c17a7fc66 Mon Sep 17 00:00:00 2001 From: gurland Date: Sat, 2 Jun 2018 00:54:23 +0300 Subject: [PATCH 2/9] Convert tabs to spaces --- docs/Makefile | 4 ++-- docs/source/quick_start.rst | 40 ++++++++++++++++++------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/Makefile b/docs/Makefile index 4e50ed99..d4bd90d4 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -10,11 +10,11 @@ BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/source/quick_start.rst b/docs/source/quick_start.rst index 9f35c45a..6ce619be 100644 --- a/docs/source/quick_start.rst +++ b/docs/source/quick_start.rst @@ -8,9 +8,9 @@ At first you have to import all necessary modules .. code-block:: python3 - from aiogram import Bot, types - from aiogram.dispatcher import Dispatcher - from aiogram.utils import executor + from aiogram import Bot, types + from aiogram.dispatcher import Dispatcher + from aiogram.utils import executor Then you have to initialize bot and dispatcher instances. Bot token you can get from `@BotFather `_ @@ -18,39 +18,39 @@ Bot token you can get from `@BotFather `_ .. code-block:: python3 - bot = Bot(token='BOT TOKEN HERE') - dp = Dispatcher(bot) + bot = Bot(token='BOT TOKEN HERE') + dp = Dispatcher(bot) Next step: interaction with bots starts with one command. Register your first command handler: .. code-block:: python3 - @dp.message_handler(commands=['start', 'help']) - async def send_welcome(message: types.Message): - await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.") + @dp.message_handler(commands=['start', 'help']) + async def send_welcome(message: types.Message): + await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.") Last step: run long polling. .. code-block:: python3 - if __name__ == '__main__': - executor.start_polling(dp) + if __name__ == '__main__': + executor.start_polling(dp) Summary ------- .. code-block:: python3 - from aiogram import Bot, types - from aiogram.dispatcher import Dispatcher - from aiogram.utils import executor + from aiogram import Bot, types + from aiogram.dispatcher import Dispatcher + from aiogram.utils import executor - bot = Bot(token='BOT TOKEN HERE') - dp = Dispatcher(bot) + bot = Bot(token='BOT TOKEN HERE') + dp = Dispatcher(bot) - @dp.message_handler(commands=['start', 'help']) - async def send_welcome(message: types.Message): - await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.") + @dp.message_handler(commands=['start', 'help']) + async def send_welcome(message: types.Message): + await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.") - if __name__ == '__main__': - executor.start_polling(dp) + if __name__ == '__main__': + executor.start_polling(dp) From 99bb5a9fef9f23733f87cab805b194c2e958d7f1 Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Thu, 7 Jun 2018 23:38:23 +0300 Subject: [PATCH 3/9] Improve check in ExceptionsFilter --- aiogram/dispatcher/filters.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/aiogram/dispatcher/filters.py b/aiogram/dispatcher/filters.py index 96ee47b0..fb3f04a0 100644 --- a/aiogram/dispatcher/filters.py +++ b/aiogram/dispatcher/filters.py @@ -238,12 +238,7 @@ class ExceptionsFilter(Filter): self.exception = exception def check(self, dispatcher, update, exception): - try: - raise exception - except self.exception: - return True - except: - return False + return isinstance(exception, self.exception) def generate_default_filters(dispatcher, *args, **kwargs): From b7a67cd5220cd7c2156dfa945ddde69b39603a4d Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Sun, 10 Jun 2018 13:40:33 +0300 Subject: [PATCH 4/9] Babel is in requirements now --- aiogram/types/user.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/aiogram/types/user.py b/aiogram/types/user.py index d27f2f87..2143f06c 100644 --- a/aiogram/types/user.py +++ b/aiogram/types/user.py @@ -1,12 +1,9 @@ +import babel + from . import base from . import fields from ..utils import markdown -try: - import babel -except ImportError: - babel = None - class User(base.TelegramObject): """ @@ -51,10 +48,7 @@ class User(base.TelegramObject): This property requires `Babel `_ module :return: :class:`babel.core.Locale` - :raise: ImportError: when babel is not installed. """ - if not babel: - raise ImportError('Babel is not installed!') if not self.language_code: return None if not hasattr(self, '_locale'): From 7e601d1c8d018cbd3444e999a58ec928e888e63a Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Mon, 11 Jun 2018 00:28:14 +0300 Subject: [PATCH 5/9] Update docstring for the user class --- aiogram/types/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiogram/types/user.py b/aiogram/types/user.py index 2143f06c..42157039 100644 --- a/aiogram/types/user.py +++ b/aiogram/types/user.py @@ -45,7 +45,7 @@ class User(base.TelegramObject): @property def locale(self) -> 'babel.core.Locale' or None: """ - This property requires `Babel `_ module + Get user's locale :return: :class:`babel.core.Locale` """ From 3adba29c279aef3a98c2f43d236516e60d2b40cd Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Mon, 11 Jun 2018 00:31:26 +0300 Subject: [PATCH 6/9] Fix return typing --- aiogram/types/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiogram/types/user.py b/aiogram/types/user.py index 42157039..c4c64844 100644 --- a/aiogram/types/user.py +++ b/aiogram/types/user.py @@ -43,7 +43,7 @@ class User(base.TelegramObject): return self.full_name @property - def locale(self) -> 'babel.core.Locale' or None: + def locale(self) -> babel.core.Locale or None: """ Get user's locale From dd0fb98376aa55a3b379f052addfd03d249ce03e Mon Sep 17 00:00:00 2001 From: Kolay Date: Fri, 15 Jun 2018 00:32:55 +0300 Subject: [PATCH 7/9] must be use round --- aiogram/utils/payload.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aiogram/utils/payload.py b/aiogram/utils/payload.py index 277573c9..dac43492 100644 --- a/aiogram/utils/payload.py +++ b/aiogram/utils/payload.py @@ -54,5 +54,5 @@ def prepare_arg(value): now = datetime.datetime.now() return int((now + value).timestamp()) elif isinstance(value, datetime.datetime): - return int(value.timestamp()) + return round(value.timestamp()) return value From fee449a233ef3d6c1452ebef9a9d259fd81725a4 Mon Sep 17 00:00:00 2001 From: Kolay Date: Fri, 15 Jun 2018 00:35:46 +0300 Subject: [PATCH 8/9] replaced int to datetime --- aiogram/types/message.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aiogram/types/message.py b/aiogram/types/message.py index 61f6188f..459091ee 100644 --- a/aiogram/types/message.py +++ b/aiogram/types/message.py @@ -37,9 +37,9 @@ class Message(base.TelegramObject): forward_from_chat: Chat = fields.Field(base=Chat) forward_from_message_id: base.Integer = fields.Field() forward_signature: base.String = fields.Field() - forward_date: base.Integer = fields.Field() + forward_date: datetime.datetime = fields.DateTimeField() reply_to_message: 'Message' = fields.Field(base='Message') - edit_date: base.Integer = fields.Field() + edit_date: datetime.datetime = fields.DateTimeField() media_group_id: base.String = fields.Field() author_signature: base.String = fields.Field() text: base.String = fields.Field() From 40fd2b126b962b8eeedb8d4c3e754acf4e6455ce Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Mon, 2 Jul 2018 21:51:48 +0300 Subject: [PATCH 9/9] Fix broadcast example --- examples/broadcast_example.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/broadcast_example.py b/examples/broadcast_example.py index 468da916..40ba5e0c 100644 --- a/examples/broadcast_example.py +++ b/examples/broadcast_example.py @@ -23,7 +23,7 @@ def get_users(): yield from (61043901, 78238238, 78378343, 98765431, 12345678) -async def send_message(user_id: int, text: str) -> bool: +async def send_message(user_id: int, text: str, disable_notification: bool = False) -> bool: """ Safe messages sender @@ -32,7 +32,7 @@ async def send_message(user_id: int, text: str) -> bool: :return: """ try: - await bot.send_message(user_id, 'Hello, World!') + await bot.send_message(user_id, text, disable_notification=disable_notification) except exceptions.BotBlocked: log.error(f"Target [ID:{user_id}]: blocked by user") except exceptions.ChatNotFound: @@ -41,6 +41,8 @@ async def send_message(user_id: int, text: str) -> bool: log.error(f"Target [ID:{user_id}]: Flood limit is exceeded. Sleep {e.timeout} seconds.") await asyncio.sleep(e.timeout) return await send_message(user_id, text) # Recursive call + except exceptions.UserDeactivated: + log.error(f"Target [ID:{user_id}]: user is deactivated") except exceptions.TelegramAPIError: log.exception(f"Target [ID:{user_id}]: failed") else: