From 3e22ad1895d36191b5c16e0886c54e6208d0043a Mon Sep 17 00:00:00 2001 From: profitroll Date: Tue, 18 Apr 2023 16:01:42 +0200 Subject: [PATCH] Improved sponsorship fill --- locale/uk.json | 19 ++++ modules/commands/sponsorship.py | 170 ++++++++++++++++++++++++++------ 2 files changed, 160 insertions(+), 29 deletions(-) diff --git a/locale/uk.json b/locale/uk.json index 8ae15be..13c8248 100644 --- a/locale/uk.json +++ b/locale/uk.json @@ -96,12 +96,15 @@ "sponsor_got": "Отримано форму на спонсорство від `{0}`\n\nІм'я тг: `{1}`\nЮзернейм: @{2}\n\n**Дані форми:**\n{3}", "sponsor_rejected_by": "❌ **Підписку відхилено**\nАдмін **{0}** переглянув та відхилив форму `{1}`.", "sponsor_rejected": "Ой лишенько! Твою форму переглянули, однак не підтвердили її. Можливо, щось не так з датами, або ж бажана роль не може бути надана.\n\nТи можеш спробувати повторно заповнити форму командою /sponsorship", + "sponsor_resubmit_invalid_option": "Правильна опція! Спробуй /sponsorship ще раз, але користуйся клавіатурою щоб обрати з можливих варіантів.", + "sponsor_resubmit": "Здається, ти маєш активну підписку на **{0}**. Хочеш подовжити її чи заповнити нову?", "sponsor1_invalid": "Будь ласка, введіть ім'я не довше за 240 символів", "sponsor1": "На яку саме дівчину платна підписка?", "sponsor2_invalid": "Будь ласка, введи дату формату `ДД.ММ.РРРР`", "sponsor2_past": "Вказана дата знаходиться в минулому. Будь ласка, вкажіть правильний термін дії підписки", "sponsor2": "До якої дати (`ДД.ММ.РРРР`) підписка?", "sponsor3": "Будь ласка, надішли одне фото для підтвердження дійсності підписки\n\nℹ️ **Підказка**\nПрочитай як правильно скрінити легітимне підтвердження підписки: https://telegra.ph/Pіdpiska-na-holo-dіvchinu-01-02", + "sponsor4_resubmit": "Майже закінчили. Стара роль **{0}** може бути використана і цього разу, а може бути змінена. Будь ласка, обери те, що тобі підходить.\n\n⚠️ **Увага!**\nПісля обирання варіанту або введення нової назви ролі, заявку буде надіслано автоматично. Для відміни дії зараз ще можна використовувати /cancel", "sponsor4": "Яку роль ти бажаєш отримати?\n\nℹ️ **Підказка**\nНазва ролі повинна бути якось пов'язана зі вказаною дівчиною, не повинна порушувати правила спільноти а також має бути не довше за 16 символів (обмеження Telegram).", "sponsorship_application_empty": "❌ **Дія неможлива**\nУ тебе немає заповненої та схваленої анкети. Заповни таку за допомогою /reapply та спробуй ще раз після її підтвердження.", "sponsorship_apply": "ℹ️ Оформіть платну підписку на когось з Холо, заповніть форму та отримайте особливу роль в якості винагороди!", @@ -195,6 +198,22 @@ [ "Інше" ] + ], + "sponsorship_restore": [ + [ + "Подовжити стару" + ], + [ + "Заповнити нову підписку" + ] + ], + "sponsorship_restore_label": [ + [ + "Залишити стару" + ], + [ + "Ввести замість неї нову" + ] ] }, "force_reply": { diff --git a/modules/commands/sponsorship.py b/modules/commands/sponsorship.py index 76b0ad1..eb816ec 100644 --- a/modules/commands/sponsorship.py +++ b/modules/commands/sponsorship.py @@ -13,8 +13,9 @@ from pyrogram.types import ( from pyrogram.client import Client from classes.holo_user import HoloUser from modules import custom_filters -from modules.utils import locale, should_quote -from modules.database import col_sponsorships +from modules.handlers.confirmation import confirm_yes +from modules.utils import all_locales, locale, should_quote +from modules.database import col_sponsorships, col_tmp from convopyro import listen_message @@ -74,9 +75,11 @@ async def cmd_sponsorship(app: Client, msg: Message): return await msg.reply_text( - f'You have an active membership for **{existent["sponsorship"]["streamer"]}**. Wanna resubmit it once more?', + locale("sponsor_resubmit", "message", locale=msg.from_user).format( + existent["sponsorship"]["streamer"] + ), reply_markup=ReplyKeyboardMarkup( - [["Yep, use old data"], ["Nope, refill it once more"]], + locale("sponsorship_restore", "keyboard", locale=msg.from_user), resize_keyboard=True, one_time_keyboard=True, ), @@ -89,10 +92,26 @@ async def cmd_sponsorship(app: Client, msg: Message): input_streamer = existent["sponsorship"]["streamer"] - if answer_decision.text.lower() == "yep, use old data": + values_keep = [] + for pattern in all_locales("sponsorship_restore", "keyboard"): + values_keep.append(pattern[0][0].lower()) + + values_new = [] + for pattern in all_locales("sponsorship_restore", "keyboard"): + values_new.append(pattern[1][0].lower()) + + if answer_decision.text.lower() in values_keep: await answer_decision.reply_text( - "Okay, reusing the old data.\n\nUntil when is your sub?\n\nEnter the date as DD.MM.YYYY", - reply_markup=ForceReply(placeholder="Expiry date as DD.MM.YYYY"), + locale("sponsor2", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale( + f"sponsor2", + "force_reply", + locale=msg.from_user, + ) + ) + ), ) while True: answer_date = await listen_message(app, msg.chat.id) @@ -102,17 +121,44 @@ async def cmd_sponsorship(app: Client, msg: Message): try: input_dt = datetime.strptime(answer_date.text, "%d.%m.%Y") + if datetime.now() >= input_dt: + await msg.reply_text( + locale("sponsor2_past", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale("sponsor2", "force_reply", locale=msg.from_user) + ) + ), + ) + continue break except ValueError: await answer_date.reply_text( - "Invalid date! Provide as DD.MM.YYYY", - reply_markup=ForceReply(placeholder="Expiry date as DD.MM.YYYY"), + locale(f"sponsor2_invalid", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale( + f"sponsor2", + "force_reply", + locale=msg.from_user, + ) + ) + ), ) continue + await answer_date.reply_text( + locale("sponsor3", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale( + f"sponsor3", + "force_reply", + locale=msg.from_user, + ) + ) + ), + ) while True: - await answer_date.reply_text( - "Alright. Now provide your proof **as a single screenshot**" - ) answer_proof = await listen_message(app, msg.chat.id) if is_none_or_cancel(answer_proof): @@ -120,15 +166,26 @@ async def cmd_sponsorship(app: Client, msg: Message): if answer_proof.photo is None: await answer_proof.reply_text( - "Please, provide proof **as a single screenshot**" + locale("sponsor3", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale( + f"sponsor3", + "force_reply", + locale=msg.from_user, + ) + ) + ), ) continue input_proof = answer_proof.photo.file_id break await msg.reply_text( - f'Almost done. Do you want to keep the label **{existent["sponsorship"]["label"]}** or you want to change it?', + locale("sponsor4_resubmit", "message", locale=msg.from_user).format( + existent["sponsorship"]["label"] + ), reply_markup=ReplyKeyboardMarkup( - [["Keep the old one"], ["Set a new one instead"]], + locale("sponsorship_restore_label", "keyboard", locale=msg.from_user), resize_keyboard=True, one_time_keyboard=True, ), @@ -144,19 +201,39 @@ async def cmd_sponsorship(app: Client, msg: Message): await answer_label_decision.reply_text( "Please, choose a valid option.", reply_markup=ReplyKeyboardMarkup( - [["Keep the old one"], ["Set a new one instead"]], + locale( + "sponsorship_restore_label", + "keyboard", + locale=msg.from_user, + ), resize_keyboard=True, one_time_keyboard=True, ), ) continue - if answer_label_decision.text.lower() == "keep the old one": + values_keep = [] + for pattern in all_locales("sponsorship_restore_label", "keyboard"): + values_keep.append(pattern[0][0].lower()) + + values_new = [] + for pattern in all_locales("sponsorship_restore_label", "keyboard"): + values_new.append(pattern[1][0].lower()) + + if answer_label_decision.text.lower() in values_keep: input_label = existent["sponsorship"]["label"] - elif answer_label_decision.text.lower() == "set a new one instead": + elif answer_label_decision.text.lower() in values_new: await answer_label_decision.reply_text( - "Okay. Please provide a new label up to 16 characters long", - reply_markup=ForceReply(placeholder="New label"), + locale("sponsor4", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale( + f"sponsor4", + "force_reply", + locale=msg.from_user, + ) + ) + ), ) while True: answer_label = await listen_message(app, msg.chat.id) @@ -166,27 +243,61 @@ async def cmd_sponsorship(app: Client, msg: Message): if answer_label.text is None: await answer_label.reply_text( - "Please provide valid label", - reply_markup=ForceReply(placeholder="New label"), + locale("label_too_long", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale( + f"sponsor4", + "force_reply", + locale=msg.from_user, + ) + ) + ), ) continue elif len(answer_label.text) > 16: await answer_label.reply_text( - "Please provide a label not longer than 16 characters long", - reply_markup=ForceReply(placeholder="New label"), + locale("label_too_long", "message", locale=msg.from_user), + reply_markup=ForceReply( + placeholder=str( + locale( + f"sponsor4", + "force_reply", + locale=msg.from_user, + ) + ) + ), ) continue input_label = answer_label.text break - await msg.reply_text( - f"So we did it for streamer **{input_streamer}**, til {input_dt.strftime('%d.%m.%Y')}, proofed by `{input_proof}` and labeled as **{input_label}**.", - reply_markup=ReplyKeyboardRemove(), + col_tmp.find_one_and_delete( + {"user": msg.from_user.id, "type": "sponsorship"} ) + + col_tmp.insert_one( + { + "user": msg.from_user.id, + "type": "sponsorship", + "complete": True, + "sent": False, + "state": "fill", + "stage": 4, + "sponsorship": { + "streamer": input_streamer, + "expires": input_dt, + "proof": input_proof, + "label": input_label, + }, + } + ) + + await confirm_yes(app, msg, kind="sponsorship") return - elif answer_decision.text.lower() == "nope, refill it once more": + elif answer_decision.text.lower() in values_new: await msg.reply_text( locale("sponsorship_apply", "message", locale=msg.from_user), reply_markup=InlineKeyboardMarkup( @@ -206,7 +317,8 @@ async def cmd_sponsorship(app: Client, msg: Message): return else: await answer_decision.reply_text( - "Invalid option!", reply_markup=ReplyKeyboardRemove() + locale("sponsor_resubmit_invalid_option", "message", locale=msg.from_user), + reply_markup=ReplyKeyboardRemove(), ) return # else: