# * _ __ __ _ _ # * / \ _ _ _ __ ___ _ __ __ _| \/ | ___ __| |_ _| | ___ ___ # * / _ \| | | | '__/ _ \| '__/ _` | |\/| |/ _ \ / _` | | | | |/ _ \/ __| # * / ___ \ |_| | | | (_) | | | (_| | | | | (_) | (_| | |_| | | __/\__ \ # * /_/ \_\__,_|_| \___/|_| \__,_|_| |_|\___/ \__,_|\__,_|_|\___||___/ # * # * © Copyright 2024 # * # * https://t.me/AuroraModules # * # * 🔒 Code is licensed under GNU AGPLv3 # * 🌐 https://www.gnu.org/licenses/agpl-3.0.html # * ⛔️ You CANNOT edit this file without direct permission from the author. # * ⛔️ You CANNOT distribute this file if you have modified it without the direct permission of the author. # Name: AuroraFeedBack # Author: Felix? || n3rcy # Commands: # .flink | .banfeedback | .unbanfeedback # scope: hikka_only # meta developer: @AuroraModules & @nercymods # meta pic: https://i.postimg.cc/Hx3Zm8rB/logo.png # meta banner: https://te.legra.ph/file/05a519da50f993b950260.jpg __version__ = (1, 0, 2) from aiogram.types import Message as AiogramMessage from aiogram.types import CallbackQuery as AiogramCallbackQuery from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup from ..inline.types import InlineCall # type: ignore from html import escape from .. import loader, utils @loader.tds class AuroraFeedBackMod(loader.Module): """Multifunctional feedback bot.""" strings = { "name": "AuroraFeedBack", "new_m": "🗣 New message from", "not_text": "🔎 The text was not found.", "waiting_answer": "⏳ Waiting for answer to user", "flink": "Here is my link to the feedback bot", "owner_answer": "🗣 Owner's Response", "successfully_send": "💬 Message successfully sent", "not_arg": "❌ No UserID argument provided", "successfully_ban": "✅ User successfully banned", "successfully_unban": "✅ User successfully unbanned", "already_banned": "🚫 User is already banned", "not_in_ban": "✅ User is not in the ban list", "cfg_mode": "Enable/Disable feedback bot functionality", "cfg_custom_text": "Enter custom greeting text", "cfg_no_meta": "Enter custom text for /nometa", "cfg_no_meta_baner": "Enter custom link for meta-banner", } strings_ru = { "new_m": "🗣 Новое сообщение от", "not_text": "🔎 Текст не найден.", "waiting_answer": "⏳ Ожидание ответа пользователя", "flink": "Вот моя ссылка на feedback бота", "owner_answer": "🗣 Ответ владельца", "successfully_send": "💬 Сообщение успешно отправлено", "not_arg": "❌ Не указан UserID", "successfully_ban": "✅ Пользователь успешно заблокирован", "successfully_unban": "✅ Пользователь успешно разблокирован", "already_banned": "🚫 Пользователь уже заблокирован", "not_in_ban": "✅ Пользователь не находится в списке заблокированных", "cfg_mode": "Включить/выключить функционал feedback бота", "cfg_custom_text": "Введите кастомный текст для приветствия", "cfg_no_meta": "Введите кастомный текст для команды /nometa", "cfg_no_meta_baner": "Введите кастомную ссылку на мета-баннер", } strings_uz = { "new_m": "🗣 Yangi xabar", "not_text": "🔎 Matn topilmadi.", "waiting_answer": "⏳ Foydalanuvchidan javob kutilmoqda", "flink": "Bu mening feedback botim havolam", "owner_answer": "🗣 Egasi javobi", "successfully_send": "💬 Xabar muvaffaqiyatli yuborildi", "not_arg": "❌ UserID argument kiritilmagan", "successfully_ban": "✅ Foydalanuvchi muvaffaqiyatli bloklandi", "successfully_unban": "✅ Foydalanuvchi muvaffaqiyatli ochib tashlandi", "already_banned": "🚫 Foydalanuvchi allaqachon bloklangan", "not_in_ban": "✅ Foydalanuvchi blok ro'yxatida yo'q", "cfg_mode": "Feedback bot funktsiyasini yoqish/yopish", "cfg_custom_text": "Xush kelibsiz matnini kiriting", "cfg_no_meta": "/nometa uchun maxsus matnni kiriting", "cfg_no_meta_baner": "Meta-banner uchun maxsus havolani kiriting", } strings_de = { "new_m": "🗣 Neue Nachricht von", "not_text": "🔎 Der Text wurde nicht gefunden.", "waiting_answer": "⏳ Warten auf die Antwort des Benutzers", "flink": "Hier ist mein Link zum Feedback-Bot", "owner_answer": "🗣 Antwort des Eigentümers", "successfully_send": "💬 Nachricht erfolgreich gesendet", "not_arg": "❌ Kein UserID-Argument angegeben", "successfully_ban": "✅ Benutzer erfolgreich gesperrt", "successfully_unban": "✅ Benutzer erfolgreich entsperrt", "already_banned": "🚫 Benutzer ist bereits gesperrt", "not_in_ban": "✅ Benutzer befindet sich nicht in der Sperrliste", "cfg_mode": "Feedback-Bot-Funktionalität aktivieren/deaktivieren", "cfg_custom_text": "Geben Sie benutzerdefinierten Begrüßungstext ein", "cfg_no_meta": "Geben Sie benutzerdefinierten Text für /nometa ein", "cfg_no_meta_baner": "Geben Sie einen benutzerdefinierten Link für den Meta-Banner ein", } strings_es = { "new_m": "🗣 Nuevo mensaje de", "not_text": "🔎 No se encontró el texto.", "waiting_answer": "⏳ Esperando la respuesta del usuario", "flink": "Aquí está mi enlace al bot de retroalimentación", "owner_answer": "🗣 Respuesta del propietario", "successfully_send": "💬 Mensaje enviado con éxito", "not_arg": "❌ No se proporcionó el argumento UserID", "successfully_ban": "✅ Usuario bloqueado correctamente", "successfully_unban": "✅ Usuario desbloqueado correctamente", "already_banned": "🚫 El usuario ya está bloqueado", "not_in_ban": "✅ El usuario no está en la lista de bloqueados", "cfg_mode": "Activar/Desactivar la funcionalidad del bot de retroalimentación", "cfg_custom_text": "Ingrese texto de saludo personalizado", "cfg_no_meta": "Ingrese texto personalizado para /nometa", "cfg_no_meta_baner": "Ingrese el enlace personalizado para el meta-banner", } def __init__(self): self.config = loader.ModuleConfig( loader.ConfigValue( "mode", True, lambda: self.strings["cfg_mode"], validator=loader.validators.Boolean(), ), loader.ConfigValue( "start_custom_text", None, lambda: self.strings["cfg_custom_text"], ), loader.ConfigValue( "no_meta", None, lambda: self.strings["cfg_no_meta"], ), loader.ConfigValue( "no_meta_baner", "https://te.legra.ph/file/91a54dee84cf1ec5990fd.jpg", lambda: self.strings["cfg_no_meta_baner"], validator=loader.validators.Link(), ), ) async def on_dlmod(self, client, db): self.db.set("AuroraFeedBackMod", "ban_list", []) async def client_ready(self, client, db): self.forwarding_enabled = {} self._ban_list = self.db.get("AuroraFeedBackMod", "ban_list") self._name = utils.escape_html((await client.get_me()).first_name) self.db.set("AuroraFeedBackMod", "state", "done") @loader.command( ru_doc="- Получить ссылку на feedback бота", uz_doc="- Feedback botga havolani olish", de_doc="- Erhalten Sie einen Link zum Feedback-Bot", es_doc="- Obtener un enlace al bot de retroalimentación", ) async def flink(self, message): """- Get a link to the feedback bot""" slinkbot = f"{self.strings['flink']}: https://t.me/{self.inline.bot_username}?start=AuroraFeedBack" await utils.answer(message, slinkbot) @loader.command( ru_doc="[UserID] - Заблокировать пользователю feedback бота", uz_doc="[UserID] - Feedback botga foydalanuvchi kirishini bloklang", de_doc="[UserID] - Blockiere den Zugriff des Benutzers auf den Feedback-Bot", es_doc="[UserID] - Bloquear el acceso del usuario al bot de retroalimentación", ) async def banfeedback(self, message): """[UserID] - Block the feedback bot user""" user_id = utils.get_args_raw(message) if not user_id: await utils.answer(message, self.strings["not_arg"]) else: user_id = int(user_id) if user_id not in self._ban_list: self._ban_list.append(user_id) self.db.set("AuroraFeedBackMod", "ban_list", self._ban_list) await utils.answer(message, self.strings["successfully_ban"]) else: await utils.answer(message, self.strings["already_banned"]) @loader.command( ru_doc="[UserID] - Разблокировать пользователю feedback бота", uz_doc="[UserID] - Feedback bot foydalanuvchisini ochib tashlash", de_doc="[UserID] - Feedback-Bot-Benutzer entsperren", es_doc="[UserID] - Desbloquear al usuario del bot de retroalimentación", ) async def unbanfeedback(self, message): """[UserID] - Unblock the feedback bot user""" user_id = utils.get_args_raw(message) if not user_id: await utils.answer(message, self.strings["not_arg"]) else: user_id = int(user_id) if user_id in self._ban_list: self._ban_list.remove(user_id) self.db.set("AuroraFeedBackMod", "ban_list", self._ban_list) await utils.answer(message, self.strings["successfully_unban"]) else: await utils.answer(message, self.strings["not_in_ban"]) async def aiogram_watcher(self, message: AiogramMessage): if self.config["mode"] is False: return if message.from_user.id in list(self.db.get("AuroraFeedBackMod", "ban_list")): return if message.text == "/start AuroraFeedBack": if self.config["start_custom_text"] is None: text = "Добро пожаловать в Aurora Feedback Bot!\nПожалуйста, ознакомтесь с /nometa" else: text = self.config["start_custom_text"] await message.answer(text) return elif message.text == "/nometa": if self.config["no_meta"] is None: meta_text = "🫦 Уважаемый пользователь!\nПожалуйста, не задавайте мне вопросы такие, как:\n\n«Привет» , «Какие дела?» , «Что делаешь?» , «Чем занимаешься?» и т.д.\n\nЕсли вы хотите у меня что-то спросить, спрашивайте по делу, а также всю суть вопроса опишите в одном сообщении." else: meta_text = self.config["no_meta"] if self.config["no_meta_baner"] is None: await self.inline.bot.send_message( chat_id=message.from_user.id, text=meta_text ) else: await self.inline.bot.send_photo( chat_id=message.from_user.id, photo=self.config["no_meta_baner"], caption=meta_text, ) return if message.from_user.id == self.tg_id: state = self.db.get("AuroraFeedBackMod", "state") if state.startswith("waiting_"): to_id = int(state.split("_")[1]) waiting_message_id = int(state.split("_")[2]) custom_text = f"{self.strings['owner_answer']}:\n\n{message.text}" await self.inline.bot.send_message(chat_id=to_id, text=custom_text) await self.inline.bot.delete_message( chat_id=message.chat.id, message_id=waiting_message_id ) await self.inline.bot.send_message( chat_id=self.tg_id, text=f"{self.strings['successfully_send']}" ) self.db.set("AuroraFeedBackMod", "state", "done") return original_text = message.caption if message.caption else message.text user_id = message.from_user.id WriteInPM = f'✏️Write in PM' custom_text = f"{self.strings['new_m']} {escape(message.from_user.first_name)}:\n\n{escape(original_text) if original_text is not None else self.strings['not_text']}\n\nUserID: {message.from_user.id}\n{WriteInPM}" buttons = [] if message.from_user.id != getattr(self, "_tg_id", None): buttons.append( [ InlineKeyboardButton( text="📃 Reply", callback_data=f"reply_{user_id}" ) ] ) buttons.append( [InlineKeyboardButton(text="🔐 Ban", callback_data=f"ban_{user_id}")] ) buttons.append( [InlineKeyboardButton(text="🗑️ Delete", callback_data=f"MessageDelete")] ) reply_markup = InlineKeyboardMarkup(inline_keyboard=buttons) await self.inline.bot.send_message( chat_id=self.tg_id, text=custom_text, reply_markup=reply_markup ) await self.inline.bot.send_message( chat_id=message.from_user.id, text=f"{self.strings['successfully_send']}" ) async def feedback_callback_handler(self, call: InlineCall): if call.data == "MessageDelete": self.inline.ss(call.from_user.id, False) await self.inline.bot.delete_message( chat_id=call.message.chat.id, message_id=call.message.message_id, ) return if call.data.startswith("ban_"): user_id = int(call.data.split("_")[1]) if user_id not in self._ban_list: self._ban_list.append(user_id) self.db.set("AuroraFeedBackMod", "ban_list", self._ban_list) reply_markup = InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text="🔓 Unban", callback_data=f"unban_{user_id}" ) ] ] ) await self.inline.bot.send_message( chat_id=self.tg_id, text=f"{self.strings['successfully_ban']} ({user_id})", reply_markup=reply_markup, ) return if call.data.startswith("unban_"): user_id = int(call.data.split("_")[1]) if user_id in self._ban_list: self._ban_list.remove(user_id) self.db.set("AuroraFeedBackMod", "ban_list", self._ban_list) reply_markup = InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text="🔐 Ban", callback_data=f"ban_{user_id}" ) ] ] ) await self.inline.bot.send_message( chat_id=self.tg_id, text=f"{self.strings['successfully_unban']} ({user_id})", reply_markup=reply_markup, ) return if call.data.startswith("reply"): user_id = int(call.data.split("_")[1]) self.db.set( "AuroraFeedBackMod", "state", f"waiting_{user_id}_{call.message.message_id}", ) reply_markup = InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text="❌ Cancel", callback_data=f"cancel_reply" ) ] ] ) await self.inline.bot.send_message( chat_id=self.tg_id, text=f"{self.strings['waiting_answer']}", reply_markup=reply_markup, ) if call.data == "cancel_reply": self.db.set("AuroraFeedBackMod", "state", "done") await self.inline.bot.delete_message( chat_id=call.message.chat.id, message_id=call.message.message_id )