From 5b28f9f5884298835e2df8ac3b83c0a9fc23c59e Mon Sep 17 00:00:00 2001 From: profitroll Date: Thu, 5 Jan 2023 14:34:02 +0100 Subject: [PATCH] Caption and category added for spoilers --- locale/uk.json | 20 ++++++--- modules/commands/reapply.py | 6 ++- modules/commands/spoiler.py | 6 ++- modules/commands/sponsorship.py | 6 ++- modules/commands/start.py | 6 +-- modules/handlers/everything.py | 74 +++++++++++++++++++++++---------- modules/inline.py | 2 +- validation/spoilers.json | 11 +++++ 8 files changed, 94 insertions(+), 37 deletions(-) diff --git a/locale/uk.json b/locale/uk.json index 3ffe249..b46c9c4 100644 --- a/locale/uk.json +++ b/locale/uk.json @@ -92,7 +92,7 @@ "sponsorships_expires": "⚠️ **Нагадування**\nНадана платна підписка припинить діяти **за {0} д**. Будь ласка, оновіть дані про неї командою /sponsorship інакше роль буде втрачено!", "sponsorships_expired": "⚠️ **Нагадування**\nТермін дії вказаної підписки сплив. Для повторного отримання ролі користуйся командою /sponsorship.", "label_too_long": "Довжина назви ролі не повинна перевищувати 16 символів", - "finish_sponsorship": "❌ **Дія неможлива**\nПерш ніж заповнювати анкету, треба завершити заповнення форми спонсора.", + "finish_sponsorship": "❌ **Дія неможлива**\nПерш ніж заповнювати анкету, треба завершити заповнення форми спонсора або перервати його командою /cancel.", "finish_application": "❌ **Дія неможлива**\nПерш ніж заповнювати форму спонсора, треба завершити заповнення анкети.", "nearby_invalid": "ℹ️ **Місце не знайдено**\nЗа наданим запитом не знайдено місце з координатами. Спробуйте ще раз формулючи запит в стилі \"Чернівці\" або \"Київська область\".", "nearby_error": "⚠️ **Сталась помилка**\n\nПомилка: `{0}`\n\nTraceback:\n```\n{1}\n```", @@ -102,15 +102,18 @@ "identify_invalid_syntax": "Неправильний синтаксис!\nТреба: `/identify ID/NAME/USERNAME`", "identify_not_found": "Не знайдено користувачів за запитом **{0}**", "identify_success": "Користувач `{0}`\n\nІм'я: {1}\nЮзернейм: {2}\nЄ в чаті: {3}\nЄ адміном: {4}\nРоль: {5}\nНаявна анкета: {6}\nНаявне спонсорство: {7}", - "spoiler_started": "Розпочато створення спойлера. Надішліть щось", + "spoiler_started": "Розпочато створення спойлера. Будь ласка, оберіть категорію спойлера за допомогою клавіатури бота.", "spoiler_unfinished": "У вас ще є незавершений спойлер. Надішліть /cancel щоб зупинити його створення", "spoiler_cancel": "Створення спойлера було припинено", "spoiler_empty": "Спойлер без опису", "spoiler_described": "Спойлер: {0}", "spoiler_description_enter": "Добре, введіть бажаний опис спойлера", - "spoiler_using_description": "Встановлено опис спойлера: {0}", - "spoiler_send_description": "Майже впорались. Тепер треба надіслати коротенький опис спойлера, щоб люди розуміли що під ним варто очкувати. Надішли мінус (-) щоб пропустити цей крок.", + "spoiler_using_description": "Встановлено опис спойлера: {0}\n\nЗалишилось додати вміст самого спойлера. Бот приймає текстове повідомлення, фото, відео а також гіф зображення (1 шт.)", + "spoiler_send_description": "Тепер треба надіслати коротенький опис спойлера, щоб люди розуміли що під ним варто очкувати. Надішли мінус (-) щоб пропустити цей крок.", "spoiler_ready": "Успіх! Спойлер створено. Користуйтесь кнопкою нижче щоб надіслати його.", + "spoiler_incorrect_content": "Бот не підтримує такий контент. Будь ласка, надішли текст, фото, відео або анімацію (гіф).", + "spoiler_incorrect_category": "Вказана категорія не є дійсною. Будь ласка, користуйся клавіатурою бота (кнопка біля 📎) для вибору категорії.", + "spoiler_in_progress": "❌ **Дія неможлива**\nПерш ніж починати нову дію, треба завершити створення спойлера або перервати його командою /cancel.", "yes": "Так", "no": "Ні", "voice_message": [ @@ -134,6 +137,11 @@ "question_streamer": "Стрімер:", "question_expires": "Підписка до:", "question_label": "Хоче роль:" + }, + "spoiler_categories": { + "nsfw": "NSFW контент", + "deanon": "Деанон холо-учасників", + "other": "Інше" } }, "keyboard": { @@ -158,7 +166,7 @@ "Ні, повторно заповнити" ] ], - "spoiler_description": [ + "spoiler_categories": [ [ "NSFW контент" ], @@ -166,7 +174,7 @@ "Деанон холо-учасників" ], [ - "Інше (надішліть свій текст)" + "Інше" ] ] }, diff --git a/modules/commands/reapply.py b/modules/commands/reapply.py index 35f7467..c817c77 100644 --- a/modules/commands/reapply.py +++ b/modules/commands/reapply.py @@ -15,7 +15,7 @@ async def cmd_reapply(app: Client, msg: Message): holo_user = HoloUser(msg.from_user) # Check if user has approved/rejected tmp application - if (holo_user.application_state()[0] in ["approved", "rejected"]) or (holo_user.application_state()[0] == "none"): + if ((holo_user.application_state()[0] in ["approved", "rejected"]) or (holo_user.application_state()[0] == "none")) and holo_user.spoiler_state() is False: # Check if user's tmp application is already completed or even sent if ((holo_user.application_state()[1] is True) and (not col_tmp.find_one({"user": holo_user.id, "type": "application"})["sent"])) or (holo_user.application_state()[0] == "none"): @@ -51,6 +51,10 @@ async def cmd_reapply(app: Client, msg: Message): ] ])) + elif holo_user.spoiler_state() is True: + + await msg.reply_text(locale("spoiler_in_progress", "message", locale=holo_user)) + else: if (holo_user.application_state()[0] == "fill") and (col_tmp.find_one({"user": holo_user.id, "type": "application"})["sent"] is True): diff --git a/modules/commands/spoiler.py b/modules/commands/spoiler.py index 3239178..cecac06 100644 --- a/modules/commands/spoiler.py +++ b/modules/commands/spoiler.py @@ -1,6 +1,6 @@ from app import app from pyrogram import filters -from pyrogram.types import Message, ForceReply +from pyrogram.types import Message, ReplyKeyboardMarkup from pyrogram.client import Client from classes.holo_user import HoloUser, UserInvalidError, UserNotFoundError from modules.logging import logWrite @@ -25,15 +25,17 @@ async def cmd_spoiler(app: Client, msg: Message): { "user": msg.from_user.id, "completed": False, + "category": None, "description": None, "photo": None, "video": None, "animation": None, + "caption": None, "text": None } ) - await msg.reply_text(locale("spoiler_started", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_content", "force_reply", locale=msg.from_user))) + await msg.reply_text(locale("spoiler_started", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("spoiler_categories", "keyboard"), resize_keyboard=True, one_time_keyboard=True)) logWrite(f"User {msg.from_user.id} started creating new spoiler") else: diff --git a/modules/commands/sponsorship.py b/modules/commands/sponsorship.py index ea869b1..4896b2a 100644 --- a/modules/commands/sponsorship.py +++ b/modules/commands/sponsorship.py @@ -10,9 +10,13 @@ from modules.database import col_applications # Sponsorship command ========================================================================================================== @app.on_message(custom_filters.enabled_sponsorships & ~filters.scheduled & filters.command(["sponsorship"], prefixes=["/"]) & (custom_filters.allowed | custom_filters.admin)) async def cmd_sponsorship(app: Client, msg: Message): - if HoloUser(msg.from_user).application_state()[0] == "fill": + holo_user = HoloUser(msg.from_user) + if holo_user.application_state()[0] == "fill": await msg.reply_text(locale("finish_application", "message", locale=msg.from_user), quote=should_quote(msg)) return + if holo_user.spoiler_state() is True: + await msg.reply_text(locale("spoiler_in_progress", "message", locale=holo_user)) + return await msg.reply_text(locale("sponsorship_apply", "message", locale=msg.from_user), reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text=str(locale("sponsor_apply", "button", locale=msg.from_user)), callback_data=f"sponsor_apply_{msg.from_user.id}")]]), quote=should_quote(msg)) # else: # await msg.reply_text(locale("sponsorship_application_empty", "message")) diff --git a/modules/commands/start.py b/modules/commands/start.py index 66cb464..109a743 100644 --- a/modules/commands/start.py +++ b/modules/commands/start.py @@ -33,11 +33,11 @@ async def cmd_start(app: Client, msg: Message): try: spoiler = col_spoilers.find_one( {"_id": ObjectId(msg.command[1])} ) if spoiler["photo"] is not None: - await msg.reply_photo(spoiler["photo"]) + await msg.reply_photo(spoiler["photo"], caption=spoiler["caption"]) if spoiler["video"] is not None: - await msg.reply_video(spoiler["video"]) + await msg.reply_video(spoiler["video"], caption=spoiler["caption"]) if spoiler["animation"] is not None: - await msg.reply_animation(spoiler["animation"]) + await msg.reply_animation(spoiler["animation"], caption=spoiler["caption"]) if spoiler["text"] is not None: await msg.reply_text(spoiler["text"]) except InvalidId: diff --git a/modules/handlers/everything.py b/modules/handlers/everything.py index df8e7fe..6203054 100644 --- a/modules/handlers/everything.py +++ b/modules/handlers/everything.py @@ -63,40 +63,68 @@ async def any_stage(app: Client, msg: Message): if spoiler is None: return - if msg.photo is not None: - col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"photo": msg.photo.file_id}} ) - await msg.reply_text(locale("spoiler_send_description", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("spoiler_description", "keyboard"), resize_keyboard=True, one_time_keyboard=True, placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user))) - logWrite(f"Adding photo with id {msg.photo.file_id} to {msg.from_user.id}'s spoiler") + if spoiler["category"] is None: + + found = False + + # Find category in all locales + for lc in all_locales("spoiler_categories", "message"): + for key in lc: + if lc[key] == msg.text: + found = True + category = key + + if found is False: + await msg.reply_text(locale("spoiler_incorrect_category", "message", locale=msg.from_user)) + return + + col_spoilers.find_one_and_update( {"_id": spoiler["_id"]}, {"$set": {"category": category}} ) + await msg.reply_text(locale("spoiler_send_description", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user))) return + if spoiler["description"] is None and (spoiler["photo"] is None and spoiler["video"] is None and spoiler["animation"] is None and spoiler["text"] is None): + + # for lc in all_locales("spoiler_description", "keyboard"): + # if msg.text == lc[-1][0]: + # await msg.reply_text(locale("spoiler_description_enter", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user))) + # return + + if msg.text != "-": + col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"description": msg.text}} ) + else: + col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"description": ""}} ) + + logWrite(f"Adding description '{msg.text}' to {msg.from_user.id}'s spoiler") + await msg.reply_text(locale("spoiler_using_description", "message", locale=msg.from_user).format(msg.text), reply_markup=ForceReply(placeholder=locale("spoiler_content", "force_reply", locale=msg.from_user))) + + return + + ready = False + + if msg.photo is not None: + col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"photo": msg.photo.file_id, "caption": msg.caption, "completed": True}} ) + logWrite(f"Adding photo with id {msg.photo.file_id} to {msg.from_user.id}'s spoiler") + ready = True + if msg.video is not None: - col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"video": msg.video.file_id}} ) - await msg.reply_text(locale("spoiler_send_description", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("spoiler_description", "keyboard"), resize_keyboard=True, one_time_keyboard=True, placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user))) + col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"video": msg.video.file_id, "caption": msg.caption, "completed": True}} ) logWrite(f"Adding video with id {msg.video.file_id} to {msg.from_user.id}'s spoiler") - return + ready = True if msg.animation is not None: - col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"animation": msg.animation.file_id}} ) - await msg.reply_text(locale("spoiler_send_description", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("spoiler_description", "keyboard"), resize_keyboard=True, one_time_keyboard=True, placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user))) + col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"animation": msg.animation.file_id, "caption": msg.caption, "completed": True}} ) logWrite(f"Adding animation with id {msg.animation.file_id} to {msg.from_user.id}'s spoiler") - return + ready = True if spoiler["photo"] is None and spoiler["video"] is None and spoiler["animation"] is None and spoiler["text"] is None: - col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"text": msg.text}} ) - await msg.reply_text(locale("spoiler_send_description", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("spoiler_description", "keyboard"), resize_keyboard=True, one_time_keyboard=True, placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user))) + col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"text": msg.text, "completed": True}} ) logWrite(f"Adding text '{msg.text}' to {msg.from_user.id}'s spoiler") + ready = True + + if ready is True: + await msg.reply_text(locale("spoiler_ready", "message", locale=msg.from_user), reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_send", "button", locale=msg.from_user), switch_inline_query=f"spoiler:{spoiler['_id'].__str__()}")]])) else: - for lc in all_locales("spoiler_description", "keyboard"): - if msg.text == lc[-1][0]: - await msg.reply_text(locale("spoiler_description_enter", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user))) - return - if msg.text != "-": - col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"description": msg.text, "completed": True}} ) - else: - col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"description": None, "completed": True}} ) - logWrite(f"Adding description '{msg.text}' to {msg.from_user.id}'s spoiler") - await msg.reply_text(locale("spoiler_using_description", "message", locale=msg.from_user).format(msg.text), reply_markup=ReplyKeyboardRemove()) - await msg.reply_text(locale("spoiler_ready", "message", locale=msg.from_user), quote=False, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_send", "button", locale=msg.from_user), switch_inline_query=f"spoiler:{spoiler['_id'].__str__()}")]])) + await msg.reply_text(locale("spoiler_incorrect_content", "message", locale=msg.from_user)) @app.on_message(~ filters.scheduled & filters.group) diff --git a/modules/inline.py b/modules/inline.py index 2f30ac2..7d07a94 100644 --- a/modules/inline.py +++ b/modules/inline.py @@ -28,7 +28,7 @@ async def inline_answer(client: Client, inline_query: InlineQuery): if spoil is not None: - desc = locale("spoiler_empty", "message", locale=inline_query.from_user) if spoil["description"] is None else locale("spoiler_described", "message", locale=inline_query.from_user).format(spoil["description"]) + desc = locale("spoiler_empty", "message", locale=inline_query.from_user) if spoil["description"] == "" else locale("spoiler_described", "message", locale=inline_query.from_user).format(spoil["description"]) results = [ InlineQueryResultArticle( diff --git a/validation/spoilers.json b/validation/spoilers.json index 1837cbb..8c6733d 100644 --- a/validation/spoilers.json +++ b/validation/spoilers.json @@ -3,10 +3,12 @@ "required": [ "user", "completed", + "category", "description", "photo", "video", "animation", + "caption", "text" ], "properties": { @@ -18,6 +20,11 @@ "bsonType": "bool", "description": "Whether spoiler is a completed one" }, + "category": { + "bsonType": ["string", "null"], + "enum": ["nsfw", "deanon", "other"], + "description": "Spoiler's category" + }, "description": { "bsonType": ["string", "null"], "description": "Spoiler's description" @@ -34,6 +41,10 @@ "bsonType": ["string", "null"], "description": "Spoilered animation/GIF" }, + "caption": { + "bsonType": ["string", "null"], + "description": "Spoilered caption for media" + }, "text": { "bsonType": ["string", "null"], "description": "Spoilered text"