Modularity overhaul
This commit is contained in:
56
modules/commands/application.py
Normal file
56
modules/commands/application.py
Normal file
@@ -0,0 +1,56 @@
|
||||
from os import sep, path
|
||||
from datetime import datetime
|
||||
from app import app, isAnAdmin
|
||||
from pyrogram import filters
|
||||
from pyrogram.enums.chat_members_filter import ChatMembersFilter
|
||||
from modules.utils import configGet, jsonLoad, logWrite, locale, should_quote
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
# Applications command =========================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.command(["application"], prefixes=["/"]))
|
||||
async def cmd_application(app, msg):
|
||||
|
||||
if (await isAnAdmin(msg.from_user.id)) or (msg.chat.id == configGet("admin_group")):
|
||||
try:
|
||||
if (path.exists(f"{configGet('data', 'locations')}{sep}users{sep}{msg.command[1]}.json") and jsonLoad(f"{configGet('data', 'locations')}{sep}users{sep}{msg.command[1]}.json")["approved"]):
|
||||
user_id = int(msg.command[1])
|
||||
else:
|
||||
list_of_users = []
|
||||
async for m in app.get_chat_members(configGet("destination_group"), filter=ChatMembersFilter.SEARCH, query=msg.command[1]):
|
||||
list_of_users.append(m)
|
||||
user_id = list_of_users[0].user.id
|
||||
try:
|
||||
user_data = jsonLoad(f"{configGet('data', 'locations')}{sep}users{sep}{user_id}.json")
|
||||
application = jsonLoad(f"{configGet('data', 'locations')}{sep}applications.json")[str(user_id)]
|
||||
application_content = []
|
||||
i = 1
|
||||
for question in configGet("application", file=str(msg.from_user.id)):
|
||||
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 {user_id}")
|
||||
await msg.reply_text(locale("contact", "message").format(str(user_id), "\n".join(application_content), application_status), quote=should_quote(msg)) # type: ignore
|
||||
except FileNotFoundError:
|
||||
logWrite(f"User {msg.from_user.id} requested application of {user_id} but user does not exists")
|
||||
await msg.reply_text(locale("contact_invalid", "message"), quote=should_quote(msg))
|
||||
|
||||
except IndexError:
|
||||
await msg.reply_text(locale("application_invalid_syntax", "message"), quote=should_quote(msg))
|
||||
# ==============================================================================================================================
|
14
modules/commands/applications.py
Normal file
14
modules/commands/applications.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from os import sep
|
||||
from app import app, isAnAdmin
|
||||
from pyrogram import filters
|
||||
from pyrogram.enums.chat_action import ChatAction
|
||||
from modules.utils import configGet, should_quote
|
||||
|
||||
# Applications command =========================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.command(["applications"], prefixes=["/"]))
|
||||
async def cmd_applications(app, msg):
|
||||
|
||||
if (await isAnAdmin(msg.from_user.id)) or (msg.chat.id == configGet("admin_group")):
|
||||
await app.send_chat_action(msg.chat.id, ChatAction.UPLOAD_DOCUMENT)
|
||||
await msg.reply_document(document=f"{configGet('data', 'locations')}{sep}applications.json", quote=should_quote(msg))
|
||||
# ==============================================================================================================================
|
29
modules/commands/message.py
Normal file
29
modules/commands/message.py
Normal file
@@ -0,0 +1,29 @@
|
||||
from app import app, isAnAdmin
|
||||
from pyrogram import filters
|
||||
from pyrogram.errors import bad_request_400
|
||||
from modules.utils import logWrite, locale, configGet, should_quote
|
||||
|
||||
# Message command ==============================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.command(["message"], prefixes=["/"]))
|
||||
async def cmd_message(app, msg):
|
||||
|
||||
if msg.chat.id == configGet("admin_group") or await isAnAdmin(msg.from_user.id):
|
||||
|
||||
try:
|
||||
destination = int(msg.command[1])
|
||||
void = msg.command[2]
|
||||
message = " ".join(msg.command[2:])
|
||||
try:
|
||||
await app.send_message(destination, message)
|
||||
await msg.reply_text(locale("message_sent", "message"), quote=should_quote(msg))
|
||||
logWrite(f"Admin {msg.from_user.id} sent message '{' '.join(msg.command[2:])}' to {destination}")
|
||||
except bad_request_400.PeerIdInvalid:
|
||||
await msg.reply_text(locale("message_no_user", "message"), quote=should_quote(msg))
|
||||
logWrite(f"Admin {msg.from_user.id} tried to send message '{' '.join(msg.command[2:])}' to {destination} but 'PeerIdInvalid'")
|
||||
except IndexError:
|
||||
await msg.reply_text(locale("message_invalid_syntax", "message"), quote=should_quote(msg))
|
||||
logWrite(f"Admin {msg.from_user.id} tried to send message but 'IndexError'")
|
||||
except ValueError:
|
||||
await msg.reply_text(locale("message_invalid_syntax", "message"), quote=should_quote(msg))
|
||||
logWrite(f"Admin {msg.from_user.id} tried to send message but 'ValueError'")
|
||||
# ==============================================================================================================================
|
45
modules/commands/reapply.py
Normal file
45
modules/commands/reapply.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from app import app
|
||||
from pyrogram import filters
|
||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from modules.utils import configGet, configSet, locale
|
||||
from modules.handlers.welcome import welcome_pass
|
||||
|
||||
# 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))):
|
||||
left_chat = True
|
||||
async for member in app.get_chat_members(configGet("destination_group")):
|
||||
if member.user.id == msg.from_user.id:
|
||||
left_chat = False
|
||||
if not left_chat:
|
||||
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_left_chat", "message"), reply_markup=InlineKeyboardMarkup([
|
||||
[
|
||||
InlineKeyboardButton(locale("reapply_old_one", "button"), f"reapply_old_{msg.id}")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton(locale("reapply_new_one", "button"), f"reapply_new_{msg.id}")
|
||||
]
|
||||
]))
|
||||
else:
|
||||
await msg.reply_text(locale("reapply_in_progress", "message").format(locale("confirm", "keyboard")[1][0]), reply_markup=InlineKeyboardMarkup([
|
||||
[
|
||||
InlineKeyboardButton(locale("applying_stop", "button"), f"reapply_stop_{msg.id}")
|
||||
]
|
||||
])) # type: ignore
|
||||
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]), reply_markup=InlineKeyboardMarkup([
|
||||
[
|
||||
InlineKeyboardButton(locale("applying_stop", "button"), f"reapply_stop_{msg.id}")
|
||||
]
|
||||
])) # type: ignore
|
||||
# ==============================================================================================================================
|
16
modules/commands/reboot.py
Normal file
16
modules/commands/reboot.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from app import app, isAnAdmin
|
||||
from os import getpid
|
||||
from pyrogram import filters
|
||||
from modules.utils import configGet, logWrite, killProc, should_quote
|
||||
|
||||
pid = getpid()
|
||||
|
||||
# Shutdown command =============================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.private & filters.command(["kill", "die", "reboot"], prefixes=["/"]))
|
||||
async def cmd_kill(app, msg):
|
||||
|
||||
if msg.chat.id == configGet("admin_group") or await isAnAdmin(msg.from_user.id):
|
||||
logWrite(f"Shutting down bot with pid {pid}")
|
||||
await msg.reply_text(f"Вимкнення бота з підом `{pid}`", quote=should_quote(msg))
|
||||
killProc(pid)
|
||||
# ==============================================================================================================================
|
34
modules/commands/rules.py
Normal file
34
modules/commands/rules.py
Normal file
@@ -0,0 +1,34 @@
|
||||
from app import app
|
||||
from pyrogram import filters
|
||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from modules.utils import locale
|
||||
|
||||
# Rules command =============================================================================================================
|
||||
default_rules_markup = InlineKeyboardMarkup(
|
||||
[
|
||||
[
|
||||
InlineKeyboardButton(locale("rules_home", "button"), callback_data="rules_home"),
|
||||
InlineKeyboardButton(locale("rules_additional", "button"), callback_data="rules_additional")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton("1", callback_data="rule_1"),
|
||||
InlineKeyboardButton("2", callback_data="rule_2"),
|
||||
InlineKeyboardButton("3", callback_data="rule_3")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton("4", callback_data="rule_4"),
|
||||
InlineKeyboardButton("5", callback_data="rule_5"),
|
||||
InlineKeyboardButton("6", callback_data="rule_6")
|
||||
],
|
||||
[
|
||||
InlineKeyboardButton("7", callback_data="rule_7"),
|
||||
InlineKeyboardButton("8", callback_data="rule_8"),
|
||||
InlineKeyboardButton("9", callback_data="rule_9")
|
||||
]
|
||||
]
|
||||
)
|
||||
|
||||
@app.on_message(~ filters.scheduled & filters.private & filters.command(["rules"], prefixes=["/"]))
|
||||
async def cmd_rules(app, msg):
|
||||
await msg.reply_text(locale("rules_msg"), disable_web_page_preview=True, reply_markup=default_rules_markup)
|
||||
# ==============================================================================================================================
|
24
modules/commands/start.py
Normal file
24
modules/commands/start.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from app import app
|
||||
from os import sep
|
||||
from pyrogram import filters
|
||||
from modules.utils import jsonLoad, jsonSave, configGet, configSet, logWrite
|
||||
|
||||
# Start command ================================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.private & filters.command(["start"], prefixes=["/"]))
|
||||
async def cmd_start(app, msg):
|
||||
|
||||
try:
|
||||
user_stage = configGet("stage", file=str(msg.from_user.id))
|
||||
if user_stage != 0:
|
||||
return
|
||||
except FileNotFoundError:
|
||||
jsonSave(jsonLoad(f"{configGet('data', 'locations')}{sep}user_default.json"), f"{configGet('data', 'locations')}{sep}users{sep}{msg.from_user.id}.json")
|
||||
user_stage = configGet("stage", file=str(msg.from_user.id))
|
||||
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))
|
||||
|
||||
logWrite(f"User {msg.from_user.id} started bot interaction")
|
||||
await msg.reply_text(locale("start", "message"), reply_markup=ReplyKeyboardMarkup(locale("welcome", "keyboard"), resize_keyboard=True)) # type: ignore
|
||||
# ==============================================================================================================================
|
20
modules/commands/warn.py
Normal file
20
modules/commands/warn.py
Normal file
@@ -0,0 +1,20 @@
|
||||
from os import sep
|
||||
from app import app, isAnAdmin
|
||||
from pyrogram import filters
|
||||
from modules.utils import jsonLoad, jsonSave, configGet
|
||||
|
||||
# Warn command =================================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.command(["warn"], prefixes=["/"]))
|
||||
async def cmd_warn(app, msg):
|
||||
|
||||
if msg.chat.id == configGet("destination_group"):
|
||||
if msg.reply_to_message_id != None:
|
||||
if isAnAdmin(msg.from_user.id):
|
||||
warnings = jsonLoad(f"{configGet('data', 'locations')}{sep}warnings.json")
|
||||
if str(msg.reply_to_message.from_user.id) not in warnings:
|
||||
warnings[str(msg.reply_to_message.from_user.id)] = 1
|
||||
else:
|
||||
warnings[str(msg.reply_to_message.from_user.id)] += 1
|
||||
jsonSave(warnings, f"{configGet('data', 'locations')}{sep}warnings.json")
|
||||
await msg.reply_text(locale("warned", "message").format(msg.reply_to_message.from_user.first_name, msg.reply_to_message.from_user.id)) # type: ignore
|
||||
# ==============================================================================================================================
|
41
modules/commands/warnings.py
Normal file
41
modules/commands/warnings.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from os import path, sep
|
||||
from app import app, isAnAdmin
|
||||
from pyrogram import filters
|
||||
from pyrogram.enums.chat_members_filter import ChatMembersFilter
|
||||
from modules.utils import configGet, jsonLoad, locale, should_quote
|
||||
|
||||
# Warnings command =============================================================================================================
|
||||
@app.on_message(~ filters.scheduled & filters.command(["warnings"], prefixes=["/"]))
|
||||
async def cmd_warnings(app, msg):
|
||||
|
||||
if msg.chat.id == configGet("admin_group") or await isAnAdmin(msg.from_user.id):
|
||||
|
||||
warnings = jsonLoad(f"{configGet('data', 'locations')}{sep}warnings.json")
|
||||
|
||||
if len(msg.command) <= 1:
|
||||
await msg.reply_text(locale("syntax_warnings", "message"), quote=should_quote(msg))
|
||||
|
||||
if path.exists(f"{configGet('data', 'locations')}{sep}users{sep}{msg.command[1]}.json"):
|
||||
target_id = str(int(msg.command[1]))
|
||||
target_name = "N/A"
|
||||
else:
|
||||
list_of_users = []
|
||||
async for m in app.get_chat_members(configGet("destination_group"), filter=ChatMembersFilter.SEARCH, query=msg.command[1]):
|
||||
list_of_users.append(m)
|
||||
|
||||
if len(list_of_users) != 0:
|
||||
target = list_of_users[0].user
|
||||
target_name = target.first_name
|
||||
target_id = str(target.id)
|
||||
else:
|
||||
await msg.reply_text(locale("no_user_warnings", "message").format(msg.command[1])) # type: ignore
|
||||
return
|
||||
|
||||
if target_id not in warnings:
|
||||
await msg.reply_text(locale("no_warnings", "message").format(target_name, target_id), quote=should_quote(msg)) # type: ignore
|
||||
else:
|
||||
if warnings[target_id] <= 5:
|
||||
await msg.reply_text(locale("warnings_1", "message").format(target_name, target_id, warnings[target_id]), quote=should_quote(msg)) # type: ignore
|
||||
else:
|
||||
await msg.reply_text(locale("warnings_2", "message").format(target_name, target_id, warnings[target_id]), quote=should_quote(msg)) # type: ignore
|
||||
# ==============================================================================================================================
|
Reference in New Issue
Block a user