Reapply is now possible

This commit is contained in:
Profitroll 2022-10-25 13:36:16 +02:00
parent 7abdf369fd
commit 2f24739cbb
5 changed files with 129 additions and 31 deletions

View File

@ -66,5 +66,5 @@ After all of that you're good to go! Happy using :)
* [ ] Get application by id and user_id * [ ] Get application by id and user_id
* [x] Age as a DD.MM.YYYY * [x] Age as a DD.MM.YYYY
* [ ] Notify about upcoming birthdays * [ ] Notify about upcoming birthdays
* [ ] Change the application data * [x] Change the application data
* [x] Check if user is already in group * [x] Check if user is already in group

View File

@ -19,7 +19,7 @@
"locale": "locale" "locale": "locale"
}, },
"commands": { "commands": {
"start": "Start using the bot" "reapply": "Fill the application again"
}, },
"commands_admin": { "commands_admin": {
"reboot": "Restart the bot", "reboot": "Restart the bot",

View File

@ -1,5 +1,6 @@
{ {
"stage": 0, "stage": 0,
"reapply": false,
"link": null, "link": null,
"sent": false, "sent": false,
"confirmed": false, "confirmed": false,

View File

@ -27,17 +27,16 @@
"confirm": "Супер, дякуємо!\n\nБудь ласка, перевір правильність даних:\n{0}\n\nВсе правильно?", "confirm": "Супер, дякуємо!\n\nБудь ласка, перевір правильність даних:\n{0}\n\nВсе правильно?",
"application_sent": "Дякуємо! Ми надіслали твою анкетку на перевірку. Ти отримаєш повідомлення як тільки її перевірять та приймуть рішення. До тих пір від тебе більше нічого не потребується. Гарного дня! :)", "application_sent": "Дякуємо! Ми надіслали твою анкетку на перевірку. Ти отримаєш повідомлення як тільки її перевірять та приймуть рішення. До тих пір від тебе більше нічого не потребується. Гарного дня! :)",
"application_got": "Отримано анкету від `{0}`\n\nІм'я тг: `{1}`, `{2}`\nUserID: `{3}`\n\n**Дані анкети:**\n{4}", "application_got": "Отримано анкету від `{0}`\n\nІм'я тг: `{1}`, `{2}`\nUserID: `{3}`\n\n**Дані анкети:**\n{4}",
"reapply_got": "Отримано змінити анкети від `{0}`\n\nІм'я тг: `{1}`, `{2}`\nUserID: `{3}`\n\n**Дані анкети:**\n{4}",
"shutdown": "Вимкнення бота з підом `{0}`", "shutdown": "Вимкнення бота з підом `{0}`",
"startup": "Запуск бота з підом `{0}`", "startup": "Запуск бота з підом `{0}`",
"startup_downtime": "Запуск бота з підом `{0}` (лежав {1})", "startup_downtime": "Запуск бота з підом `{0}` (лежав {1})",
"sub_yes": "✅ Подання схвалено та прийнято",
"sub_no": "❌ Подання розглянуто та відхилено",
"approved": "Вітаємо! Твою анкету переглянули та підтвердили твоє право на вступ. Скористайся кнопкою під повідомленням щоб вступити до нашої лампової спільноти!", "approved": "Вітаємо! Твою анкету переглянули та підтвердили твоє право на вступ. Скористайся кнопкою під повідомленням щоб вступити до нашої лампової спільноти!",
"approved_joined": "Вітаємо! Твою анкету переглянули та підтвердили її правильність. Дякуємо за витрачений на заповнення час та гарного дня!", "approved_joined": "Вітаємо! Твою анкету переглянули та підтвердили її правильність. Дякуємо за витрачений на заповнення час та гарного дня!",
"refused": "Ой лишенько! Твою анкету переглянули, однак не підтвердили право на вступ до спільноти. Better luck next time!", "refused": "Ой лишенько! Твою анкету переглянули, однак не підтвердили право на вступ до спільноти. Better luck next time!",
"refused_russian": "русский военньій корабль, иди нахуй!", "refused_russian": "русский военньій корабль, иди нахуй!",
"approved_by": "✅ **Анкету схвалено**\nАдмін **{0}** переглянув та схвалив анкету `{1}`, дозволивши вступ до спільноти.", "approved_by": "✅ **Анкету схвалено**\nАдмін **{0}** переглянув та схвалив анкету `{1}`.",
"refused_by": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`, заборонивши вступ до спільноти.", "refused_by": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`.",
"refused_by_agr": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`, заборонивши вступ до спільноти.\nПричина: агресивна/токсична анкета.", "refused_by_agr": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`, заборонивши вступ до спільноти.\nПричина: агресивна/токсична анкета.",
"refused_by_rus": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`, заборонивши вступ до спільноти.\nПричина: русня.", "refused_by_rus": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`, заборонивши вступ до спільноти.\nПричина: русня.",
"contact": "Анкета `{0}`\n\n**Дані анкети:**\n{1}\n\n{2}", "contact": "Анкета `{0}`\n\n**Дані анкети:**\n{1}\n\n{2}",
@ -51,6 +50,8 @@
"sus_joined": "Користувач **{0}** (`{1}`) зайшов до групи не за своїм персональним запрошенням.", "sus_joined": "Користувач **{0}** (`{1}`) зайшов до групи не за своїм персональним запрошенням.",
"sus_allowed_by": "✅ **Доступ дозволено**\nАдмін **{0}** дозволив `{1}` вступити до спільноти не за персональним посиланням.", "sus_allowed_by": "✅ **Доступ дозволено**\nАдмін **{0}** дозволив `{1}` вступити до спільноти не за персональним посиланням.",
"sus_refused_by": "❌ **Доступ заборонено**\nАдмін **{0}** заборонив `{1}` доступ до спільноти не за персональним посиланням.", "sus_refused_by": "❌ **Доступ заборонено**\nАдмін **{0}** заборонив `{1}` доступ до спільноти не за персональним посиланням.",
"reapply_forbidden": "❌ **Дія неможлива**\nТвоя минула анкета ще не була схвалена або відхилена.",
"reapply_in_progress": "❌ **Дія неможлива**\nТи прямо зараз вже заповнюєш анкету. Якщо в ній є помилка - після заповнення просто натисни **{0}** та почни знову.",
"question_titles": { "question_titles": {
"question1": "Ім'я/звертання:", "question1": "Ім'я/звертання:",
"question2": "День народження:", "question2": "День народження:",
@ -110,7 +111,9 @@
"sus_allow": "✅ Підтвердити дозвіл", "sus_allow": "✅ Підтвердити дозвіл",
"sus_refuse": "❌ Перманентно заблокувати", "sus_refuse": "❌ Перманентно заблокувати",
"sus_allowed": "✅ Дозвіл надано", "sus_allowed": "✅ Дозвіл надано",
"sus_refused": "❌ Користувача заблоковано" "sus_refused": "❌ Користувача заблоковано",
"reapply_yes": "✅ Прийняти",
"reapply_no": "❌ Відхилити"
}, },
"callback": { "callback": {
"sub_accepted": "✅ Анкету {0} схвалено", "sub_accepted": "✅ Анкету {0} схвалено",

110
main.py
View File

@ -68,6 +68,25 @@ async def cmd_applications(app, msg):
# ============================================================================================================================== # ==============================================================================================================================
# Reapply command ==============================================================================================================
@app.on_message(~ filters.scheduled & filters.private & filters.command(["reapply"], prefixes=["", "/"]))
async def cmd_reapply(app, msg):
if configGet("approved", file=str(msg.from_user.id)) or configGet("refused", file=str(msg.from_user.id)):
if (configGet("stage", file=str(msg.from_user.id)) == 10) and not (configGet("sent", file=str(msg.from_user.id))):
configSet("reapply", True, file=str(msg.from_user.id))
configSet("confirmed", False, file=str(msg.from_user.id))
await welcome_pass(app, msg, once_again=True)
else:
await msg.reply_text(locale("reapply_in_progress", "message").format(locale("confirm", "keyboard")[1][0]))
else:
if configGet("sent", file=str(msg.from_user.id)):
await msg.reply_text(locale("reapply_forbidden", "message"))
else:
await msg.reply_text(locale("reapply_in_progress", "message").format(locale("confirm", "keyboard")[1][0]))
# ==============================================================================================================================
# Welcome check ================================================================================================================ # Welcome check ================================================================================================================
@app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("welcome", "keyboard")[0][0]) | filters.regex(locale("return", "keyboard")[0][0]))) @app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("welcome", "keyboard")[0][0]) | filters.regex(locale("return", "keyboard")[0][0])))
async def welcome_pass(app, msg, once_again: bool = True): async def welcome_pass(app, msg, once_again: bool = True):
@ -78,6 +97,7 @@ async def welcome_pass(app, msg, once_again: bool = True):
logWrite(f"User {msg.from_user.id} confirmed starting the application") logWrite(f"User {msg.from_user.id} confirmed starting the application")
await msg.reply_text(locale("question1", "message"), reply_markup=ForceReply(placeholder=locale("question1", "force_reply"))) # type: ignore await msg.reply_text(locale("question1", "message"), reply_markup=ForceReply(placeholder=locale("question1", "force_reply"))) # type: ignore
configSet("stage", 1, file=str(msg.from_user.id)) configSet("stage", 1, file=str(msg.from_user.id))
configSet("sent", False, file=str(msg.from_user.id))
@app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("welcome", "keyboard")[1][0]))) @app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("welcome", "keyboard")[1][0])))
async def welcome_reject(app, msg): async def welcome_reject(app, msg):
@ -125,6 +145,19 @@ async def confirm_yes(app, msg):
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {configGet('application', file=str(msg.from_user.id))[question]}") application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {configGet('application', file=str(msg.from_user.id))[question]}")
i += 1 i += 1
if configGet("reapply", file=str(msg.from_user.id)):
await app.send_message(chat_id=configGet("admin_group"), text=(locale("reapply_got", "message")).format(str(msg.from_user.id), msg.from_user.first_name, msg.from_user.last_name, msg.from_user.username, "\n".join(application_content)), parse_mode=ParseMode.MARKDOWN, reply_markup=InlineKeyboardMarkup( # type: ignore
[
[
InlineKeyboardButton(text=str(locale("reapply_yes", "button")), callback_data=f"reapply_yes_{msg.from_user.id}")
],
[
InlineKeyboardButton(text=str(locale("reapply_no", "button")), callback_data=f"reapply_no_{msg.from_user.id}")
]
]
)
)
else:
await app.send_message(chat_id=configGet("admin_group"), text=(locale("application_got", "message")).format(str(msg.from_user.id), msg.from_user.first_name, msg.from_user.last_name, msg.from_user.username, "\n".join(application_content)), parse_mode=ParseMode.MARKDOWN, reply_markup=InlineKeyboardMarkup( # type: ignore await app.send_message(chat_id=configGet("admin_group"), text=(locale("application_got", "message")).format(str(msg.from_user.id), msg.from_user.first_name, msg.from_user.last_name, msg.from_user.username, "\n".join(application_content)), parse_mode=ParseMode.MARKDOWN, reply_markup=InlineKeyboardMarkup( # type: ignore
[ [
[ [
@ -194,6 +227,7 @@ async def callback_query_accept(app, clb):
await app.send_message(int(fullclb[2]), locale("approved_joined", "message")) await app.send_message(int(fullclb[2]), locale("approved_joined", "message"))
configSet("approved", True, file=fullclb[2]) configSet("approved", True, file=fullclb[2])
configSet("sent", False, file=fullclb[2])
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json") application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")
application[fullclb[2]]["approved"] = True application[fullclb[2]]["approved"] = True
@ -216,6 +250,7 @@ async def callback_query_refuse_aggressive(app, clb):
logWrite(f"User {fullclb[3]} got refused by {clb.from_user.id} due to being aggressive") logWrite(f"User {fullclb[3]} got refused by {clb.from_user.id} due to being aggressive")
configSet("refused", True, file=fullclb[3]) configSet("refused", True, file=fullclb[3])
configSet("sent", False, file=fullclb[3])
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json") application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")
application[fullclb[3]]["refused"] = True application[fullclb[3]]["refused"] = True
@ -239,6 +274,7 @@ async def callback_query_refuse_russian(app, clb):
logWrite(f"User {fullclb[3]} got refused by {clb.from_user.id} due to being russian") logWrite(f"User {fullclb[3]} got refused by {clb.from_user.id} due to being russian")
configSet("refused", True, file=fullclb[3]) configSet("refused", True, file=fullclb[3])
configSet("sent", False, file=fullclb[3])
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json") application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")
application[fullclb[3]]["refused"] = True application[fullclb[3]]["refused"] = True
@ -261,6 +297,58 @@ async def callback_query_refuse(app, clb):
logWrite(f"User {fullclb[2]} got refused by {clb.from_user.id}") logWrite(f"User {fullclb[2]} got refused by {clb.from_user.id}")
configSet("refused", True, file=fullclb[2]) configSet("refused", True, file=fullclb[2])
configSet("sent", False, file=fullclb[2])
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")
application[fullclb[2]]["refused"] = True
application[fullclb[2]]["refused_by"] = clb.from_user.id
application[fullclb[2]]["refusal_date"] = int(time())
jsonSave(application, f"{configGet('data', 'locations')}{sep}applications.json")
edited_markup = [[InlineKeyboardButton(text=str(locale("declined", "button")), callback_data="nothing")]]
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
await clb.answer(text=locale("sub_refused", "callback").format(fullclb[2]), show_alert=True) # type: ignore
# ==============================================================================================================================
# Callbacks application ========================================================================================================
@app.on_callback_query(filters.regex("reapply_yes_[\s\S]*")) # type: ignore
async def callback_query_accept(app, clb):
fullclb = clb.data.split("_")
await app.send_message(configGet("admin_group"), locale("approved_by", "message").format(clb.from_user.first_name, fullclb[2]), disable_notification=True) # type: ignore
logWrite(f"User {fullclb[2]} got their reapplication approved by {clb.from_user.id}")
await app.send_message(int(fullclb[2]), locale("approved_joined", "message"))
configSet("approved", True, file=fullclb[2])
configSet("sent", False, file=fullclb[2])
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")
application[fullclb[2]]["approved"] = True
application[fullclb[2]]["approved_by"] = clb.from_user.id
application[fullclb[2]]["approval_date"] = int(time())
jsonSave(application, f"{configGet('data', 'locations')}{sep}applications.json")
edited_markup = [[InlineKeyboardButton(text=str(locale("accepted", "button")), callback_data="nothing")]]
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
await clb.answer(text=locale("sub_accepted", "callback").format(fullclb[2]), show_alert=True) # type: ignore
@app.on_callback_query(filters.regex("reapply_no_[\s\S]*")) # type: ignore
async def callback_query_refuse(app, clb):
fullclb = clb.data.split("_")
await app.send_message(configGet("admin_group"), locale("refused_by", "message").format(clb.from_user.first_name, fullclb[2]), disable_notification=True) # type: ignore
await app.send_message(int(fullclb[2]), locale("refused", "message"))
logWrite(f"User {fullclb[2]} got their reapplication refused by {clb.from_user.id}")
configSet("refused", True, file=fullclb[2])
configSet("sent", False, file=fullclb[2])
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json") application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")
application[fullclb[2]]["refused"] = True application[fullclb[2]]["refused"] = True
@ -342,14 +430,19 @@ async def get_contact(app, msg):
else: else:
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {configGet('application', file=str(msg.contact.user_id))[question]}") application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {configGet('application', file=str(msg.contact.user_id))[question]}")
i += 1 i += 1
if user_data["sent"]:
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")[str(msg.contact.user_id)] application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")[str(msg.contact.user_id)]
if user_data["sent"]:
if user_data["approved"]: if user_data["approved"]:
application_status = locale("application_status_accepted", "message").format((await app.get_users(application["approved_by"])).first_name, datetime.fromtimestamp(application["approval_date"]).strftime("%d.%m.%Y, %H:%M")) # type: ignore application_status = locale("application_status_accepted", "message").format((await app.get_users(application["approved_by"])).first_name, datetime.fromtimestamp(application["approval_date"]).strftime("%d.%m.%Y, %H:%M")) # type: ignore
elif application["refused"]: elif application["refused"]:
application_status = locale("application_status_refused", "message").format((await app.get_users(application["refused_by"])).first_name, datetime.fromtimestamp(application["refusal_date"]).strftime("%d.%m.%Y, %H:%M")) # type: ignore application_status = locale("application_status_refused", "message").format((await app.get_users(application["refused_by"])).first_name, datetime.fromtimestamp(application["refusal_date"]).strftime("%d.%m.%Y, %H:%M")) # type: ignore
else: else:
application_status = locale("application_status_on_hold", "message") application_status = locale("application_status_on_hold", "message")
else:
if user_data["approved"]:
application_status = locale("application_status_accepted", "message").format((await app.get_users(application["approved_by"])).first_name, datetime.fromtimestamp(application["approval_date"]).strftime("%d.%m.%Y, %H:%M")) # type: ignore
elif application["refused"]:
application_status = locale("application_status_refused", "message").format((await app.get_users(application["refused_by"])).first_name, datetime.fromtimestamp(application["refusal_date"]).strftime("%d.%m.%Y, %H:%M")) # type: ignore
else: else:
application_status = locale("application_status_not_send", "message") application_status = locale("application_status_not_send", "message")
logWrite(f"User {msg.from_user.id} requested application of {msg.contact.user_id}") logWrite(f"User {msg.from_user.id} requested application of {msg.contact.user_id}")
@ -419,6 +512,7 @@ async def any_stage(app, msg):
#configSet("sent", True, file=str(msg.from_user.id)) #configSet("sent", True, file=str(msg.from_user.id))
#configSet("application_date", int(time()), file=str(msg.from_user.id)) #configSet("application_date", int(time()), file=str(msg.from_user.id))
else: 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")) await msg.reply_text(locale("already_sent", "message"))
else: else:
if not configGet("approved", file=str(msg.from_user.id)) and not configGet("refused", file=str(msg.from_user.id)): if not configGet("approved", file=str(msg.from_user.id)) and not configGet("refused", file=str(msg.from_user.id)):
@ -466,16 +560,16 @@ if __name__ == "__main__":
app.send_message(configGet("owner"), f"Starting up with pid `{pid}`") # type: ignore app.send_message(configGet("owner"), f"Starting up with pid `{pid}`") # type: ignore
# # Registering user commands # Registering user commands
# commands_list = [] commands_list = []
# for command in configGet("commands"): for command in configGet("commands"):
# commands_list.append(BotCommand(command, configGet("commands")[command])) commands_list.append(BotCommand(command, configGet("commands")[command]))
# app.set_bot_commands(commands_list) # type: ignore app.set_bot_commands(commands_list) # type: ignore
# Registering admin commands # Registering admin commands
commands_admin_list = [] commands_admin_list = []
# for command in configGet("commands"): for command in configGet("commands"):
# commands_admin_list.append(BotCommand(command, configGet("commands")[command])) commands_admin_list.append(BotCommand(command, configGet("commands")[command]))
for command in configGet("commands_admin"): for command in configGet("commands_admin"):
commands_admin_list.append(BotCommand(command, configGet("commands_admin")[command])) commands_admin_list.append(BotCommand(command, configGet("commands_admin")[command]))