diff --git a/core/commands/learn.py b/core/commands/learn.py new file mode 100644 index 0000000..672a063 --- /dev/null +++ b/core/commands/learn.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +""" +Команды управления режимом обучения: !learn, !stop_learn, !global_learn. +Поддерживают флаги --global и --title. + +Изменения для групповой работы: +- В групповом чате !learn не нужен для файлов (они индексируются автоматически), + но может использоваться для ссылок (если пользователь хочет добавить ссылку в БЗ комнаты). +- Режим обучения в комнате сохраняется с привязкой к комнате. +""" + +import logging +from core.commands.base import Command + +logger = logging.getLogger(__name__) + + +class LearnCommand(Command): + name = "!learn" + aliases = ["/learn", "!дуфкт", "/дуфкт", "/учись"] + + async def execute(self, msg, args: str, user_jid: str, room_jid: str = None): + """ + Включает режим обучения. В личном чате – для личной БЗ (или глобальной с флагом --global). + В групповом чате – для комнатной БЗ (флаг --global игнорируется). + """ + _, flags, _ = self.parse_args(args) + is_global = 'global' in flags + title = flags.get('title') + + # Проверка прав на глобальное обучение (только в личном чате) + if is_global and room_jid is None: + if user_jid not in self.bot.config.admin_jids: + reply = msg.reply("⛔ У вас нет прав на глобальное обучение.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить сообщение о недостатке прав на глобальное обучение") + return + + if room_jid: + # В групповом чате – режим обучения для комнаты (только ссылки, файлы и так автоматом) + mode = "room" + # Сохраняем режим с указанием комнаты + self.bot.learning_mode[user_jid] = (mode, room_jid) + if title: + reply = msg.reply(f"🎓 Режим обучения ВКЛЮЧЁН для КОМНАТНОЙ БЗ (--title \"{title}\"). При следующей ссылке будет использован заголовок.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить подтверждение обучения для комнаты с title") + else: + reply = msg.reply(f"🎓 Режим обучения ВКЛЮЧЁН для КОМНАТНОЙ БЗ. Теперь можно отправить ссылку – она добавится в БЗ комнаты.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить подтверждение обучения для комнаты") + else: + # Личный чат + mode = "global" if is_global else "personal" + self.bot.learning_mode[user_jid] = (mode, None) # храним кортеж для единообразия + if title: + reply = msg.reply(f"🎓 Режим обучения ВКЛЮЧЁН для {'ГЛОБАЛЬНОЙ' if is_global else 'ЛИЧНОЙ'} БЗ (--title \"{title}\").") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить подтверждение обучения с title") + else: + reply = msg.reply(f"🎓 Режим обучения ВКЛЮЧЁН для {'ГЛОБАЛЬНОЙ' if is_global else 'ЛИЧНОЙ'} БЗ.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить подтверждение обучения") + + def get_help(self) -> str: + return "Включает режим обучения (следующий файл/ссылка добавятся в БЗ). В личном чате – личная/глобальная, в групповом – комнатная. Флаги: --global (только личный), --title \"Название\"." + + +class StopLearnCommand(Command): + name = "!stop_learn" + aliases = ["/stop_learn", "/стоп", "!стоп", "!stop"] + + async def execute(self, msg, args: str, user_jid: str, room_jid: str = None): + """Выключает режим обучения для пользователя (в любом контексте).""" + self.bot.learning_mode.pop(user_jid, None) + reply = msg.reply("✅ Режим обучения ВЫКЛЮЧЕН.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить подтверждение выключения обучения") + + def get_help(self) -> str: + return "Выключает режим обучения." + + +class GlobalLearnCommand(Command): + name = "!global_learn" + aliases = ["/global_learn"] + permission = "admin" + + async def execute(self, msg, args: str, user_jid: str, room_jid: str = None): + """ + Включает глобальное обучение (только в личном чате, для админов). + В групповом чате команда не работает. + """ + if not self.check_permission(user_jid): + reply = msg.reply("⛔ Нет прав.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить сообщение о недостатке прав (learn)") + return + if room_jid: + reply = msg.reply("⚠️ Команда !global_learn работает только в личном чате.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить сообщение об ограничении !global_learn") + return + self.bot.learning_mode[user_jid] = ("global", None) + reply = msg.reply("🌐 Режим ГЛОБАЛЬНОГО обучения включён.") + if reply: + reply.send() # исправлено + else: + logger.error("Не удалось отправить подтверждение глобального обучения") + + def get_help(self) -> str: + return "Включает режим глобального обучения (админ, только в личном чате)." \ No newline at end of file