Improved everything

This commit is contained in:
Profitroll 2022-10-21 14:00:03 +02:00
parent bb6b0b056c
commit 506c7c06c9
4 changed files with 168 additions and 26 deletions

View File

@ -1,6 +1,8 @@
{ {
"locale": "uk", "locale": "uk",
"owner": 0, "owner": 0,
"age_allowed": 0,
"admin_group": 0,
"admins": [], "admins": [],
"bot": { "bot": {
"api_id": 0, "api_id": 0,

1
data/applications.json Normal file
View File

@ -0,0 +1 @@
{}

View File

@ -23,15 +23,29 @@
"question10": "Ну і нарешті, розкажи трохи про себе. Про хобі, чим тобі подобається займатись. Одним повідомленням, будь ласка.", "question10": "Ну і нарешті, розкажи трохи про себе. Про хобі, чим тобі подобається займатись. Одним повідомленням, будь ласка.",
"question2_underage": "Вибач, але треба досягти віку {0} років, щоб приєднатись до нас. Такі обмеження існують для того, щоб всім у спільноті було цікаво одне з одним.", "question2_underage": "Вибач, але треба досягти віку {0} років, щоб приєднатись до нас. Такі обмеження існують для того, щоб всім у спільноті було цікаво одне з одним.",
"question2_invalid": "Будь ласка, введи ціле число.", "question2_invalid": "Будь ласка, введи ціле число.",
"question2_joke": "Тижпрограміст, ми так і поняли. Але будь ласка, введи реальне значення.", "question2_joke": "Шутнік, ми так і поняли. Але будь ласка, введи реальне значення.",
"confirm": "Супер, дякуємо!\n\nБудь ласка, перевір правильність даних:\n{0}\n\nВсе правильно?", "confirm": "Супер, дякуємо!\n\nБудь ласка, перевір правильність даних:\n{0}\n\nВсе правильно?",
"application_sent": "Дякуємо! Ми надіслали твою анкетку на перевірку. Ти отримаєш повідомлення як тільки її перевірять та приймуть рішення. До тих пір від тебе більше нічого не потребується. Гарного дня! :)",
"application_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_yes": "✅ Подання схвалено та прийнято",
"sub_no": "❌ Подання розглянуто та відхилено" "sub_no": "❌ Подання розглянуто та відхилено",
"question_titles": {
"question1": "Ім'я/звертання:",
"question2": "Вік:",
"question3": "Проживаня:",
"question4": "Дізнався(лась) про холо:",
"question5": "Хололайв зацікавив:",
"question6": "Подобається контент:",
"question7": "Японські холодівчата:",
"question8": "Дивлюсь стріми:",
"question9": "Подобаються пісні:",
"question10": "Про себе:"
}
}, },
"keyboards": { "keyboard": {
"welcome": [ "welcome": [
[ [
"Так, звісно" "Так, звісно"
@ -69,6 +83,8 @@
"button": { "button": {
"sub_yes": "✅ Прийняти", "sub_yes": "✅ Прийняти",
"sub_no": "❌ Відхилити", "sub_no": "❌ Відхилити",
"sub_no_aggresive": "🤡 Відхилити (Токс)",
"sub_no_russian": "🇷🇺 Відхилити (Русак)",
"accepted": "✅ Прийнято", "accepted": "✅ Прийнято",
"declined": "❌ Відхилено" "declined": "❌ Відхилено"
}, },

169
main.py
View File

@ -1,4 +1,3 @@
import asyncio
from time import time from time import time
from os import getpid, listdir, remove from os import getpid, listdir, remove
from modules.utils import * from modules.utils import *
@ -9,11 +8,13 @@ from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, BotComman
from pyrogram import idle # type: ignore from pyrogram import idle # type: ignore
from pyrogram.errors.exceptions import bad_request_400 from pyrogram.errors.exceptions import bad_request_400
pid = getpid()
pid = getpid()
app = Client("holochecker", bot_token=configGet("bot_token", "bot"), api_id=configGet("api_id", "bot"), api_hash=configGet("api_hash", "bot")) app = Client("holochecker", bot_token=configGet("bot_token", "bot"), api_id=configGet("api_id", "bot"), api_hash=configGet("api_hash", "bot"))
@app.on_message(~ filters.scheduled & filters.command(["start"], prefixes=["/"]))
# Start command ================================================================================================================
@app.on_message(~ filters.scheduled & filters.private & filters.command(["start"], prefixes=["/"]))
async def cmd_start(app, msg): async def cmd_start(app, msg):
try: try:
@ -28,17 +29,23 @@ async def cmd_start(app, msg):
configSet("telegram_phone", str(msg.from_user.phone_number), file=str(msg.from_user.id)) configSet("telegram_phone", str(msg.from_user.phone_number), file=str(msg.from_user.id))
configSet("telegram_locale", str(msg.from_user.language_code), file=str(msg.from_user.id)) configSet("telegram_locale", str(msg.from_user.language_code), file=str(msg.from_user.id))
await msg.reply_text(locale("start", "message"), reply_markup=ReplyKeyboardMarkup(locale("welcome", "keyboards"), resize_keyboard=True)) await msg.reply_text(locale("start", "message"), reply_markup=ReplyKeyboardMarkup(locale("welcome", "keyboard"), resize_keyboard=True))
# ==============================================================================================================================
@app.on_message(~ filters.scheduled & filters.command(["kill", "die", "reboot"], prefixes=["", "/"]))
# Shutdown command =============================================================================================================
@app.on_message(~ filters.scheduled & filters.private & filters.command(["kill", "die", "reboot"], prefixes=["", "/"]))
async def cmd_kill(app, msg): async def cmd_kill(app, msg):
if (msg.from_user.id == configGet("owner")) or (msg.from_user.id in configGet("admins")): if (msg.from_user.id == configGet("owner")) or (msg.from_user.id in configGet("admins")):
logWrite(f"Shutting down bot with pid {pid}") logWrite(f"Shutting down bot with pid {pid}")
await msg.reply_text(f"Вимкнення бота з підом `{pid}`") await msg.reply_text(f"Вимкнення бота з підом `{pid}`")
killProc(pid) killProc(pid)
# ==============================================================================================================================
@app.on_message(~ filters.scheduled & (filters.regex(locale("welcome", "keyboards")[0][0]) | filters.regex(locale("return", "keyboards")[0][0])))
# Welcome check ================================================================================================================
@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):
if not once_again: if not once_again:
@ -47,23 +54,67 @@ async def welcome_pass(app, msg, once_again: bool = True):
await msg.reply_text(locale("question1", "message"), reply_markup=ForceReply(placeholder=locale("question1", "force_reply"))) await msg.reply_text(locale("question1", "message"), reply_markup=ForceReply(placeholder=locale("question1", "force_reply")))
configSet("stage", 1, file=str(msg.from_user.id)) configSet("stage", 1, file=str(msg.from_user.id))
@app.on_message(~ filters.scheduled & (filters.regex(locale("welcome", "keyboards")[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):
await msg.reply_text(locale("goodbye", "message"), reply_markup=ReplyKeyboardMarkup(locale("return", "keyboards"), resize_keyboard=True)) await msg.reply_text(locale("goodbye", "message"), reply_markup=ReplyKeyboardMarkup(locale("return", "keyboard"), resize_keyboard=True))
# ==============================================================================================================================
@app.on_message(~ filters.scheduled & (filters.regex(locale("confirm", "keyboards")[0][0])))
# Confirmation =================================================================================================================
@app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("confirm", "keyboard")[0][0])))
async def confirm_yes(app, msg): async def confirm_yes(app, msg):
user_stage = configGet("stage", file=str(msg.from_user.id)) user_stage = configGet("stage", file=str(msg.from_user.id))
if user_stage == 10: if user_stage == 10:
await msg.reply_text("Alright! You did it!", reply_markup=ReplyKeyboardRemove())
# send to admins await msg.reply_text(locale("application_sent", "message"), reply_markup=ReplyKeyboardRemove())
applications = jsonLoad(f"data{sep}applications.json")
applications[str(msg.from_user.id)] = {
"approved": False,
"approved_by": None,
"approval_date": None,
"refused": False,
"refused_by": False,
"refusal_date": False,
"application_date": int(time()),
"application": configGet("application", file=str(msg.from_user.id))
}
jsonSave(applications, f"data{sep}applications.json")
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 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)), reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton(text=locale("sub_yes", "button"), callback_data=f"sub_yes_{msg.from_user.id}")
],
[
InlineKeyboardButton(text=locale("sub_no", "button"), callback_data=f"sub_no_{msg.from_user.id}")
],
[
InlineKeyboardButton(text=locale("sub_no_aggresive", "button"), callback_data=f"sub_no_aggresive_{msg.from_user.id}")
],
[
InlineKeyboardButton(text=locale("sub_no_russian", "button"), callback_data=f"sub_no_russian_{msg.from_user.id}")
]
]
)
)
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))
@app.on_message(~ filters.scheduled & (filters.regex(locale("confirm", "keyboards")[1][0]))) @app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("confirm", "keyboard")[1][0])))
async def confirm_no(app, msg): async def confirm_no(app, msg):
user_stage = configGet("stage", file=str(msg.from_user.id)) user_stage = configGet("stage", file=str(msg.from_user.id))
@ -75,8 +126,69 @@ async def confirm_no(app, msg):
configSet("telegram_phone", str(msg.from_user.phone_number), file=str(msg.from_user.id)) configSet("telegram_phone", str(msg.from_user.phone_number), file=str(msg.from_user.id))
configSet("telegram_locale", str(msg.from_user.language_code), file=str(msg.from_user.id)) configSet("telegram_locale", str(msg.from_user.language_code), file=str(msg.from_user.id))
await welcome_pass(app, msg, once_again=True) await welcome_pass(app, msg, once_again=True)
# ==============================================================================================================================
@app.on_message(~ filters.scheduled)
# Callbacks ====================================================================================================================
@app.on_callback_query(filters.regex("sub_yes_[\s\S]*"))
async def callback_query_accept(app, clb):
fullclb = clb.data.split("_")
user_locale = clb.from_user.language_code
await app.send_message(configGet("admin_group"), f"Approved by {clb.from_user.id}")
await app.send_message(int(fullclb[2]), "You got approved")
edited_markup = [[InlineKeyboardButton(text=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_block", "callback", locale=user_locale).format(fullclb[2]), show_alert=True)
@app.on_callback_query(filters.regex("sub_no_[\s\S]*"))
async def callback_query_refuse(app, clb):
fullclb = clb.data.split("_")
user_locale = clb.from_user.language_code
await app.send_message(configGet("admin_group"), f"Refused by {clb.from_user.id}")
await app.send_message(int(fullclb[2]), "You got refused")
edited_markup = [[InlineKeyboardButton(text=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_block", "callback", locale=user_locale).format(fullclb[2]), show_alert=True)
@app.on_callback_query(filters.regex("sub_no_aggresive_[\s\S]*"))
async def callback_query_refuse(app, clb):
fullclb = clb.data.split("_")
user_locale = clb.from_user.language_code
await app.send_message(configGet("admin_group"), f"Refused by {clb.from_user.id}")
await app.send_message(int(fullclb[2]), "You got refused")
edited_markup = [[InlineKeyboardButton(text=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_block", "callback", locale=user_locale).format(fullclb[2]), show_alert=True)
@app.on_callback_query(filters.regex("sub_no_russian_[\s\S]*"))
async def callback_query_refuse(app, clb):
fullclb = clb.data.split("_")
user_locale = clb.from_user.language_code
await app.send_message(configGet("admin_group"), f"Refused by {clb.from_user.id}")
await app.send_message(int(fullclb[2]), "You got refused")
edited_markup = [[InlineKeyboardButton(text=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_block", "callback", locale=user_locale).format(fullclb[2]), show_alert=True)
# ==============================================================================================================================
# Any other input ==============================================================================================================
@app.on_message(~ filters.scheduled & filters.private)
async def any_stage(app, msg): async def any_stage(app, msg):
user_stage = configGet("stage", file=str(msg.from_user.id)) user_stage = configGet("stage", file=str(msg.from_user.id))
@ -88,8 +200,13 @@ async def any_stage(app, msg):
elif user_stage == 2: elif user_stage == 2:
try: try:
configSet(str(user_stage), int(msg.text), "application", file=str(msg.from_user.id)) configSet(str(user_stage), int(msg.text), "application", file=str(msg.from_user.id))
await msg.reply_text(locale(f"question{user_stage+1}", "message"), reply_markup=ForceReply(placeholder=locale(f"question{user_stage+1}", "force_reply"))) if (int(msg.text) in [-1, 0, 128, 256, 512, 1024, 2048]) or (int(msg.text) >= 100):
configSet("stage", user_stage+1, file=str(msg.from_user.id)) await msg.reply_text(locale("question2_joke", "message"), reply_markup=ForceReply(placeholder=locale("question2", "force_reply")))
elif int(msg.text) < configGet("age_allowed"):
await msg.reply_text(locale("question2_underage", "message"), reply_markup=ForceReply(placeholder=locale("question2", "force_reply")))
else:
await msg.reply_text(locale(f"question{user_stage+1}", "message"), reply_markup=ForceReply(placeholder=locale(f"question{user_stage+1}", "force_reply")))
configSet("stage", user_stage+1, file=str(msg.from_user.id))
except ValueError: except ValueError:
await msg.reply_text(locale(f"question2_invalid", "message"), reply_markup=ForceReply(placeholder=locale(f"question{user_stage}", "force_reply"))) await msg.reply_text(locale(f"question2_invalid", "message"), reply_markup=ForceReply(placeholder=locale(f"question{user_stage}", "force_reply")))
else: else:
@ -100,7 +217,12 @@ async def any_stage(app, msg):
else: else:
if not configGet("sent", file=str(msg.from_user.id)): if not configGet("sent", file=str(msg.from_user.id)):
if not configGet("confirmed", file=str(msg.from_user.id)): if not configGet("confirmed", file=str(msg.from_user.id)):
await msg.reply_text(locale("confirm", "message"), reply_markup=ReplyKeyboardMarkup(locale("confirm", "keyboards"), resize_keyboard=True)) 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(str(user_stage), str(msg.text), "application", file=str(msg.from_user.id)) configSet(str(user_stage), str(msg.text), "application", file=str(msg.from_user.id))
#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))
@ -108,6 +230,7 @@ async def any_stage(app, msg):
await msg.reply_text("You are already done, wait!") await msg.reply_text("You are already done, wait!")
else: else:
await msg.reply_text("You are already done, wait!") await msg.reply_text("You are already done, wait!")
# ==============================================================================================================================
if __name__ == "__main__": if __name__ == "__main__":
@ -120,16 +243,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 for fallback locale # # 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]))