mirror of
https://github.com/civsocit/olgram.git
synced 2023-07-22 01:29:12 +03:00
Добавлен второй текст бота
This commit is contained in:
parent
8013c8c8e4
commit
0f84b67b49
@ -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
|
||||||
|
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
Пользователь выбрал чат, в который хочет получать сообщения от бота
|
Пользователь выбрал чат, в который хочет получать сообщения от бота
|
||||||
|
@ -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)
|
||||||
|
4
olgram/migrations/models/4_20210926165918_update.sql
Normal file
4
olgram/migrations/models/4_20210926165918_update.sql
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
-- upgrade --
|
||||||
|
ALTER TABLE "bot" ADD "second_text" TEXT;
|
||||||
|
-- downgrade --
|
||||||
|
ALTER TABLE "bot" DROP COLUMN "second_text";
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user