From 0f84b67b49622377088f04d370e1dd7cec723f29 Mon Sep 17 00:00:00 2001 From: mihalin Date: Sun, 26 Sep 2021 18:15:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=20=D0=B1=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/source/developer.rst | 4 +- olgram/commands/bot_actions.py | 12 ++++ olgram/commands/menu.py | 68 +++++++++++++++++-- .../models/4_20210926165918_update.sql | 4 ++ olgram/models/models.py | 1 + server/custom.py | 4 ++ 6 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 olgram/migrations/models/4_20210926165918_update.sql diff --git a/docs/source/developer.rst b/docs/source/developer.rst index 8be0bf8..a3e425b 100644 --- a/docs/source/developer.rst +++ b/docs/source/developer.rst @@ -13,8 +13,8 @@ * ``POSTGRES_PASSWORD`` - любой случайный пароль * ``WEBHOOK_HOST`` - IP адрес или доменное имя сервера, на котором запускается проект -2. Сохраните файл `docker-compose.yaml `_ -и соберите его: +2. Рядом с файлом .env сохраните файл +`docker-compose.yaml `_ и соберите его: .. code-block:: console diff --git a/olgram/commands/bot_actions.py b/olgram/commands/bot_actions.py index c36e5e9..5471b1c 100644 --- a/olgram/commands/bot_actions.py +++ b/olgram/commands/bot_actions.py @@ -36,6 +36,18 @@ async def reset_bot_text(bot: Bot, call: types.CallbackQuery): await call.answer("Текст сброшен") +async def reset_bot_second_text(bot: Bot, call: types.CallbackQuery): + """ + Пользователь решил сбросить second text бота + :param bot: + :param call: + :return: + """ + bot.second_text = bot._meta.fields_map['second_text'].default + await bot.save() + await call.answer("Текст сброшен") + + async def select_chat(bot: Bot, call: types.CallbackQuery, chat: str): """ Пользователь выбрал чат, в который хочет получать сообщения от бота diff --git a/olgram/commands/menu.py b/olgram/commands/menu.py index 2d09d81..3bcf5dd 100644 --- a/olgram/commands/menu.py +++ b/olgram/commands/menu.py @@ -143,13 +143,18 @@ async def send_bot_text_menu(bot: Bot, call: ty.Optional[types.CallbackQuery] = await call.answer() keyboard = types.InlineKeyboardMarkup(row_width=2) keyboard.insert( - types.InlineKeyboardButton(text="Сбросить текст", - callback_data=menu_callback.new(level=3, bot_id=bot.id, operation="reset_text", + types.InlineKeyboardButton(text="<< Завершить редактирование", + callback_data=menu_callback.new(level=1, bot_id=bot.id, operation=empty, chat=empty)) + ) + keyboard.insert( + types.InlineKeyboardButton(text="Следующий текст", + callback_data=menu_callback.new(level=3, bot_id=bot.id, operation="next_text", chat=empty)) ) keyboard.insert( - types.InlineKeyboardButton(text="<< Завершить редактирование", - callback_data=menu_callback.new(level=1, bot_id=bot.id, operation=empty, chat=empty)) + types.InlineKeyboardButton(text="Сбросить текст", + callback_data=menu_callback.new(level=3, bot_id=bot.id, operation="reset_text", + chat=empty)) ) text = dedent(""" @@ -169,6 +174,43 @@ async def send_bot_text_menu(bot: Bot, call: ty.Optional[types.CallbackQuery] = await AioBot.get_current().send_message(chat_id, text, reply_markup=keyboard, parse_mode="HTML") +async def send_bot_second_text_menu(bot: Bot, call: ty.Optional[types.CallbackQuery] = None, + chat_id: ty.Optional[int] = None): + if call: + await call.answer() + keyboard = types.InlineKeyboardMarkup(row_width=2) + keyboard.insert( + types.InlineKeyboardButton(text="<< Завершить редактирование", + callback_data=menu_callback.new(level=1, bot_id=bot.id, operation=empty, chat=empty)) + ) + keyboard.insert( + types.InlineKeyboardButton(text="Предыдущий текст", + callback_data=menu_callback.new(level=2, bot_id=bot.id, operation="text", + chat=empty)) + ) + keyboard.insert( + types.InlineKeyboardButton(text="Сбросить текст", + callback_data=menu_callback.new(level=3, bot_id=bot.id, + operation="reset_second_text", chat=empty)) + ) + + text = dedent(""" + Сейчас вы редактируете текст автоответчика. Это сообщение отправляется в ответ на все входящие сообщения @{0} \ +автоматически. По умолчанию оно отключено. + + Текущий текст: +
+    {1}
+    
+ Отправьте сообщение, чтобы изменить текст. + """) + text = text.format(bot.name, bot.second_text if bot.second_text else "(отключено)") + if call: + await edit_or_create(call, text, keyboard, parse_mode="HTML") + else: + await AioBot.get_current().send_message(chat_id, text, reply_markup=keyboard, parse_mode="HTML") + + @dp.message_handler(state="wait_start_text", content_types="text", regexp="^[^/].+") # Not command async def start_text_received(message: types.Message, state: FSMContext): async with state.proxy() as proxy: @@ -179,6 +221,16 @@ async def start_text_received(message: types.Message, state: FSMContext): await send_bot_text_menu(bot, chat_id=message.chat.id) +@dp.message_handler(state="wait_second_text", content_types="text", regexp="^[^/].+") # Not command +async def second_text_received(message: types.Message, state: FSMContext): + async with state.proxy() as proxy: + bot_id = proxy.get("bot_id") + bot = await Bot.get_or_none(pk=bot_id) + bot.second_text = message.text + await bot.save() + await send_bot_second_text_menu(bot, chat_id=message.chat.id) + + @dp.callback_query_handler(menu_callback.filter(), state="*") async def callback(call: types.CallbackQuery, callback_data: dict, state: FSMContext): level = callback_data.get("level") @@ -216,3 +268,11 @@ async def callback(call: types.CallbackQuery, callback_data: dict, state: FSMCon if operation == "reset_text": await bot_actions.reset_bot_text(bot, call) return await send_bot_text_menu(bot, call) + if operation == "next_text": + await state.set_state("wait_second_text") + async with state.proxy() as proxy: + proxy["bot_id"] = bot.id + return await send_bot_second_text_menu(bot, call) + if operation == "reset_second_text": + await bot_actions.reset_bot_second_text(bot, call) + return await send_bot_second_text_menu(bot, call) diff --git a/olgram/migrations/models/4_20210926165918_update.sql b/olgram/migrations/models/4_20210926165918_update.sql new file mode 100644 index 0000000..855e0e8 --- /dev/null +++ b/olgram/migrations/models/4_20210926165918_update.sql @@ -0,0 +1,4 @@ +-- upgrade -- +ALTER TABLE "bot" ADD "second_text" TEXT; +-- downgrade -- +ALTER TABLE "bot" DROP COLUMN "second_text"; diff --git a/olgram/models/models.py b/olgram/models/models.py index 92aa08e..2ac7271 100644 --- a/olgram/models/models.py +++ b/olgram/models/models.py @@ -14,6 +14,7 @@ class Bot(Model): Здравствуйте! Напишите ваш вопрос и мы ответим вам в ближайшее время. """)) + second_text = fields.TextField(null=True, default=None) group_chats = fields.ManyToManyField("models.GroupChat", related_name="bots", on_delete=fields.relational.CASCADE, null=True) diff --git a/server/custom.py b/server/custom.py index bf59b0b..34ff1ea 100644 --- a/server/custom.py +++ b/server/custom.py @@ -45,6 +45,10 @@ async def message_handler(message, *args, **kwargs): # Это обычный чат: сообщение нужно переслать в супер-чат new_message = await message.forward(super_chat_id) await _redis.set(_message_unique_id(bot.pk, new_message.message_id), message.chat.id) + + # И отправить пользователю специальный текст, если он указан + if bot.second_text: + return SendMessage(chat_id=message.chat.id, text=bot.second_text) else: # Это супер-чат if message.reply_to_message: