diff --git a/olgram/commands/bot_actions.py b/olgram/commands/bot_actions.py
index 1eeee75..0ae0c2e 100644
--- a/olgram/commands/bot_actions.py
+++ b/olgram/commands/bot_actions.py
@@ -140,6 +140,11 @@ async def mailing(bot: Bot, call: types.CallbackQuery):
await bot.save(update_fields=["enable_mailing"])
+async def tags(bot: Bot, call: types.CallbackQuery):
+ bot.enable_tags = not bot.enable_tags
+ await bot.save(update_fields=["enable_tags"])
+
+
async def go_mailing(bot: Bot, context: dict) -> int:
users = await bot.mailing_users
a_bot = AioBot(bot.decrypted_token())
diff --git a/olgram/commands/menu.py b/olgram/commands/menu.py
index fc907e7..ab1bcb0 100644
--- a/olgram/commands/menu.py
+++ b/olgram/commands/menu.py
@@ -197,6 +197,12 @@ async def send_bot_settings_menu(bot: Bot, call: types.CallbackQuery):
operation="thread_interrupt",
chat=empty))
)
+ keyboard.insert(
+ types.InlineKeyboardButton(text=_("Теги"),
+ callback_data=menu_callback.new(level=3, bot_id=bot.id,
+ operation="tags",
+ chat=empty))
+ )
is_promo = await bot.is_promo()
if is_promo:
keyboard.insert(
@@ -217,6 +223,7 @@ async def send_bot_settings_menu(bot: Bot, call: types.CallbackQuery):
enable_always_second_message = _("включён") if bot.enable_always_second_message else _("выключен")
thread_interrupt = _("да") if bot.enable_thread_interrupt else _("нет")
mailing_turn = _("включена") if bot.enable_mailing else _("выключена")
+ tags_turn = _("включены") if bot.enable_tags else _("выключены")
text = dedent(_("""
Потоки сообщений: {0}
Данные пользователя: {1}
@@ -224,8 +231,9 @@ async def send_bot_settings_menu(bot: Bot, call: types.CallbackQuery):
Автоответчик всегда: {3}
Прерывать поток: {4}
Рассылка: {5}
+ Теги: {6}
""")).format(thread_turn, info_turn, antiflood_turn, enable_always_second_message, thread_interrupt,
- mailing_turn)
+ mailing_turn, tags_turn)
if is_promo:
olgram_turn = _("включена") if bot.enable_olgram_text else _("выключена")
@@ -672,6 +680,9 @@ async def callback(call: types.CallbackQuery, callback_data: dict, state: FSMCon
if operation == "mailing":
await bot_actions.mailing(bot, call)
return await send_bot_settings_menu(bot, call)
+ if operation == "tags":
+ await bot_actions.tags(bot, call)
+ return await send_bot_settings_menu(bot, call)
if operation == "thread_interrupt":
await bot_actions.thread_interrupt(bot, call)
return await send_bot_settings_menu(bot, call)
diff --git a/server/custom.py b/server/custom.py
index fb76b84..5bed877 100644
--- a/server/custom.py
+++ b/server/custom.py
@@ -81,7 +81,7 @@ def _on_security_policy(message: types.Message, bot):
parse_mode="HTML")
-async def send_user_message(message: types.Message, super_chat_id: int, bot):
+async def send_user_message(message: types.Message, super_chat_id: int, bot, tag: str = ""):
"""Переслать сообщение от пользователя, добавлять к нему user info при необходимости"""
if bot.enable_additional_info:
user_info = _("Сообщение от пользователя ")
@@ -106,6 +106,15 @@ async def send_user_message(message: types.Message, super_chat_id: int, bot):
new_message_2 = await message.copy_to(super_chat_id, reply_to_message_id=new_message.message_id)
await _redis.set(_message_unique_id(bot.pk, new_message_2.message_id), message.chat.id,
pexpire=ServerSettings.redis_timeout_ms())
+ elif tag:
+ # добавлять тег в конец текста
+ if message.content_type == types.ContentType.TEXT and len(message.text) + len(tag) < 4093:
+ new_message = await message.bot.send_message(super_chat_id, message.text + "\n\n" + tag)
+ else:
+ new_message = await message.bot.send_message(super_chat_id, text=tag)
+ new_message_2 = await message.copy_to(super_chat_id, reply_to_message_id=new_message.message_id)
+ await _redis.set(_message_unique_id(bot.pk, new_message_2.message_id), message.chat.id,
+ pexpire=ServerSettings.redis_timeout_ms())
else:
try:
new_message = await message.forward(super_chat_id)
@@ -119,6 +128,13 @@ async def send_user_message(message: types.Message, super_chat_id: int, bot):
async def send_to_superchat(is_super_group: bool, message: types.Message, super_chat_id: int, bot):
"""Пересылка сообщения от пользователя оператору (логика потоков сообщений)"""
+ if bot.enable_tags:
+ tag = await _redis.get(_tag_uid(bot.pk, message.chat.id))
+ else:
+ tag = ""
+ if tag:
+ tag = str(tag)
+
if is_super_group and bot.enable_threads:
if bot.enable_thread_interrupt:
thread_timeout = ServerSettings.thread_timeout_ms()
@@ -128,20 +144,34 @@ async def send_to_superchat(is_super_group: bool, message: types.Message, super_
if thread_first_message:
# переслать в супер-чат, отвечая на предыдущее сообщение
try:
- new_message = await message.copy_to(super_chat_id, reply_to_message_id=int(thread_first_message))
+ if tag:
+ if message.content_type == types.ContentType.TEXT and len(message.text) + len(tag) < 4093:
+ new_message = await message.bot.send_message(
+ super_chat_id,
+ message.text + "\n\n" + tag,
+ reply_to_message_id=int(thread_first_message))
+ else:
+ new_message = await message.copy_to(super_chat_id,
+ reply_to_message_id=int(thread_first_message))
+ new_message_2 = await message.bot.send_message(
+ super_chat_id, reply_to_message_id=new_message.message_id, text=tag)
+ await _redis.set(_message_unique_id(bot.pk, new_message_2.message_id), message.chat.id,
+ pexpire=thread_timeout)
+ else:
+ new_message = await message.copy_to(super_chat_id, reply_to_message_id=int(thread_first_message))
await _redis.set(_message_unique_id(bot.pk, new_message.message_id), message.chat.id,
pexpire=thread_timeout)
except exceptions.BadRequest:
- new_message = await send_user_message(message, super_chat_id, bot)
+ new_message = await send_user_message(message, super_chat_id, bot, tag)
await _redis.set(
_thread_unique_id(bot.pk, message.chat.id), new_message.message_id, pexpire=thread_timeout)
else:
# переслать супер-чат
- new_message = await send_user_message(message, super_chat_id, bot)
+ new_message = await send_user_message(message, super_chat_id, bot, tag)
await _redis.set(_thread_unique_id(bot.pk, message.chat.id), new_message.message_id,
pexpire=thread_timeout)
else: # личные сообщения не поддерживают потоки сообщений: просто отправляем сообщение
- await send_user_message(message, super_chat_id, bot)
+ await send_user_message(message, super_chat_id, bot, tag)
async def _increase_count(_bot):
@@ -223,14 +253,15 @@ async def handle_operator_message(message: types.Message, super_chat_id: int, bo
else:
await banned_user.delete()
return SendMessage(chat_id=message.chat.id, text=_("Пользователь разбанен"))
- if message.text.startswith("/tag "):
- tag = message.text.replace("/tag ", "")[:20].strip()
- if tag:
- await _redis.set(_tag_uid(bot.pk, chat_id), tag, pexpire=ServerSettings.redis_timeout_ms())
- return SendMessage(chat_id=message.chat.id, text=_("Тег выставлен"))
- else:
- await _redis.delete(_tag_uid(bot.pk, chat_id))
- return SendMessage(chat_id=message.chat.id, text=_("Тег убран"))
+ if bot.enable_tags:
+ if message.text.startswith("/tag "):
+ tag = message.text.replace("/tag ", "")[:20].strip()
+ if tag:
+ await _redis.set(_tag_uid(bot.pk, chat_id), tag, pexpire=ServerSettings.redis_timeout_ms())
+ return SendMessage(chat_id=message.chat.id, text=_("Тег выставлен"))
+ else:
+ await _redis.delete(_tag_uid(bot.pk, chat_id))
+ return SendMessage(chat_id=message.chat.id, text=_("Тег убран"))
try:
await message.copy_to(chat_id)