Modularity overhaul
This commit is contained in:
98
modules/handlers/confirmation.py
Normal file
98
modules/handlers/confirmation.py
Normal file
@@ -0,0 +1,98 @@
|
||||
from os import sep
|
||||
from time import time
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from datetime import datetime
|
||||
from app import app
|
||||
from pyrogram import filters
|
||||
from pyrogram.types import ReplyKeyboardRemove, InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from modules.utils import configGet, configSet, jsonLoad, jsonSave, locale, logWrite
|
||||
from modules.handlers.welcome import welcome_pass
|
||||
|
||||
# Confirmation =================================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("confirm", "keyboard")[0][0])))
|
||||
async def confirm_yes(app, msg):
|
||||
|
||||
user_stage = configGet("stage", file=str(msg.from_user.id))
|
||||
|
||||
if user_stage == 10:
|
||||
|
||||
if not configGet("sent", file=str(msg.from_user.id)):
|
||||
|
||||
await msg.reply_text(locale("application_sent", "message"), reply_markup=ReplyKeyboardRemove())
|
||||
|
||||
applications = jsonLoad(f"{configGet('data', 'locations')}{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"{configGet('data', 'locations')}{sep}applications.json")
|
||||
|
||||
application_content = []
|
||||
i = 1
|
||||
|
||||
for question in configGet("application", file=str(msg.from_user.id)):
|
||||
if i == 2:
|
||||
age = relativedelta(datetime.now(), datetime.strptime(configGet('application', file=str(msg.from_user.id))['2'], '%d.%m.%Y'))
|
||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {configGet('application', file=str(msg.from_user.id))['2']} ({age.years} р.)")
|
||||
else:
|
||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {configGet('application', file=str(msg.from_user.id))[question]}")
|
||||
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
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(text=str(locale("sub_yes", "button")), callback_data=f"sub_yes_{msg.from_user.id}")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(text=str(locale("sub_no", "button")), callback_data=f"sub_no_{msg.from_user.id}")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(text=str(locale("sub_no_aggressive", "button")), callback_data=f"sub_no_aggresive_{msg.from_user.id}")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(text=str(locale("sub_no_russian", "button")), callback_data=f"sub_no_russian_{msg.from_user.id}")
|
||||
]
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
logWrite(f"User {msg.from_user.id} sent his application and it will now be reviewed")
|
||||
|
||||
configSet(["sent"], True, file=str(msg.from_user.id))
|
||||
configSet(["confirmed"], True, file=str(msg.from_user.id))
|
||||
|
||||
@app.on_message(~ filters.scheduled & filters.private & (filters.regex(locale("confirm", "keyboard")[1][0])))
|
||||
async def confirm_no(app, msg):
|
||||
|
||||
user_stage = configGet("stage", file=str(msg.from_user.id))
|
||||
|
||||
if user_stage == 10:
|
||||
jsonSave(jsonLoad(f"{configGet('data', 'locations')}{sep}user_default.json"), f"{configGet('data', 'locations')}{sep}users{sep}{msg.from_user.id}.json")
|
||||
configSet(["telegram_id"], str(msg.from_user.username), file=str(msg.from_user.id))
|
||||
configSet(["telegram_name"], f"{msg.from_user.first_name} {msg.from_user.last_name}", 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))
|
||||
await welcome_pass(app, msg, once_again=True)
|
||||
logWrite(f"User {msg.from_user.id} restarted the application due to typo in it")
|
||||
# ==============================================================================================================================
|
47
modules/handlers/contact.py
Normal file
47
modules/handlers/contact.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from os import sep, path
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from datetime import datetime
|
||||
from app import app, isAnAdmin
|
||||
from pyrogram import filters
|
||||
from modules.utils import configGet, jsonLoad, locale, logWrite
|
||||
|
||||
# Contact getting ==============================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.contact & filters.private)
|
||||
async def get_contact(app, msg):
|
||||
if (path.exists(f"{configGet('data', 'locations')}{sep}users{sep}{msg.from_user.id}.json") and jsonLoad(f"{configGet('data', 'locations')}{sep}users{sep}{msg.from_user.id}.json")["approved"]) or (await isAnAdmin(msg.from_user.id)):
|
||||
if msg.contact.user_id != None:
|
||||
try:
|
||||
user_data = jsonLoad(f"{configGet('data', 'locations')}{sep}users{sep}{msg.contact.user_id}.json")
|
||||
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")[str(msg.contact.user_id)]
|
||||
application_content = []
|
||||
i = 1
|
||||
for question in application["application"]:
|
||||
if i == 2:
|
||||
age = relativedelta(datetime.now(), datetime.strptime(application['application']['2'], '%d.%m.%Y'))
|
||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {application['application']['2']} ({age.years} р.)")
|
||||
else:
|
||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles')} {application['application'][question]}")
|
||||
i += 1
|
||||
if user_data["sent"]:
|
||||
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:
|
||||
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:
|
||||
application_status = locale("application_status_not_send", "message")
|
||||
logWrite(f"User {msg.from_user.id} requested application of {msg.contact.user_id}")
|
||||
await msg.reply_text(locale("contact", "message").format(str(msg.contact.user_id), "\n".join(application_content), application_status)) # type: ignore
|
||||
except FileNotFoundError:
|
||||
logWrite(f"User {msg.from_user.id} requested application of {msg.contact.user_id} but user does not exists")
|
||||
await msg.reply_text(locale("contact_invalid", "message"))
|
||||
else:
|
||||
logWrite(f"User {msg.from_user.id} requested application of someone but user is not telegram user")
|
||||
await msg.reply_text(locale("contact_not_member", "message"))
|
||||
# ==============================================================================================================================
|
81
modules/handlers/everything.py
Normal file
81
modules/handlers/everything.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from datetime import datetime
|
||||
from app import app
|
||||
import asyncio
|
||||
from pyrogram import filters
|
||||
from pyrogram.types import ForceReply
|
||||
from modules.utils import configGet, configSet, locale, logWrite
|
||||
|
||||
# Any other input ==============================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.private)
|
||||
async def any_stage(app, msg):
|
||||
|
||||
if msg.via_bot is None:
|
||||
|
||||
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")))) # type: ignore
|
||||
|
||||
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)) # type: ignore
|
||||
#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")
|
||||
# ==============================================================================================================================
|
33
modules/handlers/group_join.py
Normal file
33
modules/handlers/group_join.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from os import sep, path
|
||||
from app import app, isAnAdmin
|
||||
from pyrogram.types import ChatPermissions, InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from modules.utils import configGet, jsonLoad, locale
|
||||
|
||||
# Filter users on join =========================================================================================================
|
||||
@app.on_chat_member_updated(group=configGet("destination_group"))
|
||||
#@app.on_message(filters.new_chat_members, group=configGet("destination_group"))
|
||||
async def filter_join(app, member):
|
||||
if member.invite_link != None:
|
||||
if (path.exists(f"{configGet('data', 'locations')}{sep}users{sep}{member.from_user.id}.json") and jsonLoad(f"{configGet('data', 'locations')}{sep}users{sep}{member.from_user.id}.json")["approved"]) or (await isAnAdmin(member.from_user.id)):
|
||||
if configGet("link", file=str(member.from_user.id)) == member.invite_link.invite_link:
|
||||
return
|
||||
if await isAnAdmin(member.invite_link.creator.id):
|
||||
return
|
||||
await app.send_message(configGet("admin_group"), f"User **{member.from_user.first_name}** (`{member.from_user.id}`) joined the chat not with his personal link", reply_markup=InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(text=str(locale("sus_allow", "button")), callback_data=f"sus_allow_{member.from_user.id}")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(text=str(locale("sus_refuse", "button")), callback_data=f"sus_refuse_{member.from_user.id}")
|
||||
]
|
||||
]
|
||||
))
|
||||
await app.restrict_chat_member(member.chat.id, member.from_user.id, permissions=ChatPermissions(
|
||||
can_send_messages=False,
|
||||
can_send_media_messages=False,
|
||||
can_send_other_messages=False,
|
||||
can_send_polls=False
|
||||
)
|
||||
)
|
||||
# ==============================================================================================================================
|
29
modules/handlers/welcome.py
Normal file
29
modules/handlers/welcome.py
Normal file
@@ -0,0 +1,29 @@
|
||||
from app import app
|
||||
from pyrogram import filters
|
||||
from modules.utils import configGet, configSet, locale, logWrite
|
||||
|
||||
# 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) -> None:
|
||||
"""Set user's stage to 1 and start a fresh application
|
||||
|
||||
### Args:
|
||||
* app (app): Pyrogram Client to use
|
||||
* msg (Message): Message with .from_user.id attribute equal to the end-user ID whose application will be started
|
||||
* once_again (bool, optional): Set to False if it's the first time as user applies. Defaults to True.
|
||||
"""
|
||||
|
||||
if not once_again:
|
||||
await msg.reply_text(locale("privacy_notice", "message"))
|
||||
|
||||
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
|
||||
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])))
|
||||
async def welcome_reject(app, msg):
|
||||
|
||||
logWrite(f"User {msg.from_user.id} refused to start the application")
|
||||
await msg.reply_text(locale("goodbye", "message"), reply_markup=ReplyKeyboardMarkup(locale("return", "keyboard"), resize_keyboard=True)) # type: ignore
|
||||
# ==============================================================================================================================
|
Reference in New Issue
Block a user