from datetime import datetime from os import sep from app import app, isAnAdmin import asyncio from pyrogram import filters from pyrogram.types import ForceReply, ReplyKeyboardMarkup, Message from modules.utils import configGet, configSet, jsonLoad, jsonSave, locale, logWrite, should_quote from modules.database import col_messages async def message_involved(msg: Message) -> bool: message = col_messages.find_one({"destination.id": msg.reply_to_message.id, "destination.chat": msg.reply_to_message.chat.id}) if message is not None: return True return False async def message_context(msg: Message) -> tuple: message = col_messages.find_one({"destination.id": msg.reply_to_message.id, "destination.chat": msg.reply_to_message.chat.id}) if message is not None: return message["origin"]["chat"], message["origin"]["id"] return 0, 0 # Any other input ============================================================================================================== @app.on_message(~ filters.scheduled & filters.private) async def any_stage(app, msg): if msg.via_bot is None: if (msg.reply_to_message != None) and (await message_involved(msg)): context = await message_context(msg) if msg.chat.id == configGet("admin_group") or await isAnAdmin(msg.from_user.id): new_message = await (await app.get_messages(context[0], context[1])).reply_text(msg.text+locale("message_reply_notice", "message"), quote=True) else: new_message = await (await app.get_messages(context[0], context[1])).reply_text(locale("message_from", "message").format(msg.from_user.first_name, msg.from_user.id)+msg.text+locale("message_reply_notice", "message"), quote=True) await msg.reply_text(locale("message_sent", "message"), quote=should_quote(msg)) col_messages.insert_one({"origin": {"chat": msg.chat.id, "id": msg.id}, "destination": {"chat": new_message.chat.id, "id": new_message.id}}) return user_stage = configGet("stage", file=str(msg.from_user.id)) if user_stage == 1: await msg.reply_text(locale(f"question{user_stage+1}", "message"), reply_markup=ForceReply(placeholder=str(locale(f"question{user_stage+1}", "force_reply")))) logWrite(f"User {msg.from_user.id} completed stage {user_stage} of application") configSet(["application", str(user_stage)], str(msg.text), file=str(msg.from_user.id)) configSet(["stage"], user_stage+1, file=str(msg.from_user.id)) elif user_stage == 2: try: configSet(["application", str(user_stage)], str(msg.text), file=str(msg.from_user.id)) input_dt = datetime.strptime(msg.text, "%d.%m.%Y") if datetime.now() <= input_dt: logWrite(f"User {msg.from_user.id} failed stage {user_stage} due to joking") await msg.reply_text(locale("question2_joke", "message"), reply_markup=ForceReply(placeholder=str(locale("question2", "force_reply")))) elif ((datetime.now() - input_dt).days) < ((datetime.now() - datetime.now().replace(year=datetime.now().year - configGet("age_allowed"))).days): logWrite(f"User {msg.from_user.id} failed stage {user_stage} due to being underage") await msg.reply_text(locale("question2_underage", "message").format(str(configGet("age_allowed"))), reply_markup=ForceReply(placeholder=str(locale("question2", "force_reply")))) else: logWrite(f"User {msg.from_user.id} completed stage {user_stage} of application") await msg.reply_text(locale(f"question{user_stage+1}", "message"), reply_markup=ForceReply(placeholder=str(locale(f"question{user_stage+1}", "force_reply")))) configSet(["stage"], user_stage+1, file=str(msg.from_user.id)) except ValueError: logWrite(f"User {msg.from_user.id} failed stage {user_stage} due to sending invalid date format") await msg.reply_text(locale(f"question2_invalid", "message"), reply_markup=ForceReply(placeholder=str(locale(f"question{user_stage}", "force_reply")))) else: if user_stage <= 9: logWrite(f"User {msg.from_user.id} completed stage {user_stage} of application") await msg.reply_text(locale(f"question{user_stage+1}", "message"), reply_markup=ForceReply(placeholder=str(locale(f"question{user_stage+1}", "force_reply")))) configSet(["application", str(user_stage)], str(msg.text), file=str(msg.from_user.id)) configSet(["stage"], user_stage+1, file=str(msg.from_user.id)) else: if not configGet("sent", file=str(msg.from_user.id)): if not configGet("confirmed", file=str(msg.from_user.id)): configSet(["application", str(user_stage)], str(msg.text), file=str(msg.from_user.id)) application_content = [] i = 1 for question in configGet("application", file=str(msg.from_user.id)): application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {configGet('application', file=str(msg.from_user.id))[question]}") i += 1 await msg.reply_text(locale("confirm", "message").format("\n".join(application_content)), reply_markup=ReplyKeyboardMarkup(locale("confirm", "keyboard"), resize_keyboard=True)) #configSet("sent", True, file=str(msg.from_user.id)) #configSet("application_date", int(time()), file=str(msg.from_user.id)) else: if not configGet("approved", file=str(msg.from_user.id)) and not configGet("refused", file=str(msg.from_user.id)): await msg.reply_text(locale("already_sent", "message")) else: if not configGet("approved", file=str(msg.from_user.id)) and not configGet("refused", file=str(msg.from_user.id)): await msg.reply_text(locale("already_sent", "message")) @app.on_message(~ filters.scheduled & filters.group) async def message_in_group(app, msg): if (msg.chat is not None) and (msg.via_bot is not None): if (msg.via_bot.id == configGet("bot_id")) and (msg.chat.id == configGet("destination_group")): if configGet("remove_application_time") > 0: logWrite(f"User {msg.from_user.id} requested application in destination group, removing in {configGet('remove_application_time')} minutes") await asyncio.sleep(configGet("remove_application_time")*60) await msg.delete() logWrite(f"Removed application requested by {msg.from_user.id} in destination group") # ==============================================================================================================================