Добавлен второй текст бота

This commit is contained in:
mihalin 2021-09-26 18:15:46 +03:00
parent 8013c8c8e4
commit 0f84b67b49
6 changed files with 87 additions and 6 deletions

View File

@ -13,8 +13,8 @@
* ``POSTGRES_PASSWORD`` - любой случайный пароль * ``POSTGRES_PASSWORD`` - любой случайный пароль
* ``WEBHOOK_HOST`` - IP адрес или доменное имя сервера, на котором запускается проект * ``WEBHOOK_HOST`` - IP адрес или доменное имя сервера, на котором запускается проект
2. Сохраните файл `docker-compose.yaml <https://github.com/civsocit/olgram/blob/main/docker-compose.yaml>`_ 2. Рядом с файлом .env сохраните файл
и соберите его: `docker-compose.yaml <https://github.com/civsocit/olgram/blob/main/docker-compose.yaml>`_ и соберите его:
.. code-block:: console .. code-block:: console

View File

@ -36,6 +36,18 @@ async def reset_bot_text(bot: Bot, call: types.CallbackQuery):
await call.answer("Текст сброшен") 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): async def select_chat(bot: Bot, call: types.CallbackQuery, chat: str):
""" """
Пользователь выбрал чат, в который хочет получать сообщения от бота Пользователь выбрал чат, в который хочет получать сообщения от бота

View File

@ -143,13 +143,18 @@ async def send_bot_text_menu(bot: Bot, call: ty.Optional[types.CallbackQuery] =
await call.answer() await call.answer()
keyboard = types.InlineKeyboardMarkup(row_width=2) keyboard = types.InlineKeyboardMarkup(row_width=2)
keyboard.insert( keyboard.insert(
types.InlineKeyboardButton(text="Сбросить текст", types.InlineKeyboardButton(text="<< Завершить редактирование",
callback_data=menu_callback.new(level=3, bot_id=bot.id, operation="reset_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)) chat=empty))
) )
keyboard.insert( keyboard.insert(
types.InlineKeyboardButton(text="<< Завершить редактирование", types.InlineKeyboardButton(text="Сбросить текст",
callback_data=menu_callback.new(level=1, bot_id=bot.id, operation=empty, chat=empty)) callback_data=menu_callback.new(level=3, bot_id=bot.id, operation="reset_text",
chat=empty))
) )
text = dedent(""" 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") 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} \
автоматически. По умолчанию оно отключено.
Текущий текст:
<pre>
{1}
</pre>
Отправьте сообщение, чтобы изменить текст.
""")
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 @dp.message_handler(state="wait_start_text", content_types="text", regexp="^[^/].+") # Not command
async def start_text_received(message: types.Message, state: FSMContext): async def start_text_received(message: types.Message, state: FSMContext):
async with state.proxy() as proxy: 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) 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="*") @dp.callback_query_handler(menu_callback.filter(), state="*")
async def callback(call: types.CallbackQuery, callback_data: dict, state: FSMContext): async def callback(call: types.CallbackQuery, callback_data: dict, state: FSMContext):
level = callback_data.get("level") level = callback_data.get("level")
@ -216,3 +268,11 @@ async def callback(call: types.CallbackQuery, callback_data: dict, state: FSMCon
if operation == "reset_text": if operation == "reset_text":
await bot_actions.reset_bot_text(bot, call) await bot_actions.reset_bot_text(bot, call)
return await send_bot_text_menu(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)

View File

@ -0,0 +1,4 @@
-- upgrade --
ALTER TABLE "bot" ADD "second_text" TEXT;
-- downgrade --
ALTER TABLE "bot" DROP COLUMN "second_text";

View File

@ -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, group_chats = fields.ManyToManyField("models.GroupChat", related_name="bots", on_delete=fields.relational.CASCADE,
null=True) null=True)

View File

@ -45,6 +45,10 @@ async def message_handler(message, *args, **kwargs):
# Это обычный чат: сообщение нужно переслать в супер-чат # Это обычный чат: сообщение нужно переслать в супер-чат
new_message = await message.forward(super_chat_id) new_message = await message.forward(super_chat_id)
await _redis.set(_message_unique_id(bot.pk, new_message.message_id), message.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: else:
# Это супер-чат # Это супер-чат
if message.reply_to_message: if message.reply_to_message: