Data export, warnings' improvements, bug fixes #35
@ -8,21 +8,33 @@ makedirs(f'{configGet("cache", "locations")}{sep}avatars', exist_ok=True)
|
|||||||
|
|
||||||
app = FastAPI(title="HoloUA Avatars API", docs_url=None, redoc_url=None, version="1.0")
|
app = FastAPI(title="HoloUA Avatars API", docs_url=None, redoc_url=None, version="1.0")
|
||||||
|
|
||||||
|
|
||||||
@app.get("/check", response_class=JSONResponse, include_in_schema=False)
|
@app.get("/check", response_class=JSONResponse, include_in_schema=False)
|
||||||
@app.head("/check", response_class=JSONResponse, include_in_schema=False)
|
@app.head("/check", response_class=JSONResponse, include_in_schema=False)
|
||||||
async def check():
|
async def check():
|
||||||
return JSONResponse({"detail": "I'm alright, thank you"})
|
return JSONResponse({"detail": "I'm alright, thank you"})
|
||||||
|
|
||||||
|
|
||||||
@app.get("/", response_class=FileResponse, include_in_schema=False)
|
@app.get("/", response_class=FileResponse, include_in_schema=False)
|
||||||
async def avatar_get(avatar_id: str):
|
async def avatar_get(avatar_id: str):
|
||||||
if path.exists(f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}'):
|
if path.exists(f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}'):
|
||||||
return FileResponse(f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}', media_type="image/jpg")
|
return FileResponse(
|
||||||
|
f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}',
|
||||||
|
media_type="image/jpg",
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="File not found")
|
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="File not found")
|
||||||
|
|
||||||
|
|
||||||
@app.head("/", response_class=Response, include_in_schema=False)
|
@app.head("/", response_class=Response, include_in_schema=False)
|
||||||
async def avatar_head(avatar_id: str):
|
async def avatar_head(avatar_id: str):
|
||||||
if path.exists(f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}'):
|
if path.exists(f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}'):
|
||||||
return Response(headers={"Content-Length": path.getsize(f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}')})
|
return Response(
|
||||||
|
headers={
|
||||||
|
"Content-Length": path.getsize(
|
||||||
|
f'{configGet("cache", "locations")}{sep}avatars{sep}{avatar_id}'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="File not found")
|
raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail="File not found")
|
13
app.py
13
app.py
@ -5,10 +5,15 @@ from modules.utils import configGet, jsonLoad
|
|||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from pyrogram.errors import bad_request_400
|
from pyrogram.errors import bad_request_400
|
||||||
|
|
||||||
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"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def isAnAdmin(admin_id):
|
async def isAnAdmin(admin_id):
|
||||||
|
|
||||||
# Check if user is mentioned in config
|
# Check if user is mentioned in config
|
||||||
if (admin_id == configGet("owner")) or (admin_id in configGet("admins")):
|
if (admin_id == configGet("owner")) or (admin_id in configGet("admins")):
|
||||||
return True
|
return True
|
||||||
@ -26,7 +31,9 @@ async def isAnAdmin(admin_id):
|
|||||||
if member.user.id == admin_id:
|
if member.user.id == admin_id:
|
||||||
return True
|
return True
|
||||||
except bad_request_400.ChannelInvalid:
|
except bad_request_400.ChannelInvalid:
|
||||||
logWrite(f"Could not get users in admin group to answer isAnAdmin(). Bot is likely not in the group.")
|
logWrite(
|
||||||
|
f"Could not get users in admin group to answer isAnAdmin(). Bot is likely not in the group."
|
||||||
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return False
|
return False
|
@ -1,5 +1,8 @@
|
|||||||
class PlaceNotFoundError(Exception):
|
class PlaceNotFoundError(Exception):
|
||||||
"""Query provided did not lead to any city or populated area"""
|
"""Query provided did not lead to any city or populated area"""
|
||||||
|
|
||||||
def __init__(self, query):
|
def __init__(self, query):
|
||||||
self.query = query
|
self.query = query
|
||||||
super().__init__(f"Could not find any place on geonames.org of feature classes A and P by query '{self.query}'")
|
super().__init__(
|
||||||
|
f"Could not find any place on geonames.org of feature classes A and P by query '{self.query}'"
|
||||||
|
)
|
||||||
|
@ -1,24 +1,38 @@
|
|||||||
"""Exceptions that are meant to be used by HoloUser class
|
"""Exceptions that are meant to be used by HoloUser class
|
||||||
and other modules that handle those exceptions"""
|
and other modules that handle those exceptions"""
|
||||||
|
|
||||||
|
|
||||||
class UserNotFoundError(Exception):
|
class UserNotFoundError(Exception):
|
||||||
"""HoloUser could not find user with such an ID in database"""
|
"""HoloUser could not find user with such an ID in database"""
|
||||||
|
|
||||||
def __init__(self, user, user_id):
|
def __init__(self, user, user_id):
|
||||||
self.user = user
|
self.user = user
|
||||||
self.user_id = user_id
|
self.user_id = user_id
|
||||||
super().__init__(f"User of type {type(self.user)} with id {self.user_id} was not found")
|
super().__init__(
|
||||||
|
f"User of type {type(self.user)} with id {self.user_id} was not found"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class UserInvalidError(Exception):
|
class UserInvalidError(Exception):
|
||||||
"""Provided to HoloUser object is not supported"""
|
"""Provided to HoloUser object is not supported"""
|
||||||
|
|
||||||
def __init__(self, user):
|
def __init__(self, user):
|
||||||
self.user = user
|
self.user = user
|
||||||
super().__init__(f"Could not find HoloUser by using {type(self.user)} as an input type")
|
super().__init__(
|
||||||
|
f"Could not find HoloUser by using {type(self.user)} as an input type"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class LabelTooLongError(Exception):
|
class LabelTooLongError(Exception):
|
||||||
def __init__(self, label: str) -> None:
|
def __init__(self, label: str) -> None:
|
||||||
self.label = label
|
self.label = label
|
||||||
super().__init__(f"Could not set label to '{label}' because it is {len(label)} characters long (16 is maximum)")
|
super().__init__(
|
||||||
|
f"Could not set label to '{label}' because it is {len(label)} characters long (16 is maximum)"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class LabelSettingError(Exception):
|
class LabelSettingError(Exception):
|
||||||
def __init__(self, exp: Exception, trace: str) -> None:
|
def __init__(self, exp: Exception, trace: str) -> None:
|
||||||
super().__init__(f"❌ **Could not set label**\n\nException: `{exp}`\n\n**Traceback:**\n```\n{trace}\n```")
|
super().__init__(
|
||||||
|
f"❌ **Could not set label**\n\nException: `{exp}`\n\n**Traceback:**\n```\n{trace}\n```"
|
||||||
|
)
|
||||||
|
@ -4,17 +4,43 @@ from ftfy import fix_text
|
|||||||
from traceback import format_exc
|
from traceback import format_exc
|
||||||
from app import app, isAnAdmin
|
from app import app, isAnAdmin
|
||||||
from typing import Any, List, Literal, Union
|
from typing import Any, List, Literal, Union
|
||||||
from pyrogram.types import User, ChatMember, ChatPrivileges, Chat, Message, Photo, Video, Document, Animation, Voice, ForceReply, ReplyKeyboardMarkup
|
from pyrogram.types import (
|
||||||
|
User,
|
||||||
|
ChatMember,
|
||||||
|
ChatPrivileges,
|
||||||
|
Chat,
|
||||||
|
Message,
|
||||||
|
Photo,
|
||||||
|
Video,
|
||||||
|
Document,
|
||||||
|
Animation,
|
||||||
|
Voice,
|
||||||
|
ForceReply,
|
||||||
|
ReplyKeyboardMarkup,
|
||||||
|
)
|
||||||
from pyrogram.errors import bad_request_400
|
from pyrogram.errors import bad_request_400
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
from classes.errors.geo import PlaceNotFoundError
|
from classes.errors.geo import PlaceNotFoundError
|
||||||
from classes.errors.holo_user import UserInvalidError, UserNotFoundError, LabelTooLongError, LabelSettingError
|
from classes.errors.holo_user import (
|
||||||
|
UserInvalidError,
|
||||||
|
UserNotFoundError,
|
||||||
|
LabelTooLongError,
|
||||||
|
LabelSettingError,
|
||||||
|
)
|
||||||
from classes.templates import DefaultApplicationTemp, DefaultSponsorshipTemp
|
from classes.templates import DefaultApplicationTemp, DefaultSponsorshipTemp
|
||||||
from modules.database import col_tmp, col_users, col_applications, col_sponsorships, col_messages, col_spoilers
|
from modules.database import (
|
||||||
|
col_tmp,
|
||||||
|
col_users,
|
||||||
|
col_applications,
|
||||||
|
col_sponsorships,
|
||||||
|
col_messages,
|
||||||
|
col_spoilers,
|
||||||
|
)
|
||||||
from modules.logging import logWrite
|
from modules.logging import logWrite
|
||||||
from modules.utils import configGet, find_location, locale, should_quote
|
from modules.utils import configGet, find_location, locale, should_quote
|
||||||
|
|
||||||
class HoloUser():
|
|
||||||
|
class HoloUser:
|
||||||
"""This object represents a user of HoloChecker bot.
|
"""This object represents a user of HoloChecker bot.
|
||||||
It is primarily used to interact with a database in a more python-friendly way,
|
It is primarily used to interact with a database in a more python-friendly way,
|
||||||
as well as provide better programming experience in case of adding new features, etc.
|
as well as provide better programming experience in case of adding new features, etc.
|
||||||
@ -67,17 +93,32 @@ class HoloUser():
|
|||||||
self.username = holo_user["tg_username"]
|
self.username = holo_user["tg_username"]
|
||||||
|
|
||||||
if isinstance(user, User):
|
if isinstance(user, User):
|
||||||
|
if (
|
||||||
if (self.name != user.first_name) and hasattr(user, "first_name") and (user.first_name is not None):
|
(self.name != user.first_name)
|
||||||
|
and hasattr(user, "first_name")
|
||||||
|
and (user.first_name is not None)
|
||||||
|
):
|
||||||
self.set("name", user.first_name, db_key="tg_name")
|
self.set("name", user.first_name, db_key="tg_name")
|
||||||
|
|
||||||
if (self.phone != user.phone_number) and hasattr(user, "phone") and (user.phone_number is not None):
|
if (
|
||||||
|
(self.phone != user.phone_number)
|
||||||
|
and hasattr(user, "phone")
|
||||||
|
and (user.phone_number is not None)
|
||||||
|
):
|
||||||
self.set("phone", user.phone_number, db_key="tg_phone")
|
self.set("phone", user.phone_number, db_key="tg_phone")
|
||||||
|
|
||||||
if (self.locale != user.language_code) and hasattr(user, "locale") and (user.language_code is not None):
|
if (
|
||||||
|
(self.locale != user.language_code)
|
||||||
|
and hasattr(user, "locale")
|
||||||
|
and (user.language_code is not None)
|
||||||
|
):
|
||||||
self.set("locale", user.language_code, db_key="tg_locale")
|
self.set("locale", user.language_code, db_key="tg_locale")
|
||||||
|
|
||||||
if (self.username != user.username) and hasattr(user, "username") and (user.username is not None):
|
if (
|
||||||
|
(self.username != user.username)
|
||||||
|
and hasattr(user, "username")
|
||||||
|
and (user.username is not None)
|
||||||
|
):
|
||||||
self.set("username", user.username, db_key="tg_username")
|
self.set("username", user.username, db_key="tg_username")
|
||||||
|
|
||||||
def set(self, key: str, value: Any, db_key: Union[str, None] = None) -> None:
|
def set(self, key: str, value: Any, db_key: Union[str, None] = None) -> None:
|
||||||
@ -91,10 +132,13 @@ class HoloUser():
|
|||||||
raise AttributeError()
|
raise AttributeError()
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
db_key = key if db_key is None else db_key
|
db_key = key if db_key is None else db_key
|
||||||
col_users.update_one(filter={"_id": self.db_id}, update={ "$set": { db_key: value } }, upsert=True)
|
col_users.update_one(
|
||||||
|
filter={"_id": self.db_id}, update={"$set": {db_key: value}}, upsert=True
|
||||||
|
)
|
||||||
logWrite(f"Set attribute {key} of user {self.id} to {value}")
|
logWrite(f"Set attribute {key} of user {self.id} to {value}")
|
||||||
|
|
||||||
async def message(self,
|
async def message(
|
||||||
|
self,
|
||||||
context: Message,
|
context: Message,
|
||||||
origin: Union[Message, None] = None,
|
origin: Union[Message, None] = None,
|
||||||
text: Union[str, None] = None,
|
text: Union[str, None] = None,
|
||||||
@ -105,7 +149,7 @@ class HoloUser():
|
|||||||
animation: Union[str, Animation, None] = None,
|
animation: Union[str, Animation, None] = None,
|
||||||
voice: Union[str, Voice, None] = None,
|
voice: Union[str, Voice, None] = None,
|
||||||
adm_origin: bool = False,
|
adm_origin: bool = False,
|
||||||
adm_context: bool = False
|
adm_context: bool = False,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Send a message to user
|
"""Send a message to user
|
||||||
|
|
||||||
@ -130,18 +174,30 @@ class HoloUser():
|
|||||||
|
|
||||||
# Check if any text available and log message sending
|
# Check if any text available and log message sending
|
||||||
if text is not None:
|
if text is not None:
|
||||||
logWrite(f"{context.from_user.id} sent message '{text}' to {self.id} (source message: {context.id})")
|
logWrite(
|
||||||
|
f"{context.from_user.id} sent message '{text}' to {self.id} (source message: {context.id})"
|
||||||
|
)
|
||||||
elif caption is not None:
|
elif caption is not None:
|
||||||
logWrite(f"{context.from_user.id} sent message '{caption}' to {self.id} (source message: {context.id})")
|
logWrite(
|
||||||
|
f"{context.from_user.id} sent message '{caption}' to {self.id} (source message: {context.id})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
logWrite(f"{context.from_user.id} sent message to {self.id} (source message: {context.id})")
|
logWrite(
|
||||||
|
f"{context.from_user.id} sent message to {self.id} (source message: {context.id})"
|
||||||
|
)
|
||||||
|
|
||||||
# Add notices for admin or user
|
# Add notices for admin or user
|
||||||
if text is not None:
|
if text is not None:
|
||||||
if adm_context:
|
if adm_context:
|
||||||
text += locale("message_reply_notice", "message")
|
text += locale("message_reply_notice", "message")
|
||||||
elif adm_origin:
|
elif adm_origin:
|
||||||
text = locale("message_from", "message").format(context.from_user.first_name, context.from_user.id) + text + locale("message_reply_notice", "message")
|
text = (
|
||||||
|
locale("message_from", "message").format(
|
||||||
|
context.from_user.first_name, context.from_user.id
|
||||||
|
)
|
||||||
|
+ text
|
||||||
|
+ locale("message_reply_notice", "message")
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
text = locale("message_reply_notice", "message")
|
text = locale("message_reply_notice", "message")
|
||||||
|
|
||||||
@ -149,77 +205,118 @@ class HoloUser():
|
|||||||
if adm_context:
|
if adm_context:
|
||||||
caption += locale("message_reply_notice", "message")
|
caption += locale("message_reply_notice", "message")
|
||||||
elif adm_origin:
|
elif adm_origin:
|
||||||
caption = locale("message_from", "message").format(context.from_user.first_name, context.from_user.id) + caption + locale("message_reply_notice", "message")
|
caption = (
|
||||||
|
locale("message_from", "message").format(
|
||||||
|
context.from_user.first_name, context.from_user.id
|
||||||
|
)
|
||||||
|
+ caption
|
||||||
|
+ locale("message_reply_notice", "message")
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
caption = locale("message_reply_notice", "message")
|
caption = locale("message_reply_notice", "message")
|
||||||
|
|
||||||
# Try sending the message
|
# Try sending the message
|
||||||
try:
|
try:
|
||||||
|
|
||||||
# Check if origin message exists
|
# Check if origin message exists
|
||||||
# This check decides whether we send_ a message or reply_ to one
|
# This check decides whether we send_ a message or reply_ to one
|
||||||
if origin is not None:
|
if origin is not None:
|
||||||
|
|
||||||
if photo is not None:
|
if photo is not None:
|
||||||
if isinstance(photo, Photo):
|
if isinstance(photo, Photo):
|
||||||
photo = photo.file_id
|
photo = photo.file_id
|
||||||
new_message = await origin.reply_cached_media(photo, caption=caption, quote=True)
|
new_message = await origin.reply_cached_media(
|
||||||
|
photo, caption=caption, quote=True
|
||||||
|
)
|
||||||
elif video is not None:
|
elif video is not None:
|
||||||
if isinstance(video, Video):
|
if isinstance(video, Video):
|
||||||
video = video.file_id
|
video = video.file_id
|
||||||
new_message = await origin.reply_cached_media(video, caption=caption, quote=True)
|
new_message = await origin.reply_cached_media(
|
||||||
|
video, caption=caption, quote=True
|
||||||
|
)
|
||||||
elif file is not None:
|
elif file is not None:
|
||||||
if isinstance(file, Document):
|
if isinstance(file, Document):
|
||||||
file = file.file_id
|
file = file.file_id
|
||||||
new_message = await origin.reply_cached_media(file, caption=caption, quote=True)
|
new_message = await origin.reply_cached_media(
|
||||||
|
file, caption=caption, quote=True
|
||||||
|
)
|
||||||
elif animation is not None:
|
elif animation is not None:
|
||||||
if isinstance(animation, Animation):
|
if isinstance(animation, Animation):
|
||||||
animation = animation.file_id
|
animation = animation.file_id
|
||||||
new_message = await origin.reply_cached_media(animation, caption=caption, quote=True)
|
new_message = await origin.reply_cached_media(
|
||||||
|
animation, caption=caption, quote=True
|
||||||
|
)
|
||||||
elif voice is not None:
|
elif voice is not None:
|
||||||
if isinstance(voice, Voice):
|
if isinstance(voice, Voice):
|
||||||
voice = voice.file_id
|
voice = voice.file_id
|
||||||
new_message = await origin.reply_voice(voice, caption=caption, quote=True)
|
new_message = await origin.reply_voice(
|
||||||
|
voice, caption=caption, quote=True
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
new_message = await origin.reply_text(text, quote=True)
|
new_message = await origin.reply_text(text, quote=True)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
if photo is not None:
|
if photo is not None:
|
||||||
if isinstance(photo, Photo):
|
if isinstance(photo, Photo):
|
||||||
photo = photo.file_id
|
photo = photo.file_id
|
||||||
new_message = await app.send_cached_media(self.id, photo, caption=caption)
|
new_message = await app.send_cached_media(
|
||||||
|
self.id, photo, caption=caption
|
||||||
|
)
|
||||||
elif video is not None:
|
elif video is not None:
|
||||||
if isinstance(video, Video):
|
if isinstance(video, Video):
|
||||||
video = video.file_id
|
video = video.file_id
|
||||||
new_message = await app.send_cached_media(self.id, video, caption=caption)
|
new_message = await app.send_cached_media(
|
||||||
|
self.id, video, caption=caption
|
||||||
|
)
|
||||||
elif file is not None:
|
elif file is not None:
|
||||||
if isinstance(file, Document):
|
if isinstance(file, Document):
|
||||||
file = file.file_id
|
file = file.file_id
|
||||||
new_message = await app.send_cached_media(self.id, file, caption=caption)
|
new_message = await app.send_cached_media(
|
||||||
|
self.id, file, caption=caption
|
||||||
|
)
|
||||||
elif animation is not None:
|
elif animation is not None:
|
||||||
if isinstance(animation, Animation):
|
if isinstance(animation, Animation):
|
||||||
animation = animation.file_id
|
animation = animation.file_id
|
||||||
new_message = await app.send_cached_media(self.id, animation, caption=caption)
|
new_message = await app.send_cached_media(
|
||||||
|
self.id, animation, caption=caption
|
||||||
|
)
|
||||||
elif voice is not None:
|
elif voice is not None:
|
||||||
if isinstance(voice, Voice):
|
if isinstance(voice, Voice):
|
||||||
voice = voice.file_id
|
voice = voice.file_id
|
||||||
new_message = await app.send_cached_media(self.id, voice, caption=caption)
|
new_message = await app.send_cached_media(
|
||||||
|
self.id, voice, caption=caption
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
new_message = await app.send_message(self.id, text)
|
new_message = await app.send_message(self.id, text)
|
||||||
|
|
||||||
# Acknowledge sending a message and save entry into DB
|
# Acknowledge sending a message and save entry into DB
|
||||||
await context.reply_text(locale("message_sent", "message"), quote=should_quote(context))
|
await context.reply_text(
|
||||||
col_messages.insert_one({"origin": {"chat": context.chat.id, "id": context.id}, "destination": {"chat": new_message.chat.id, "id": new_message.id}})
|
locale("message_sent", "message"), quote=should_quote(context)
|
||||||
|
)
|
||||||
|
col_messages.insert_one(
|
||||||
|
{
|
||||||
|
"origin": {"chat": context.chat.id, "id": context.id},
|
||||||
|
"destination": {"chat": new_message.chat.id, "id": new_message.id},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# Report to admin and to sender about message sending failure
|
# Report to admin and to sender about message sending failure
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Exception {exp} happened as {context.from_user.id} tried to send message to {self.id}. Traceback:\n{format_exc()}")
|
logWrite(
|
||||||
|
f"Exception {exp} happened as {context.from_user.id} tried to send message to {self.id}. Traceback:\n{format_exc()}"
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
await app.send_message(configGet("owner"), locale("message_traceback", "message").format(context.from_user.id, self.id, exp, format_exc()))
|
await app.send_message(
|
||||||
|
configGet("owner"),
|
||||||
|
locale("message_traceback", "message").format(
|
||||||
|
context.from_user.id, self.id, exp, format_exc()
|
||||||
|
),
|
||||||
|
)
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
logWrite(f"Could not notify admin about failure when sending message! Admin has never interacted with bot!")
|
logWrite(
|
||||||
await context.reply_text(locale("message_error", "message"), quote=should_quote(context))
|
f"Could not notify admin about failure when sending message! Admin has never interacted with bot!"
|
||||||
|
)
|
||||||
|
await context.reply_text(
|
||||||
|
locale("message_error", "message"), quote=should_quote(context)
|
||||||
|
)
|
||||||
|
|
||||||
async def label_set(self, chat: Chat, label: str) -> None:
|
async def label_set(self, chat: Chat, label: str) -> None:
|
||||||
"""Set label in destination group
|
"""Set label in destination group
|
||||||
@ -232,10 +329,18 @@ class HoloUser():
|
|||||||
raise LabelTooLongError(label)
|
raise LabelTooLongError(label)
|
||||||
self.label = label
|
self.label = label
|
||||||
try:
|
try:
|
||||||
await app.promote_chat_member(configGet("users", "groups"), self.id, privileges=ChatPrivileges(can_pin_messages=True, can_manage_video_chats=True))
|
await app.promote_chat_member(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
self.id,
|
||||||
|
privileges=ChatPrivileges(
|
||||||
|
can_pin_messages=True, can_manage_video_chats=True
|
||||||
|
),
|
||||||
|
)
|
||||||
if not await isAnAdmin(self.id):
|
if not await isAnAdmin(self.id):
|
||||||
await sleep(0.5)
|
await sleep(0.5)
|
||||||
await app.set_administrator_title(configGet("users", "groups"), self.id, label)
|
await app.set_administrator_title(
|
||||||
|
configGet("users", "groups"), self.id, label
|
||||||
|
)
|
||||||
self.set("label", label)
|
self.set("label", label)
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not set {self.id}'s title to '{self.label}' due to {exp}")
|
logWrite(f"Could not set {self.id}'s title to '{self.label}' due to {exp}")
|
||||||
@ -251,13 +356,19 @@ class HoloUser():
|
|||||||
self.set("label", "")
|
self.set("label", "")
|
||||||
await app.set_administrator_title(configGet("users", "groups"), self.id, "")
|
await app.set_administrator_title(configGet("users", "groups"), self.id, "")
|
||||||
if not await isAnAdmin(self.id):
|
if not await isAnAdmin(self.id):
|
||||||
await app.promote_chat_member(configGet("users", "groups"), self.id, privileges=ChatPrivileges(
|
await app.promote_chat_member(
|
||||||
can_manage_chat=False,
|
configGet("users", "groups"),
|
||||||
can_pin_messages=False,
|
self.id,
|
||||||
can_manage_video_chats=False
|
privileges=ChatPrivileges(
|
||||||
))
|
can_manage_chat=False,
|
||||||
|
can_pin_messages=False,
|
||||||
|
can_manage_video_chats=False,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
def application_state(self) -> tuple[Literal["none", "fill", "approved", "rejected"], bool]:
|
def application_state(
|
||||||
|
self,
|
||||||
|
) -> tuple[Literal["none", "fill", "approved", "rejected"], bool]:
|
||||||
"""Check the current state of application in tmp collection
|
"""Check the current state of application in tmp collection
|
||||||
|
|
||||||
### Returns:
|
### Returns:
|
||||||
@ -275,15 +386,21 @@ class HoloUser():
|
|||||||
### Returns:
|
### Returns:
|
||||||
* `bool`: `True` if yes and `False` if no
|
* `bool`: `True` if yes and `False` if no
|
||||||
"""
|
"""
|
||||||
return True if col_applications.find_one({"user": self.id}) is not None else False
|
return (
|
||||||
|
True if col_applications.find_one({"user": self.id}) is not None else False
|
||||||
|
)
|
||||||
|
|
||||||
def application_restart(self, reapply: bool = False) -> None:
|
def application_restart(self, reapply: bool = False) -> None:
|
||||||
"""Reset application of a user in tmp collection and replace it with an empty one
|
"""Reset application of a user in tmp collection and replace it with an empty one"""
|
||||||
"""
|
|
||||||
if col_tmp.find_one({"user": self.id, "type": "application"}) is None:
|
if col_tmp.find_one({"user": self.id, "type": "application"}) is None:
|
||||||
col_tmp.insert_one(document=DefaultApplicationTemp(self.id, reapply=reapply).dict)
|
col_tmp.insert_one(
|
||||||
|
document=DefaultApplicationTemp(self.id, reapply=reapply).dict
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
col_tmp.find_one_and_replace({"user": self.id, "type": "application"}, DefaultApplicationTemp(self.id, reapply=reapply).dict)
|
col_tmp.find_one_and_replace(
|
||||||
|
{"user": self.id, "type": "application"},
|
||||||
|
DefaultApplicationTemp(self.id, reapply=reapply).dict,
|
||||||
|
)
|
||||||
|
|
||||||
async def application_next(self, query: str, msg: Message) -> None:
|
async def application_next(self, query: str, msg: Message) -> None:
|
||||||
"""Move on filling application of user
|
"""Move on filling application of user
|
||||||
@ -317,91 +434,283 @@ class HoloUser():
|
|||||||
# return
|
# return
|
||||||
|
|
||||||
if progress["state"] == "fill" and progress["sent"] is False:
|
if progress["state"] == "fill" and progress["sent"] is False:
|
||||||
|
|
||||||
if msg.text is not None:
|
if msg.text is not None:
|
||||||
msg.text = fix_text(str(msg.text))
|
msg.text = fix_text(str(msg.text))
|
||||||
|
|
||||||
if stage == 2:
|
if stage == 2:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
input_dt = datetime.strptime(query, "%d.%m.%Y")
|
input_dt = datetime.strptime(query, "%d.%m.%Y")
|
||||||
except ValueError:
|
except ValueError:
|
||||||
logWrite(f"User {msg.from_user.id} failed stage {stage} due to sending invalid date format")
|
logWrite(
|
||||||
await msg.reply_text(locale(f"question2_invalid", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage}", "force_reply", locale=self.locale))))
|
f"User {msg.from_user.id} failed stage {stage} due to sending invalid date format"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"question2_invalid", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
if (datetime.now() <= input_dt) or ((datetime.now() - input_dt).days) > ((datetime.now() - datetime.now().replace(year=datetime.now().year - configGet("age_maximum"))).days):
|
if (datetime.now() <= input_dt) or (
|
||||||
logWrite(f"User {msg.from_user.id} failed stage {stage} due to joking")
|
(datetime.now() - input_dt).days
|
||||||
await msg.reply_text(locale("question2_joke", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale("question2", "force_reply", locale=self.locale))))
|
) > (
|
||||||
|
(
|
||||||
|
datetime.now()
|
||||||
|
- datetime.now().replace(
|
||||||
|
year=datetime.now().year - configGet("age_maximum")
|
||||||
|
)
|
||||||
|
).days
|
||||||
|
):
|
||||||
|
logWrite(
|
||||||
|
f"User {msg.from_user.id} failed stage {stage} due to joking"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("question2_joke", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale("question2", "force_reply", locale=self.locale)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
elif ((datetime.now() - input_dt).days) < ((datetime.now() - datetime.now().replace(year=datetime.now().year - configGet("age_allowed"))).days):
|
elif ((datetime.now() - input_dt).days) < (
|
||||||
logWrite(f"User {msg.from_user.id} failed stage {stage} due to being underage")
|
(
|
||||||
await msg.reply_text(locale("question2_underage", "message", locale=self.locale).format(str(configGet("age_allowed"))), reply_markup=ForceReply(placeholder=str(locale("question2", "force_reply", locale=self.locale))))
|
datetime.now()
|
||||||
|
- datetime.now().replace(
|
||||||
|
year=datetime.now().year - configGet("age_allowed")
|
||||||
|
)
|
||||||
|
).days
|
||||||
|
):
|
||||||
|
logWrite(
|
||||||
|
f"User {msg.from_user.id} failed stage {stage} due to being underage"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(
|
||||||
|
"question2_underage", "message", locale=self.locale
|
||||||
|
).format(str(configGet("age_allowed"))),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale("question2", "force_reply", locale=self.locale)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
else:
|
else:
|
||||||
progress["application"][str(stage)] = input_dt
|
progress["application"][str(stage)] = input_dt
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "application"}}, {"$set": {"application": progress["application"], "stage": progress["stage"]+1}})
|
col_tmp.update_one(
|
||||||
await msg.reply_text(locale(f"question{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage+1}", "force_reply", locale=self.locale))))
|
{"user": {"$eq": self.id}, "type": {"$eq": "application"}},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"application": progress["application"],
|
||||||
|
"stage": progress["stage"] + 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"question{stage+1}", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage+1}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
elif stage == 3:
|
elif stage == 3:
|
||||||
try:
|
try:
|
||||||
progress["application"][str(stage)] = find_location(query)
|
progress["application"][str(stage)] = find_location(query)
|
||||||
if ("lat" in progress["application"][str(stage)] and "lng" in progress["application"][str(stage)]):
|
if (
|
||||||
progress["application"][str(stage)]["location"] = [float(progress["application"][str(stage)]["lng"]), float(progress["application"][str(stage)]["lat"])]
|
"lat" in progress["application"][str(stage)]
|
||||||
|
and "lng" in progress["application"][str(stage)]
|
||||||
|
):
|
||||||
|
progress["application"][str(stage)]["location"] = [
|
||||||
|
float(progress["application"][str(stage)]["lng"]),
|
||||||
|
float(progress["application"][str(stage)]["lat"]),
|
||||||
|
]
|
||||||
del progress["application"][str(stage)]["lat"]
|
del progress["application"][str(stage)]["lat"]
|
||||||
del progress["application"][str(stage)]["lng"]
|
del progress["application"][str(stage)]["lng"]
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "application"}}, {"$set": {"application": progress["application"], "stage": progress["stage"]+1}})
|
col_tmp.update_one(
|
||||||
await msg.reply_text(locale("question3_found", "message", locale=self.locale).format(progress["application"][str(stage)]["name"], progress["application"][str(stage)]["adminName1"]))
|
{"user": {"$eq": self.id}, "type": {"$eq": "application"}},
|
||||||
await msg.reply_text(locale(f"question{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage+1}", "force_reply", locale=self.locale))))
|
{
|
||||||
|
"$set": {
|
||||||
|
"application": progress["application"],
|
||||||
|
"stage": progress["stage"] + 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("question3_found", "message", locale=self.locale).format(
|
||||||
|
progress["application"][str(stage)]["name"],
|
||||||
|
progress["application"][str(stage)]["adminName1"],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"question{stage+1}", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage+1}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
except PlaceNotFoundError:
|
except PlaceNotFoundError:
|
||||||
await msg.reply_text(locale("question3_invalid", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage}", "force_reply", locale=self.locale))))
|
await msg.reply_text(
|
||||||
|
locale("question3_invalid", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
await msg.reply_text(locale("question3_error", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage}", "force_reply", locale=self.locale))))
|
await msg.reply_text(
|
||||||
|
locale("question3_error", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
await app.send_message(configGet("owner"), locale("question3_traceback", "message", locale=self.locale).format(query, exp, format_exc()))
|
await app.send_message(
|
||||||
|
configGet("owner"),
|
||||||
|
locale(
|
||||||
|
"question3_traceback", "message", locale=self.locale
|
||||||
|
).format(query, exp, format_exc()),
|
||||||
|
)
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
logWrite(f"Could not notify admin about failure when sending message! Admin has never interacted with bot!")
|
logWrite(
|
||||||
|
f"Could not notify admin about failure when sending message! Admin has never interacted with bot!"
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
elif stage == 10:
|
elif stage == 10:
|
||||||
if len(query) > 1024:
|
if len(query) > 1024:
|
||||||
await msg.reply_text(locale("question10_too_long", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage}", "force_reply", locale=self.locale))))
|
await msg.reply_text(
|
||||||
|
locale("question10_too_long", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
progress["application"][str(stage)] = query
|
progress["application"][str(stage)] = query
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "application"}}, {"$set": {"application": progress["application"], "complete": True}})
|
col_tmp.update_one(
|
||||||
|
{"user": {"$eq": self.id}, "type": {"$eq": "application"}},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"application": progress["application"],
|
||||||
|
"complete": True,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
application_content = []
|
application_content = []
|
||||||
i = 1
|
i = 1
|
||||||
for question in progress["application"]:
|
for question in progress["application"]:
|
||||||
if i == 2:
|
if i == 2:
|
||||||
age = relativedelta(datetime.now(), progress['application']['2'])
|
age = relativedelta(
|
||||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
datetime.now(), progress["application"]["2"]
|
||||||
|
)
|
||||||
|
application_content.append(
|
||||||
|
f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)"
|
||||||
|
)
|
||||||
elif i == 3:
|
elif i == 3:
|
||||||
if progress['application']['3']['countryCode'] == "UA":
|
if progress["application"]["3"]["countryCode"] == "UA":
|
||||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application']['3']['name']} ({progress['application']['3']['adminName1']})")
|
application_content.append(
|
||||||
|
f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application']['3']['name']} ({progress['application']['3']['adminName1']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application']['3']['name']} ({progress['application']['3']['adminName1']}, {progress['application']['3']['countryName']})")
|
application_content.append(
|
||||||
|
f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application']['3']['name']} ({progress['application']['3']['adminName1']}, {progress['application']['3']['countryName']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application'][question]}")
|
application_content.append(
|
||||||
|
f"{locale('question'+str(i), 'message', 'question_titles', locale=self.locale)} {progress['application'][question]}"
|
||||||
|
)
|
||||||
i += 1
|
i += 1
|
||||||
await msg.reply_text(locale("confirm", "message", locale=self.locale).format("\n".join(application_content)), reply_markup=ReplyKeyboardMarkup(locale("confirm", "keyboard", locale=self.locale), resize_keyboard=True))
|
await msg.reply_text(
|
||||||
|
locale("confirm", "message", locale=self.locale).format(
|
||||||
|
"\n".join(application_content)
|
||||||
|
),
|
||||||
|
reply_markup=ReplyKeyboardMarkup(
|
||||||
|
locale("confirm", "keyboard", locale=self.locale),
|
||||||
|
resize_keyboard=True,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if len(query) > 256:
|
if len(query) > 256:
|
||||||
await msg.reply_text(locale("question_too_long", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage}", "force_reply", locale=self.locale))))
|
await msg.reply_text(
|
||||||
|
locale("question_too_long", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
progress["application"][str(stage)] = query
|
progress["application"][str(stage)] = query
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "application"}}, {"$set": {"application": progress["application"], "stage": progress["stage"]+1}})
|
col_tmp.update_one(
|
||||||
await msg.reply_text(locale(f"question{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage+1}", "force_reply", locale=self.locale))))
|
{"user": {"$eq": self.id}, "type": {"$eq": "application"}},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"application": progress["application"],
|
||||||
|
"stage": progress["stage"] + 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"question{stage+1}", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"question{stage+1}", "force_reply", locale=self.locale
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
logWrite(f"User {self.id} completed stage {stage} of application")
|
logWrite(f"User {self.id} completed stage {stage} of application")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
def sponsorship_state(self) -> tuple[Literal["none", "fill", "approved", "rejected"], bool]:
|
def sponsorship_state(
|
||||||
|
self,
|
||||||
|
) -> tuple[Literal["none", "fill", "approved", "rejected"], bool]:
|
||||||
"""Check the current state of sponsorship in tmp collection
|
"""Check the current state of sponsorship in tmp collection
|
||||||
|
|
||||||
### Returns:
|
### Returns:
|
||||||
@ -419,18 +728,26 @@ class HoloUser():
|
|||||||
### Returns:
|
### Returns:
|
||||||
* `bool`: `True` if yes and `False` if no
|
* `bool`: `True` if yes and `False` if no
|
||||||
"""
|
"""
|
||||||
return True if col_sponsorships.find_one({"user": self.id, "expires": {"$gt": datetime.now()}}) is not None else False
|
return (
|
||||||
|
True
|
||||||
|
if col_sponsorships.find_one(
|
||||||
|
{"user": self.id, "expires": {"$gt": datetime.now()}}
|
||||||
|
)
|
||||||
|
is not None
|
||||||
|
else False
|
||||||
|
)
|
||||||
|
|
||||||
def sponsorship_restart(self) -> None:
|
def sponsorship_restart(self) -> None:
|
||||||
"""Reset sponsorship of a user in tmp collection and replace it with an empty one
|
"""Reset sponsorship of a user in tmp collection and replace it with an empty one"""
|
||||||
"""
|
|
||||||
if col_tmp.find_one({"user": self.id, "type": "sponsorship"}) is None:
|
if col_tmp.find_one({"user": self.id, "type": "sponsorship"}) is None:
|
||||||
col_tmp.insert_one(document=DefaultSponsorshipTemp(self.id).dict)
|
col_tmp.insert_one(document=DefaultSponsorshipTemp(self.id).dict)
|
||||||
else:
|
else:
|
||||||
col_tmp.delete_one({"user": self.id, "type": "sponsorship"})
|
col_tmp.delete_one({"user": self.id, "type": "sponsorship"})
|
||||||
col_tmp.insert_one(document=DefaultSponsorshipTemp(self.id).dict)
|
col_tmp.insert_one(document=DefaultSponsorshipTemp(self.id).dict)
|
||||||
|
|
||||||
async def sponsorship_next(self, query: str, msg: Message, photo: Union[Photo, None] = None) -> None:
|
async def sponsorship_next(
|
||||||
|
self, query: str, msg: Message, photo: Union[Photo, None] = None
|
||||||
|
) -> None:
|
||||||
"""Move on filling sponsorship of user
|
"""Move on filling sponsorship of user
|
||||||
|
|
||||||
### Args:
|
### Args:
|
||||||
@ -441,7 +758,6 @@ class HoloUser():
|
|||||||
progress = col_tmp.find_one({"user": self.id, "type": "sponsorship"})
|
progress = col_tmp.find_one({"user": self.id, "type": "sponsorship"})
|
||||||
|
|
||||||
if progress is not None:
|
if progress is not None:
|
||||||
|
|
||||||
stage = progress["stage"]
|
stage = progress["stage"]
|
||||||
|
|
||||||
if msg.text is not None:
|
if msg.text is not None:
|
||||||
@ -450,58 +766,171 @@ class HoloUser():
|
|||||||
msg.caption = fix_text(msg.caption)
|
msg.caption = fix_text(msg.caption)
|
||||||
|
|
||||||
if progress["state"] == "fill" and progress["sent"] is False:
|
if progress["state"] == "fill" and progress["sent"] is False:
|
||||||
|
|
||||||
if stage == 1:
|
if stage == 1:
|
||||||
|
|
||||||
if len(query) > 240:
|
if len(query) > 240:
|
||||||
logWrite(f"User {msg.from_user.id} failed stage {stage} due to sending invalid date format")
|
logWrite(
|
||||||
await msg.reply_text(locale(f"sponsor1_invalid", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor{stage}", "force_reply", locale=self.locale))))
|
f"User {msg.from_user.id} failed stage {stage} due to sending invalid date format"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"sponsor1_invalid", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"sponsor{stage}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
progress["sponsorship"]["streamer"] = query
|
progress["sponsorship"]["streamer"] = query
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"sponsorship": progress["sponsorship"], "stage": progress["stage"]+1}})
|
col_tmp.update_one(
|
||||||
await msg.reply_text(locale(f"sponsor{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor{stage+1}", "force_reply", locale=self.locale))))
|
{"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"sponsorship": progress["sponsorship"],
|
||||||
|
"stage": progress["stage"] + 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"sponsor{stage+1}", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"sponsor{stage+1}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
elif stage == 2:
|
elif stage == 2:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
input_dt = datetime.strptime(query, "%d.%m.%Y")
|
input_dt = datetime.strptime(query, "%d.%m.%Y")
|
||||||
except ValueError:
|
except ValueError:
|
||||||
logWrite(f"User {msg.from_user.id} failed stage {stage} due to sending invalid date format")
|
logWrite(
|
||||||
await msg.reply_text(locale(f"sponsor2_invalid", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor{stage}", "force_reply", locale=self.locale))))
|
f"User {msg.from_user.id} failed stage {stage} due to sending invalid date format"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"sponsor2_invalid", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"sponsor{stage}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
if datetime.now() >= input_dt:
|
if datetime.now() >= input_dt:
|
||||||
logWrite(f"User {msg.from_user.id} failed stage {stage} due to sending date in the past")
|
logWrite(
|
||||||
await msg.reply_text(locale("sponsor2_past", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale("sponsor2", "force_reply", locale=self.locale))))
|
f"User {msg.from_user.id} failed stage {stage} due to sending date in the past"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("sponsor2_past", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
"sponsor2", "force_reply", locale=self.locale
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
else:
|
else:
|
||||||
progress["sponsorship"]["expires"] = input_dt
|
progress["sponsorship"]["expires"] = input_dt
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"sponsorship": progress["sponsorship"], "stage": progress["stage"]+1}})
|
col_tmp.update_one(
|
||||||
await msg.reply_text(locale(f"sponsor{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor{stage+1}", "force_reply", locale=self.locale))))
|
{"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"sponsorship": progress["sponsorship"],
|
||||||
|
"stage": progress["stage"] + 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"sponsor{stage+1}", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"sponsor{stage+1}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
elif stage == 3:
|
elif stage == 3:
|
||||||
|
|
||||||
if photo is not None:
|
if photo is not None:
|
||||||
progress["sponsorship"]["proof"] = photo.file_id
|
progress["sponsorship"]["proof"] = photo.file_id
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"sponsorship": progress["sponsorship"], "stage": progress["stage"]+1}})
|
col_tmp.update_one(
|
||||||
await msg.reply_text(locale(f"sponsor{stage+1}", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor{stage+1}", "force_reply", locale=self.locale))))
|
{"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"sponsorship": progress["sponsorship"],
|
||||||
|
"stage": progress["stage"] + 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(f"sponsor{stage+1}", "message", locale=self.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
f"sponsor{stage+1}",
|
||||||
|
"force_reply",
|
||||||
|
locale=self.locale,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
elif stage == 4:
|
elif stage == 4:
|
||||||
if len(query) > 16:
|
if len(query) > 16:
|
||||||
await msg.reply_text(locale("label_too_long", "message"), reply_markup=ForceReply(placeholder=str(locale("sponsor4", "force_reply", locale=self.locale))))
|
await msg.reply_text(
|
||||||
|
locale("label_too_long", "message"),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(
|
||||||
|
"sponsor4", "force_reply", locale=self.locale
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
progress["sponsorship"]["label"] = query
|
progress["sponsorship"]["label"] = query
|
||||||
col_tmp.update_one({"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}}, {"$set": {"sponsorship": progress["sponsorship"], "complete": True}})
|
col_tmp.update_one(
|
||||||
|
{"user": {"$eq": self.id}, "type": {"$eq": "sponsorship"}},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"sponsorship": progress["sponsorship"],
|
||||||
|
"complete": True,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
await msg.reply_cached_media(
|
await msg.reply_cached_media(
|
||||||
progress["sponsorship"]["proof"],
|
progress["sponsorship"]["proof"],
|
||||||
caption=locale("sponsor_confirm", "message", locale=self.locale).format(
|
caption=locale(
|
||||||
|
"sponsor_confirm", "message", locale=self.locale
|
||||||
|
).format(
|
||||||
progress["sponsorship"]["streamer"],
|
progress["sponsorship"]["streamer"],
|
||||||
progress["sponsorship"]["expires"].strftime("%d.%m.%Y"),
|
progress["sponsorship"]["expires"].strftime("%d.%m.%Y"),
|
||||||
progress["sponsorship"]["label"]
|
progress["sponsorship"]["label"],
|
||||||
),
|
),
|
||||||
reply_markup=ReplyKeyboardMarkup(locale("confirm", "keyboard", locale=self.locale), resize_keyboard=True))
|
reply_markup=ReplyKeyboardMarkup(
|
||||||
|
locale("confirm", "keyboard", locale=self.locale),
|
||||||
|
resize_keyboard=True,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
@ -517,4 +946,8 @@ class HoloUser():
|
|||||||
### Returns:
|
### Returns:
|
||||||
* `bool`: `True` if any not finished spoilers available and `False` if none.
|
* `bool`: `True` if any not finished spoilers available and `False` if none.
|
||||||
"""
|
"""
|
||||||
return False if col_spoilers.find_one({"user": self.id, "completed": False}) is None else True
|
return (
|
||||||
|
False
|
||||||
|
if col_spoilers.find_one({"user": self.id, "completed": False}) is None
|
||||||
|
else True
|
||||||
|
)
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
class DefaultApplicationTemp(dict):
|
class DefaultApplicationTemp(dict):
|
||||||
def __init__(self, user: int, reapply: bool = False):
|
def __init__(self, user: int, reapply: bool = False):
|
||||||
super().__init__({})
|
super().__init__({})
|
||||||
@ -23,10 +24,11 @@ class DefaultApplicationTemp(dict):
|
|||||||
"7": None,
|
"7": None,
|
||||||
"8": None,
|
"8": None,
|
||||||
"9": None,
|
"9": None,
|
||||||
"10": None
|
"10": None,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class DefaultSponsorshipTemp(dict):
|
class DefaultSponsorshipTemp(dict):
|
||||||
def __init__(self, user: int):
|
def __init__(self, user: int):
|
||||||
super().__init__({})
|
super().__init__({})
|
||||||
@ -41,6 +43,6 @@ class DefaultSponsorshipTemp(dict):
|
|||||||
"streamer": None,
|
"streamer": None,
|
||||||
"expires": datetime.fromtimestamp(0),
|
"expires": datetime.fromtimestamp(0),
|
||||||
"proof": None,
|
"proof": None,
|
||||||
"label": ""
|
"label": "",
|
||||||
}
|
},
|
||||||
}
|
}
|
@ -48,7 +48,6 @@ from modules.handlers.everything import *
|
|||||||
from modules.scheduled import *
|
from modules.scheduled import *
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
logWrite(f"Starting up with pid {pid}")
|
logWrite(f"Starting up with pid {pid}")
|
||||||
|
|
||||||
# Yes, it should be in some kind of async main() function but I don't give a shit.
|
# Yes, it should be in some kind of async main() function but I don't give a shit.
|
||||||
@ -57,17 +56,43 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if path.exists(path.join(configGet("cache", "locations"), "shutdown_time")):
|
if path.exists(path.join(configGet("cache", "locations"), "shutdown_time")):
|
||||||
downtime = relativedelta(datetime.now(), datetime.fromtimestamp(jsonLoad(path.join(configGet("cache", "locations"), "shutdown_time"))["timestamp"]))
|
downtime = relativedelta(
|
||||||
|
datetime.now(),
|
||||||
|
datetime.fromtimestamp(
|
||||||
|
jsonLoad(
|
||||||
|
path.join(configGet("cache", "locations"), "shutdown_time")
|
||||||
|
)["timestamp"]
|
||||||
|
),
|
||||||
|
)
|
||||||
if downtime.days >= 1:
|
if downtime.days >= 1:
|
||||||
app.send_message(configGet("owner"), locale("startup_downtime_days", "message").format(pid, downtime.days))
|
app.send_message(
|
||||||
|
configGet("owner"),
|
||||||
|
locale("startup_downtime_days", "message").format(
|
||||||
|
pid, downtime.days
|
||||||
|
),
|
||||||
|
)
|
||||||
elif downtime.hours >= 1:
|
elif downtime.hours >= 1:
|
||||||
app.send_message(configGet("owner"), locale("startup_downtime_hours", "message").format(pid, downtime.hours))
|
app.send_message(
|
||||||
|
configGet("owner"),
|
||||||
|
locale("startup_downtime_hours", "message").format(
|
||||||
|
pid, downtime.hours
|
||||||
|
),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
app.send_message(configGet("owner"), locale("startup_downtime_minutes", "message").format(pid, downtime.minutes))
|
app.send_message(
|
||||||
|
configGet("owner"),
|
||||||
|
locale("startup_downtime_minutes", "message").format(
|
||||||
|
pid, downtime.minutes
|
||||||
|
),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
app.send_message(configGet("owner"), locale("startup", "message").format(pid))
|
app.send_message(
|
||||||
|
configGet("owner"), locale("startup", "message").format(pid)
|
||||||
|
)
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
logWrite(f"Could not send startup message to bot owner. Perhaps user has not started the bot yet.")
|
logWrite(
|
||||||
|
f"Could not send startup message to bot owner. Perhaps user has not started the bot yet."
|
||||||
|
)
|
||||||
|
|
||||||
scheduler.start()
|
scheduler.start()
|
||||||
|
|
||||||
@ -76,11 +101,16 @@ if __name__ == "__main__":
|
|||||||
try:
|
try:
|
||||||
app.send_message(configGet("owner"), locale("shutdown", "message").format(pid))
|
app.send_message(configGet("owner"), locale("shutdown", "message").format(pid))
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
logWrite(f"Could not send shutdown message to bot owner. Perhaps user has not started the bot yet.")
|
logWrite(
|
||||||
|
f"Could not send shutdown message to bot owner. Perhaps user has not started the bot yet."
|
||||||
|
)
|
||||||
|
|
||||||
app.stop()
|
app.stop()
|
||||||
|
|
||||||
makedirs(configGet("cache", "locations"), exist_ok=True)
|
makedirs(configGet("cache", "locations"), exist_ok=True)
|
||||||
jsonSave({"timestamp": time()}, path.join(configGet("cache", "locations"), "shutdown_time"))
|
jsonSave(
|
||||||
|
{"timestamp": time()},
|
||||||
|
path.join(configGet("cache", "locations"), "shutdown_time"),
|
||||||
|
)
|
||||||
|
|
||||||
killProc(pid)
|
killProc(pid)
|
@ -6,17 +6,25 @@ from modules.utils import locale
|
|||||||
from modules.database import col_bans
|
from modules.database import col_bans
|
||||||
from modules.logging import logWrite
|
from modules.logging import logWrite
|
||||||
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("ban_[\s\S]*"))
|
@app.on_callback_query(filters.regex("ban_[\s\S]*"))
|
||||||
async def callback_query_reject(app: Client, clb: CallbackQuery):
|
async def callback_query_reject(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
|
|
||||||
if not await isAnAdmin(int(fullclb[1])):
|
if not await isAnAdmin(int(fullclb[1])):
|
||||||
col_bans.insert_one( {"user": int(fullclb[1])} )
|
col_bans.insert_one({"user": int(fullclb[1])})
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("banned", "button")), callback_data="nothing")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("banned", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
|
await clb.message.edit(
|
||||||
|
text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup)
|
||||||
|
)
|
||||||
await clb.answer(text=locale("sub_banned", "callback", locale=clb.from_user))
|
await clb.answer(text=locale("sub_banned", "callback", locale=clb.from_user))
|
||||||
|
|
||||||
logWrite(f"User {fullclb[1]} has been banned by {clb.from_user.id}")
|
logWrite(f"User {fullclb[1]} has been banned by {clb.from_user.id}")
|
||||||
|
@ -4,8 +4,11 @@ from pyrogram.types import CallbackQuery
|
|||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from modules.utils import locale
|
from modules.utils import locale
|
||||||
|
|
||||||
|
|
||||||
# Callback empty ===============================================================================================================
|
# Callback empty ===============================================================================================================
|
||||||
@app.on_callback_query(filters.regex("nothing"))
|
@app.on_callback_query(filters.regex("nothing"))
|
||||||
async def callback_query_nothing(app: Client, clb: CallbackQuery):
|
async def callback_query_nothing(app: Client, clb: CallbackQuery):
|
||||||
await clb.answer(text=locale("nothing", "callback", locale=clb.from_user))
|
await clb.answer(text=locale("nothing", "callback", locale=clb.from_user))
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -1,6 +1,11 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from app import app
|
from app import app
|
||||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardRemove, CallbackQuery
|
from pyrogram.types import (
|
||||||
|
InlineKeyboardMarkup,
|
||||||
|
InlineKeyboardButton,
|
||||||
|
ReplyKeyboardRemove,
|
||||||
|
CallbackQuery,
|
||||||
|
)
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
@ -9,33 +14,85 @@ from modules.handlers.confirmation import confirm_yes
|
|||||||
from modules.handlers.welcome import welcome_pass
|
from modules.handlers.welcome import welcome_pass
|
||||||
from modules.database import col_tmp, col_applications
|
from modules.database import col_tmp, col_applications
|
||||||
|
|
||||||
|
|
||||||
# Callbacks reapply ============================================================================================================
|
# Callbacks reapply ============================================================================================================
|
||||||
@app.on_callback_query(filters.regex("reapply_yes_[\s\S]*"))
|
@app.on_callback_query(filters.regex("reapply_yes_[\s\S]*"))
|
||||||
async def callback_reapply_query_accept(app: Client, clb: CallbackQuery):
|
async def callback_reapply_query_accept(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("approved_by", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
logWrite(f"User {holo_user.id} got their reapplication approved by {clb.from_user.id}")
|
configGet("admin", "groups"),
|
||||||
|
locale("approved_by", "message").format(clb.from_user.first_name, holo_user.id),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"User {holo_user.id} got their reapplication approved by {clb.from_user.id}"
|
||||||
|
)
|
||||||
|
|
||||||
await app.send_message(holo_user.id, locale("approved_joined", "message", locale=holo_user))
|
await app.send_message(
|
||||||
|
holo_user.id, locale("approved_joined", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
|
||||||
applications = col_applications.find({"user": holo_user.id})
|
applications = col_applications.find({"user": holo_user.id})
|
||||||
|
|
||||||
if len(list(applications)) > 1:
|
if len(list(applications)) > 1:
|
||||||
col_applications.delete_many({"user": holo_user.id})
|
col_applications.delete_many({"user": holo_user.id})
|
||||||
col_applications.insert_one({"user": holo_user.id, "date": datetime.now(), "admin": clb.from_user.id, "application": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}})["application"]})
|
col_applications.insert_one(
|
||||||
|
{
|
||||||
|
"user": holo_user.id,
|
||||||
|
"date": datetime.now(),
|
||||||
|
"admin": clb.from_user.id,
|
||||||
|
"application": col_tmp.find_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}
|
||||||
|
)["application"],
|
||||||
|
}
|
||||||
|
)
|
||||||
elif applications == 1:
|
elif applications == 1:
|
||||||
col_applications.find_one_and_replace({"user": holo_user.id}, {"user": holo_user.id, "date": datetime.now(), "admin": clb.from_user.id, "application": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}})["application"]})
|
col_applications.find_one_and_replace(
|
||||||
|
{"user": holo_user.id},
|
||||||
|
{
|
||||||
|
"user": holo_user.id,
|
||||||
|
"date": datetime.now(),
|
||||||
|
"admin": clb.from_user.id,
|
||||||
|
"application": col_tmp.find_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}
|
||||||
|
)["application"],
|
||||||
|
},
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
col_applications.insert_one({"user": holo_user.id, "date": datetime.now(), "admin": clb.from_user.id, "application": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}})["application"]})
|
col_applications.insert_one(
|
||||||
col_tmp.update_one({"user": holo_user.id, "type": "application"}, {"$set": {"state": "approved", "sent": False}})
|
{
|
||||||
|
"user": holo_user.id,
|
||||||
|
"date": datetime.now(),
|
||||||
|
"admin": clb.from_user.id,
|
||||||
|
"application": col_tmp.find_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}
|
||||||
|
)["application"],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
col_tmp.update_one(
|
||||||
|
{"user": holo_user.id, "type": "application"},
|
||||||
|
{"$set": {"state": "approved", "sent": False}},
|
||||||
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("accepted", "button")), callback_data="nothing")]]
|
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.message.edit(
|
||||||
await clb.answer(text=locale("sub_accepted", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup)
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sub_accepted", "callback", locale=clb.from_user).format(
|
||||||
|
holo_user.id
|
||||||
|
),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
|
|
||||||
need_link = True
|
need_link = True
|
||||||
|
|
||||||
@ -44,56 +101,107 @@ async def callback_reapply_query_accept(app: Client, clb: CallbackQuery):
|
|||||||
need_link = False
|
need_link = False
|
||||||
|
|
||||||
if need_link:
|
if need_link:
|
||||||
link = await app.create_chat_invite_link(configGet("users", "groups"), name=f"Invite for {holo_user.id}", member_limit=1) #, expire_date=datetime.now()+timedelta(days=1))
|
link = await app.create_chat_invite_link(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
name=f"Invite for {holo_user.id}",
|
||||||
|
member_limit=1,
|
||||||
|
) # , expire_date=datetime.now()+timedelta(days=1))
|
||||||
|
|
||||||
await app.send_message(holo_user.id, locale("read_rules", "message", locale=holo_user))
|
await app.send_message(
|
||||||
|
holo_user.id, locale("read_rules", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
|
||||||
for rule_msg in locale("rules", locale=holo_user):
|
for rule_msg in locale("rules", locale=holo_user):
|
||||||
await app.send_message(holo_user.id, rule_msg)
|
await app.send_message(holo_user.id, rule_msg)
|
||||||
|
|
||||||
await app.send_message(holo_user.id, locale("approved", "message"), reply_markup=InlineKeyboardMarkup(
|
await app.send_message(
|
||||||
[[
|
holo_user.id,
|
||||||
InlineKeyboardButton(str(locale("join", "button", locale=holo_user)), url=link.invite_link)
|
locale("approved", "message"),
|
||||||
]]
|
reply_markup=InlineKeyboardMarkup(
|
||||||
))
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
str(locale("join", "button", locale=holo_user)),
|
||||||
|
url=link.invite_link,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
holo_user.set("link", link.invite_link)
|
holo_user.set("link", link.invite_link)
|
||||||
logWrite(f"User {holo_user.id} got an invite link {link.invite_link}")
|
logWrite(f"User {holo_user.id} got an invite link {link.invite_link}")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await app.send_message(holo_user.id, locale("approved_joined", "message", locale=holo_user))
|
await app.send_message(
|
||||||
|
holo_user.id, locale("approved_joined", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("reapply_no_[\s\S]*"))
|
@app.on_callback_query(filters.regex("reapply_no_[\s\S]*"))
|
||||||
async def callback_query_reapply_reject(app: Client, clb: CallbackQuery):
|
async def callback_query_reapply_reject(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("rejected_by", "message").format(clb.from_user.first_name, fullclb[2]), disable_notification=True)
|
await app.send_message(
|
||||||
await app.send_message(holo_user.id, locale("rejected", "message", locale=holo_user))
|
configGet("admin", "groups"),
|
||||||
logWrite(f"User {fullclb[2]} got their reapplication rejected by {clb.from_user.id}")
|
locale("rejected_by", "message").format(clb.from_user.first_name, fullclb[2]),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
holo_user.id, locale("rejected", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"User {fullclb[2]} got their reapplication rejected by {clb.from_user.id}"
|
||||||
|
)
|
||||||
|
|
||||||
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}, {"$set": {"state": "rejected", "sent": False}})
|
col_tmp.update_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}},
|
||||||
|
{"$set": {"state": "rejected", "sent": False}},
|
||||||
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("declined", "button")), callback_data="nothing")], [InlineKeyboardButton(text=str(locale("ban", "button")), callback_data=f"ban_{fullclb[2]}")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("declined", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("ban", "button")), callback_data=f"ban_{fullclb[2]}"
|
||||||
|
)
|
||||||
|
],
|
||||||
|
]
|
||||||
|
|
||||||
|
await clb.message.edit(
|
||||||
|
text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup)
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sub_rejected", "callback", locale=clb.from_user).format(
|
||||||
|
fullclb[2]
|
||||||
|
),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
|
|
||||||
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
|
|
||||||
await clb.answer(text=locale("sub_rejected", "callback", locale=clb.from_user).format(fullclb[2]), show_alert=True)
|
|
||||||
|
|
||||||
# Use old application when user reapplies after leaving the chat
|
# Use old application when user reapplies after leaving the chat
|
||||||
@app.on_callback_query(filters.regex("reapply_old_[\s\S]*"))
|
@app.on_callback_query(filters.regex("reapply_old_[\s\S]*"))
|
||||||
async def callback_query_reapply_old(app: Client, clb: CallbackQuery):
|
async def callback_query_reapply_old(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(clb.from_user)
|
holo_user = HoloUser(clb.from_user)
|
||||||
|
|
||||||
if holo_user.sponsorship_state()[0] == "fill":
|
if holo_user.sponsorship_state()[0] == "fill":
|
||||||
await clb.message.reply_text(locale("finish_sponsorship", "message"), quote=False)
|
await clb.message.reply_text(
|
||||||
|
locale("finish_sponsorship", "message"), quote=False
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
||||||
|
|
||||||
if col_tmp.find_one({"user": holo_user.id, "type": "application"}) is None and col_applications.find_one({"user": holo_user.id}) is not None:
|
if (
|
||||||
|
col_tmp.find_one({"user": holo_user.id, "type": "application"}) is None
|
||||||
|
and col_applications.find_one({"user": holo_user.id}) is not None
|
||||||
|
):
|
||||||
col_tmp.insert_one(
|
col_tmp.insert_one(
|
||||||
{
|
{
|
||||||
"user": holo_user.id,
|
"user": holo_user.id,
|
||||||
@ -103,37 +211,68 @@ async def callback_query_reapply_old(app: Client, clb: CallbackQuery):
|
|||||||
"state": "fill",
|
"state": "fill",
|
||||||
"reapply": True,
|
"reapply": True,
|
||||||
"stage": 10,
|
"stage": 10,
|
||||||
"application": col_applications.find_one({"user": holo_user.id})["application"]
|
"application": col_applications.find_one({"user": holo_user.id})[
|
||||||
|
"application"
|
||||||
|
],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
await confirm_yes(app, message, kind="application")
|
await confirm_yes(app, message, kind="application")
|
||||||
await clb.message.edit(clb.message.text, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("done", "button", locale=clb.from_user), "nothing")]]))
|
await clb.message.edit(
|
||||||
|
clb.message.text,
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("done", "button", locale=clb.from_user), "nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# Start a new application when user reapplies after leaving the chat
|
# Start a new application when user reapplies after leaving the chat
|
||||||
@app.on_callback_query(filters.regex("reapply_new_[\s\S]*"))
|
@app.on_callback_query(filters.regex("reapply_new_[\s\S]*"))
|
||||||
async def callback_query_reapply_new(app: Client, clb: CallbackQuery):
|
async def callback_query_reapply_new(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
|
|
||||||
holo_user = HoloUser(clb.from_user)
|
holo_user = HoloUser(clb.from_user)
|
||||||
|
|
||||||
if holo_user.sponsorship_state()[0] == "fill":
|
if holo_user.sponsorship_state()[0] == "fill":
|
||||||
await clb.message.reply_text(locale("finish_sponsorship", "message"), quote=False)
|
await clb.message.reply_text(
|
||||||
|
locale("finish_sponsorship", "message"), quote=False
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
await clb.answer(locale("reapply_stopped", "callback", locale=clb.from_user))
|
await clb.answer(locale("reapply_stopped", "callback", locale=clb.from_user))
|
||||||
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
||||||
col_tmp.update_one({"user": clb.from_user.id, "type": "application"}, {"$set": {"state": "fill", "completed": False, "stage": 1}})
|
col_tmp.update_one(
|
||||||
|
{"user": clb.from_user.id, "type": "application"},
|
||||||
|
{"$set": {"state": "fill", "completed": False, "stage": 1}},
|
||||||
|
)
|
||||||
holo_user.application_restart(reapply=True)
|
holo_user.application_restart(reapply=True)
|
||||||
await welcome_pass(app, message, once_again=True)
|
await welcome_pass(app, message, once_again=True)
|
||||||
logWrite(f"User {clb.from_user.id} restarted the application after leaving the chat earlier")
|
logWrite(
|
||||||
await clb.message.edit(clb.message.text, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("done", "button", locale=clb.from_user), "nothing")]]))
|
f"User {clb.from_user.id} restarted the application after leaving the chat earlier"
|
||||||
|
)
|
||||||
|
await clb.message.edit(
|
||||||
|
clb.message.text,
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("done", "button", locale=clb.from_user), "nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# Abort application fill in progress and restart it
|
# Abort application fill in progress and restart it
|
||||||
@app.on_callback_query(filters.regex("reapply_stop_[\s\S]*"))
|
@app.on_callback_query(filters.regex("reapply_stop_[\s\S]*"))
|
||||||
async def callback_query_reapply_stop(app: Client, clb: CallbackQuery):
|
async def callback_query_reapply_stop(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(clb.from_user)
|
holo_user = HoloUser(clb.from_user)
|
||||||
|
|
||||||
@ -142,5 +281,10 @@ async def callback_query_reapply_stop(app: Client, clb: CallbackQuery):
|
|||||||
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
||||||
await welcome_pass(app, message, once_again=True)
|
await welcome_pass(app, message, once_again=True)
|
||||||
logWrite(f"User {clb.from_user.id} restarted the application due to typo in it")
|
logWrite(f"User {clb.from_user.id} restarted the application due to typo in it")
|
||||||
await clb.message.edit(locale("reapply_restarted", "message", locale=holo_user), reply_markup=ReplyKeyboardRemove())
|
await clb.message.edit(
|
||||||
|
locale("reapply_restarted", "message", locale=holo_user),
|
||||||
|
reply_markup=ReplyKeyboardRemove(),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -6,10 +6,10 @@ from pyrogram import filters
|
|||||||
from modules.utils import locale, logWrite
|
from modules.utils import locale, logWrite
|
||||||
from modules.commands.rules import DefaultRulesMarkup
|
from modules.commands.rules import DefaultRulesMarkup
|
||||||
|
|
||||||
|
|
||||||
# Callback rule ================================================================================================================
|
# Callback rule ================================================================================================================
|
||||||
@app.on_callback_query(filters.regex("rule_[\s\S]*"))
|
@app.on_callback_query(filters.regex("rule_[\s\S]*"))
|
||||||
async def callback_query_rule(app: Client, clb: CallbackQuery):
|
async def callback_query_rule(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
|
|
||||||
logWrite(f"User {clb.from_user.id} requested to check out rule {fullclb[1]}")
|
logWrite(f"User {clb.from_user.id} requested to check out rule {fullclb[1]}")
|
||||||
@ -18,55 +18,88 @@ async def callback_query_rule(app: Client, clb: CallbackQuery):
|
|||||||
|
|
||||||
if rule_num == len(locale("rules")):
|
if rule_num == len(locale("rules")):
|
||||||
lower_buttons = [
|
lower_buttons = [
|
||||||
InlineKeyboardButton(locale("rules_prev", "button", locale=clb.from_user), callback_data=f"rule_{rule_num-1}")
|
InlineKeyboardButton(
|
||||||
|
locale("rules_prev", "button", locale=clb.from_user),
|
||||||
|
callback_data=f"rule_{rule_num-1}",
|
||||||
|
)
|
||||||
]
|
]
|
||||||
elif rule_num == 1:
|
elif rule_num == 1:
|
||||||
lower_buttons = [
|
lower_buttons = [
|
||||||
InlineKeyboardButton(locale("rules_next", "button", locale=clb.from_user), callback_data=f"rule_{rule_num+1}")
|
InlineKeyboardButton(
|
||||||
|
locale("rules_next", "button", locale=clb.from_user),
|
||||||
|
callback_data=f"rule_{rule_num+1}",
|
||||||
|
)
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
lower_buttons = [
|
lower_buttons = [
|
||||||
InlineKeyboardButton(locale("rules_prev", "button", locale=clb.from_user), callback_data=f"rule_{rule_num-1}"),
|
InlineKeyboardButton(
|
||||||
InlineKeyboardButton(locale("rules_next", "button", locale=clb.from_user), callback_data=f"rule_{rule_num+1}")
|
locale("rules_prev", "button", locale=clb.from_user),
|
||||||
|
callback_data=f"rule_{rule_num-1}",
|
||||||
|
),
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("rules_next", "button", locale=clb.from_user),
|
||||||
|
callback_data=f"rule_{rule_num+1}",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await clb.message.edit(text=locale("rules", locale=clb.from_user)[rule_num-1], disable_web_page_preview=True, reply_markup=InlineKeyboardMarkup(
|
await clb.message.edit(
|
||||||
|
text=locale("rules", locale=clb.from_user)[rule_num - 1],
|
||||||
|
disable_web_page_preview=True,
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("rules_home", "button", locale=clb.from_user), callback_data="rules_home"),
|
InlineKeyboardButton(
|
||||||
InlineKeyboardButton(locale("rules_additional", "button", locale=clb.from_user), callback_data="rules_additional")
|
locale("rules_home", "button", locale=clb.from_user),
|
||||||
|
callback_data="rules_home",
|
||||||
|
),
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("rules_additional", "button", locale=clb.from_user),
|
||||||
|
callback_data="rules_additional",
|
||||||
|
),
|
||||||
],
|
],
|
||||||
lower_buttons
|
lower_buttons,
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
except bad_request_400.MessageNotModified:
|
except bad_request_400.MessageNotModified:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
await clb.answer(text=locale("rules_page", "callback", locale=clb.from_user).format(fullclb[1]))
|
await clb.answer(
|
||||||
|
text=locale("rules_page", "callback", locale=clb.from_user).format(fullclb[1])
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("rules_home"))
|
@app.on_callback_query(filters.regex("rules_home"))
|
||||||
async def callback_query_rules_home(app: Client, clb: CallbackQuery):
|
async def callback_query_rules_home(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
logWrite(f"User {clb.from_user.id} requested to check out homepage rules")
|
logWrite(f"User {clb.from_user.id} requested to check out homepage rules")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await clb.message.edit(text=locale("rules_msg", locale=clb.from_user), disable_web_page_preview=True, reply_markup=DefaultRulesMarkup(clb.from_user).keyboard)
|
await clb.message.edit(
|
||||||
|
text=locale("rules_msg", locale=clb.from_user),
|
||||||
|
disable_web_page_preview=True,
|
||||||
|
reply_markup=DefaultRulesMarkup(clb.from_user).keyboard,
|
||||||
|
)
|
||||||
except bad_request_400.MessageNotModified:
|
except bad_request_400.MessageNotModified:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
await clb.answer(text=locale("rules_home", "callback", locale=clb.from_user))
|
await clb.answer(text=locale("rules_home", "callback", locale=clb.from_user))
|
||||||
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("rules_additional"))
|
@app.on_callback_query(filters.regex("rules_additional"))
|
||||||
async def callback_query_rules_additional(app: Client, clb: CallbackQuery):
|
async def callback_query_rules_additional(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
logWrite(f"User {clb.from_user.id} requested to check out additional rules")
|
logWrite(f"User {clb.from_user.id} requested to check out additional rules")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await clb.message.edit(text=locale("rules_additional", locale=clb.from_user), disable_web_page_preview=True, reply_markup=DefaultRulesMarkup(clb.from_user).keyboard)
|
await clb.message.edit(
|
||||||
|
text=locale("rules_additional", locale=clb.from_user),
|
||||||
|
disable_web_page_preview=True,
|
||||||
|
reply_markup=DefaultRulesMarkup(clb.from_user).keyboard,
|
||||||
|
)
|
||||||
except bad_request_400.MessageNotModified:
|
except bad_request_400.MessageNotModified:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
await clb.answer(text=locale("rules_additional", "callback", locale=clb.from_user))
|
await clb.answer(text=locale("rules_additional", "callback", locale=clb.from_user))
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -8,29 +8,78 @@ from bson.objectid import ObjectId
|
|||||||
|
|
||||||
from modules.utils import configGet, jsonLoad, locale
|
from modules.utils import configGet, jsonLoad, locale
|
||||||
|
|
||||||
|
|
||||||
# Callback sid =================================================================================================================
|
# Callback sid =================================================================================================================
|
||||||
@app.on_callback_query(filters.regex("sid_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sid_[\s\S]*"))
|
||||||
async def callback_query_sid(app: Client, clb: CallbackQuery):
|
async def callback_query_sid(app: Client, clb: CallbackQuery):
|
||||||
await clb.answer(url=f'https://t.me/{(await app.get_me()).username}?start={clb.data.split("_")[1]}')
|
await clb.answer(
|
||||||
|
url=f'https://t.me/{(await app.get_me()).username}?start={clb.data.split("_")[1]}'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
||||||
|
|
||||||
|
|
||||||
# Callback shc =================================================================================================================
|
# Callback shc =================================================================================================================
|
||||||
@app.on_callback_query(filters.regex("shc_[\s\S]*"))
|
@app.on_callback_query(filters.regex("shc_[\s\S]*"))
|
||||||
async def callback_query_shc(app: Client, clb: CallbackQuery):
|
async def callback_query_shc(app: Client, clb: CallbackQuery):
|
||||||
|
if clb.from_user.id not in jsonLoad(
|
||||||
if (clb.from_user.id not in jsonLoad(path.join(configGet("cache", "locations"), "group_members"))):
|
path.join(configGet("cache", "locations"), "group_members")
|
||||||
await clb.answer(locale("spoiler_forbidden", "callback", locale=clb.from_user), show_alert=True)
|
):
|
||||||
|
await clb.answer(
|
||||||
|
locale("spoiler_forbidden", "callback", locale=clb.from_user),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
spoil = col_spoilers.find_one( {"_id": ObjectId(clb.data.split("_")[1])} )
|
spoil = col_spoilers.find_one({"_id": ObjectId(clb.data.split("_")[1])})
|
||||||
|
|
||||||
if spoil["description"] == "":
|
if spoil["description"] == "":
|
||||||
desc = locale("spoiler_empty_named", "message", locale=clb.from_user).format(locale(spoil["category"], "message", "spoiler_categories"), clb.from_user.first_name)
|
desc = locale("spoiler_empty_named", "message", locale=clb.from_user).format(
|
||||||
|
locale(spoil["category"], "message", "spoiler_categories"),
|
||||||
|
clb.from_user.first_name,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
desc = locale("spoiler_described_named", "message", locale=clb.from_user).format(locale(spoil["category"], "message", "spoiler_categories"), clb.from_user.first_name, spoil["description"])
|
desc = locale(
|
||||||
|
"spoiler_described_named", "message", locale=clb.from_user
|
||||||
|
).format(
|
||||||
|
locale(spoil["category"], "message", "spoiler_categories"),
|
||||||
|
clb.from_user.first_name,
|
||||||
|
spoil["description"],
|
||||||
|
)
|
||||||
|
|
||||||
|
await app.send_message(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
desc,
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("spoiler_view", "button", locale=clb.from_user),
|
||||||
|
callback_data=f'sid_{clb.data.split("_")[1]}',
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
configGet("admin", "groups"),
|
||||||
|
desc,
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("spoiler_view", "button", locale=clb.from_user),
|
||||||
|
callback_data=f'sid_{clb.data.split("_")[1]}',
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
await clb.answer(
|
||||||
|
locale("spoiler_sent", "callback", locale=clb.from_user), show_alert=True
|
||||||
|
)
|
||||||
|
|
||||||
await app.send_message(configGet("users", "groups"), desc, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_view", "button", locale=clb.from_user), callback_data=f'sid_{clb.data.split("_")[1]}')]]))
|
|
||||||
await app.send_message(configGet("admin", "groups"), desc, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_view", "button", locale=clb.from_user), callback_data=f'sid_{clb.data.split("_")[1]}')]]))
|
|
||||||
|
|
||||||
await clb.answer(locale("spoiler_sent", "callback", locale=clb.from_user), show_alert=True)
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -1,6 +1,11 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from app import app
|
from app import app
|
||||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ForceReply, CallbackQuery
|
from pyrogram.types import (
|
||||||
|
InlineKeyboardMarkup,
|
||||||
|
InlineKeyboardButton,
|
||||||
|
ForceReply,
|
||||||
|
CallbackQuery,
|
||||||
|
)
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from classes.errors.holo_user import LabelSettingError
|
from classes.errors.holo_user import LabelSettingError
|
||||||
@ -8,46 +13,79 @@ from classes.holo_user import HoloUser
|
|||||||
from modules.utils import configGet, locale, logWrite, should_quote
|
from modules.utils import configGet, locale, logWrite, should_quote
|
||||||
from modules.database import col_tmp, col_sponsorships
|
from modules.database import col_tmp, col_sponsorships
|
||||||
|
|
||||||
|
|
||||||
# Callbacks sponsorship ========================================================================================================
|
# Callbacks sponsorship ========================================================================================================
|
||||||
@app.on_callback_query(filters.regex("sponsor_apply_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sponsor_apply_[\s\S]*"))
|
||||||
async def callback_query_sponsor_apply(app: Client, clb: CallbackQuery):
|
async def callback_query_sponsor_apply(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
if holo_user.application_state()[0] == "fill":
|
if holo_user.application_state()[0] == "fill":
|
||||||
await clb.message.reply_text(locale("finish_application", "message"), quote=should_quote(clb.message))
|
await clb.message.reply_text(
|
||||||
|
locale("finish_application", "message"), quote=should_quote(clb.message)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} applied for sponsorship")
|
logWrite(f"User {holo_user.id} applied for sponsorship")
|
||||||
|
|
||||||
holo_user.sponsorship_restart()
|
holo_user.sponsorship_restart()
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("sponsor_started", "button")), callback_data="nothing")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("sponsor_started", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
await clb.message.edit(
|
||||||
|
text=locale("sponsorship_applying", "message", locale=holo_user),
|
||||||
|
reply_markup=InlineKeyboardMarkup(edited_markup),
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
holo_user.id,
|
||||||
|
locale(f"sponsor1", "message", locale=holo_user),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(locale(f"sponsor1", "force_reply", locale=holo_user.locale))
|
||||||
|
),
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sponsor_started", "callback", locale=holo_user).format(
|
||||||
|
holo_user.id
|
||||||
|
),
|
||||||
|
show_alert=False,
|
||||||
|
)
|
||||||
|
|
||||||
await clb.message.edit(text=locale("sponsorship_applying", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup(edited_markup))
|
|
||||||
await app.send_message(holo_user.id, locale(f"sponsor1", "message", locale=holo_user), reply_markup=ForceReply(placeholder=str(locale(f"sponsor1", "force_reply", locale=holo_user.locale))))
|
|
||||||
await clb.answer(text=locale("sponsor_started", "callback", locale=holo_user).format(holo_user.id), show_alert=False)
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("sponsor_yes_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sponsor_yes_[\s\S]*"))
|
||||||
async def callback_query_sponsor_yes(app: Client, clb: CallbackQuery):
|
async def callback_query_sponsor_yes(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("sponsor_approved_by", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
await app.send_message(holo_user.id, locale("sponsor_approved", "message", locale=holo_user))
|
configGet("admin", "groups"),
|
||||||
|
locale("sponsor_approved_by", "message").format(
|
||||||
|
clb.from_user.first_name, holo_user.id
|
||||||
|
),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
holo_user.id, locale("sponsor_approved", "message", locale=holo_user)
|
||||||
|
)
|
||||||
logWrite(f"User {holo_user.id} got sponsorship approved by {clb.from_user.id}")
|
logWrite(f"User {holo_user.id} got sponsorship approved by {clb.from_user.id}")
|
||||||
|
|
||||||
if col_sponsorships.find_one({"user": holo_user.id}) is not None:
|
if col_sponsorships.find_one({"user": holo_user.id}) is not None:
|
||||||
col_sponsorships.update_one({"user": holo_user.id},
|
col_sponsorships.update_one(
|
||||||
|
{"user": holo_user.id},
|
||||||
{
|
{
|
||||||
"$set": {
|
"$set": {
|
||||||
"date": datetime.now(),
|
"date": datetime.now(),
|
||||||
"admin": clb.from_user.id,
|
"admin": clb.from_user.id,
|
||||||
"sponsorship": col_tmp.find_one({"user": holo_user.id, "type": "sponsorship"})["sponsorship"]
|
"sponsorship": col_tmp.find_one(
|
||||||
|
{"user": holo_user.id, "type": "sponsorship"}
|
||||||
|
)["sponsorship"],
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
col_sponsorships.insert_one(
|
col_sponsorships.insert_one(
|
||||||
@ -55,49 +93,84 @@ async def callback_query_sponsor_yes(app: Client, clb: CallbackQuery):
|
|||||||
"user": holo_user.id,
|
"user": holo_user.id,
|
||||||
"date": datetime.now(),
|
"date": datetime.now(),
|
||||||
"admin": clb.from_user.id,
|
"admin": clb.from_user.id,
|
||||||
"sponsorship": col_tmp.find_one({"user": holo_user.id, "type": "sponsorship"})["sponsorship"]
|
"sponsorship": col_tmp.find_one(
|
||||||
|
{"user": holo_user.id, "type": "sponsorship"}
|
||||||
|
)["sponsorship"],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
col_tmp.update_one({"user": holo_user.id, "type":"sponsorship"},
|
col_tmp.update_one(
|
||||||
{
|
{"user": holo_user.id, "type": "sponsorship"},
|
||||||
"$set": {
|
{"$set": {"state": "approved", "sent": False}},
|
||||||
"state": "approved",
|
|
||||||
"sent": False
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await holo_user.label_set(configGet("users", "groups"), col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}})["sponsorship"]["label"])
|
await holo_user.label_set(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
col_tmp.find_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "sponsorship"}}
|
||||||
|
)["sponsorship"]["label"],
|
||||||
|
)
|
||||||
except LabelSettingError as exp:
|
except LabelSettingError as exp:
|
||||||
await app.send_message(configGet("admin", "groups"), exp.__str__(), disable_notification=True)
|
await app.send_message(
|
||||||
|
configGet("admin", "groups"), exp.__str__(), disable_notification=True
|
||||||
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("accepted", "button")), callback_data="nothing")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("accepted", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
await app.edit_message_caption(
|
||||||
|
clb.message.chat.id,
|
||||||
|
clb.message.id,
|
||||||
|
caption=clb.message.caption,
|
||||||
|
reply_markup=InlineKeyboardMarkup(edited_markup),
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sponsor_accepted", "callback").format(fullclb[2]), show_alert=False
|
||||||
|
)
|
||||||
|
|
||||||
await app.edit_message_caption(clb.message.chat.id, clb.message.id, caption=clb.message.caption, reply_markup=InlineKeyboardMarkup(edited_markup))
|
|
||||||
await clb.answer(text=locale("sponsor_accepted", "callback").format(fullclb[2]), show_alert=False)
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("sponsor_no_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sponsor_no_[\s\S]*"))
|
||||||
async def callback_query_sponsor_no(app: Client, clb: CallbackQuery):
|
async def callback_query_sponsor_no(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("sponsor_rejected_by", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
await app.send_message(holo_user.id, locale("sponsor_rejected", "message", locale=holo_user))
|
configGet("admin", "groups"),
|
||||||
|
locale("sponsor_rejected_by", "message").format(
|
||||||
|
clb.from_user.first_name, holo_user.id
|
||||||
|
),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
holo_user.id, locale("sponsor_rejected", "message", locale=holo_user)
|
||||||
|
)
|
||||||
logWrite(f"User {holo_user.id} got sponsorship rejected by {clb.from_user.id}")
|
logWrite(f"User {holo_user.id} got sponsorship rejected by {clb.from_user.id}")
|
||||||
|
|
||||||
col_tmp.update_one({"user": holo_user.id, "type": "sponsorship"},
|
col_tmp.update_one(
|
||||||
{
|
{"user": holo_user.id, "type": "sponsorship"},
|
||||||
"$set": {
|
{"$set": {"state": "rejected", "sent": False}},
|
||||||
"state": "rejected",
|
|
||||||
"sent": False
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("declined", "button")), callback_data="nothing")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("declined", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
await app.edit_message_caption(clb.message.chat.id, clb.message.id, caption=clb.message.caption, reply_markup=InlineKeyboardMarkup(edited_markup))
|
await app.edit_message_caption(
|
||||||
await clb.answer(text=locale("sponsor_rejected", "callback").format(fullclb[2]), show_alert=False)
|
clb.message.chat.id,
|
||||||
|
clb.message.id,
|
||||||
|
caption=clb.message.caption,
|
||||||
|
reply_markup=InlineKeyboardMarkup(edited_markup),
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sponsor_rejected", "callback").format(fullclb[2]), show_alert=False
|
||||||
|
)
|
||||||
|
@ -8,14 +8,18 @@ from modules.utils import configGet, locale, logWrite
|
|||||||
from modules.database import col_tmp, col_applications
|
from modules.database import col_tmp, col_applications
|
||||||
from modules.commands.rules import DefaultRulesMarkup
|
from modules.commands.rules import DefaultRulesMarkup
|
||||||
|
|
||||||
|
|
||||||
# Callbacks application ========================================================================================================
|
# Callbacks application ========================================================================================================
|
||||||
@app.on_callback_query(filters.regex("sub_yes_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sub_yes_[\s\S]*"))
|
||||||
async def callback_query_accept(app: Client, clb: CallbackQuery):
|
async def callback_query_accept(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("approved_by", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
|
configGet("admin", "groups"),
|
||||||
|
locale("approved_by", "message").format(clb.from_user.first_name, holo_user.id),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
logWrite(f"User {holo_user.id} got approved by {clb.from_user.id}")
|
logWrite(f"User {holo_user.id} got approved by {clb.from_user.id}")
|
||||||
|
|
||||||
need_link = True
|
need_link = True
|
||||||
@ -25,63 +29,165 @@ async def callback_query_accept(app: Client, clb: CallbackQuery):
|
|||||||
need_link = False
|
need_link = False
|
||||||
|
|
||||||
if need_link:
|
if need_link:
|
||||||
link = await app.create_chat_invite_link(configGet("users", "groups"), name=f"Invite for {holo_user.id}", member_limit=1) #, expire_date=datetime.now()+timedelta(days=1))
|
link = await app.create_chat_invite_link(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
name=f"Invite for {holo_user.id}",
|
||||||
|
member_limit=1,
|
||||||
|
) # , expire_date=datetime.now()+timedelta(days=1))
|
||||||
|
|
||||||
await app.send_message(holo_user.id, locale("read_rules", "message", locale=holo_user))
|
await app.send_message(
|
||||||
|
holo_user.id, locale("read_rules", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
|
||||||
await app.send_message(holo_user.id, locale("rules_msg", locale=holo_user), disable_web_page_preview=True, reply_markup=DefaultRulesMarkup(holo_user).keyboard)
|
await app.send_message(
|
||||||
|
holo_user.id,
|
||||||
|
locale("rules_msg", locale=holo_user),
|
||||||
|
disable_web_page_preview=True,
|
||||||
|
reply_markup=DefaultRulesMarkup(holo_user).keyboard,
|
||||||
|
)
|
||||||
|
|
||||||
await app.send_message(holo_user.id, locale("approved", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup(
|
await app.send_message(
|
||||||
[[
|
holo_user.id,
|
||||||
InlineKeyboardButton(str(locale("join", "button", locale=holo_user)), url=link.invite_link)
|
locale("approved", "message", locale=holo_user),
|
||||||
]]
|
reply_markup=InlineKeyboardMarkup(
|
||||||
))
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
str(locale("join", "button", locale=holo_user)),
|
||||||
|
url=link.invite_link,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
holo_user.set("link", link.invite_link)
|
holo_user.set("link", link.invite_link)
|
||||||
logWrite(f"User {holo_user.id} got an invite link {link.invite_link}")
|
logWrite(f"User {holo_user.id} got an invite link {link.invite_link}")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await app.send_message(holo_user.id, locale("approved_joined", "message", locale=holo_user))
|
await app.send_message(
|
||||||
|
holo_user.id, locale("approved_joined", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
|
||||||
col_applications.insert_one({"user": holo_user.id, "date": datetime.now(), "admin": clb.from_user.id, "application": col_tmp.find_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}})["application"]})
|
col_applications.insert_one(
|
||||||
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}, {"$set": {"state": "approved", "sent": False}})
|
{
|
||||||
|
"user": holo_user.id,
|
||||||
|
"date": datetime.now(),
|
||||||
|
"admin": clb.from_user.id,
|
||||||
|
"application": col_tmp.find_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}
|
||||||
|
)["application"],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
col_tmp.update_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}},
|
||||||
|
{"$set": {"state": "approved", "sent": False}},
|
||||||
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("accepted", "button")), callback_data="nothing")]]
|
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", locale=clb.from_user).format(
|
||||||
|
holo_user.id
|
||||||
|
),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
|
|
||||||
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
|
|
||||||
await clb.answer(text=locale("sub_accepted", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("sub_no_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sub_no_[\s\S]*"))
|
||||||
async def callback_query_reject(app: Client, clb: CallbackQuery):
|
async def callback_query_reject(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("rejected_by", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
await app.send_message(holo_user.id, locale("rejected", "message", locale=holo_user))
|
configGet("admin", "groups"),
|
||||||
|
locale("rejected_by", "message").format(clb.from_user.first_name, holo_user.id),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
holo_user.id, locale("rejected", "message", locale=holo_user)
|
||||||
|
)
|
||||||
logWrite(f"User {holo_user.id} got rejected by {clb.from_user.id}")
|
logWrite(f"User {holo_user.id} got rejected by {clb.from_user.id}")
|
||||||
|
|
||||||
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}, {"$set": {"state": "rejected", "sent": False}})
|
col_tmp.update_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}},
|
||||||
|
{"$set": {"state": "rejected", "sent": False}},
|
||||||
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("declined", "button")), callback_data="nothing")], [InlineKeyboardButton(text=str(locale("ban", "button")), callback_data=f"ban_{fullclb[2]}")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("declined", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("ban", "button")), callback_data=f"ban_{fullclb[2]}"
|
||||||
|
)
|
||||||
|
],
|
||||||
|
]
|
||||||
|
|
||||||
|
await clb.message.edit(
|
||||||
|
text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup)
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sub_rejected", "callback", locale=clb.from_user).format(
|
||||||
|
holo_user.id
|
||||||
|
),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
|
|
||||||
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
|
|
||||||
await clb.answer(text=locale("sub_rejected", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("sub_russian_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sub_russian_[\s\S]*"))
|
||||||
async def callback_query_reject_russian(app: Client, clb: CallbackQuery):
|
async def callback_query_reject_russian(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("rejected_by_rus", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
await app.send_message(holo_user.id, locale("rejected_russian", "message", locale=holo_user))
|
configGet("admin", "groups"),
|
||||||
logWrite(f"User {holo_user.id} got rejected by {clb.from_user.id} due to being russian")
|
locale("rejected_by_rus", "message").format(
|
||||||
|
clb.from_user.first_name, holo_user.id
|
||||||
|
),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
holo_user.id, locale("rejected_russian", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"User {holo_user.id} got rejected by {clb.from_user.id} due to being russian"
|
||||||
|
)
|
||||||
|
|
||||||
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}, {"$set": {"state": "rejected", "sent": False}})
|
col_tmp.update_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}},
|
||||||
|
{"$set": {"state": "rejected", "sent": False}},
|
||||||
|
)
|
||||||
|
|
||||||
|
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_russian", "callback", locale=clb.from_user).format(
|
||||||
|
holo_user.id
|
||||||
|
),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
|
|
||||||
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_russian", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -1,49 +1,104 @@
|
|||||||
from app import app
|
from app import app
|
||||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ChatPermissions, CallbackQuery
|
from pyrogram.types import (
|
||||||
|
InlineKeyboardMarkup,
|
||||||
|
InlineKeyboardButton,
|
||||||
|
ChatPermissions,
|
||||||
|
CallbackQuery,
|
||||||
|
)
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from modules.utils import configGet, locale, logWrite
|
from modules.utils import configGet, locale, logWrite
|
||||||
from modules.database import col_tmp
|
from modules.database import col_tmp
|
||||||
|
|
||||||
|
|
||||||
# Callbacks sus users ==========================================================================================================
|
# Callbacks sus users ==========================================================================================================
|
||||||
@app.on_callback_query(filters.regex("sus_allow_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sus_allow_[\s\S]*"))
|
||||||
async def callback_query_sus_allow(app: Client, clb: CallbackQuery):
|
async def callback_query_sus_allow(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("sus_allowed_by", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
logWrite(f"User {holo_user.id} was allowed to join with another link by {clb.from_user.id}")
|
configGet("admin", "groups"),
|
||||||
|
locale("sus_allowed_by", "message").format(
|
||||||
|
clb.from_user.first_name, holo_user.id
|
||||||
|
),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"User {holo_user.id} was allowed to join with another link by {clb.from_user.id}"
|
||||||
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("sus_allowed", "button")), callback_data="nothing")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("sus_allowed", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
|
await clb.message.edit(
|
||||||
await clb.answer(text=locale("sus_allowed", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup)
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sus_allowed", "callback", locale=clb.from_user).format(
|
||||||
|
holo_user.id
|
||||||
|
),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
|
|
||||||
await app.restrict_chat_member(configGet("users", "groups"), holo_user.id, permissions=ChatPermissions(
|
await app.restrict_chat_member(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
holo_user.id,
|
||||||
|
permissions=ChatPermissions(
|
||||||
can_send_messages=True,
|
can_send_messages=True,
|
||||||
can_send_media_messages=True,
|
can_send_media_messages=True,
|
||||||
can_send_other_messages=True,
|
can_send_other_messages=True,
|
||||||
can_send_polls=True
|
can_send_polls=True,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("sus_reject_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sus_reject_[\s\S]*"))
|
||||||
async def callback_query_sus_reject(app: Client, clb: CallbackQuery):
|
async def callback_query_sus_reject(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(int(fullclb[2]))
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("sus_rejected_by", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
await app.send_message(
|
||||||
logWrite(f"User {holo_user.id} was rejected to join with another link by {clb.from_user.id}")
|
configGet("admin", "groups"),
|
||||||
|
locale("sus_rejected_by", "message").format(
|
||||||
|
clb.from_user.first_name, holo_user.id
|
||||||
|
),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"User {holo_user.id} was rejected to join with another link by {clb.from_user.id}"
|
||||||
|
)
|
||||||
|
|
||||||
edited_markup = [[InlineKeyboardButton(text=str(locale("sus_rejected", "button")), callback_data="nothing")]]
|
edited_markup = [
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("sus_rejected", "button")), callback_data="nothing"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
|
await clb.message.edit(
|
||||||
await clb.answer(text=locale("sus_rejected", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup)
|
||||||
|
)
|
||||||
|
await clb.answer(
|
||||||
|
text=locale("sus_rejected", "callback", locale=clb.from_user).format(
|
||||||
|
holo_user.id
|
||||||
|
),
|
||||||
|
show_alert=True,
|
||||||
|
)
|
||||||
|
|
||||||
await app.ban_chat_member(configGet("users", "groups"), holo_user.id)
|
await app.ban_chat_member(configGet("users", "groups"), holo_user.id)
|
||||||
|
|
||||||
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}, {"$set": {"state": "rejected", "sent": False}})
|
col_tmp.update_one(
|
||||||
|
{"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}},
|
||||||
|
{"$set": {"state": "rejected", "sent": False}},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -12,51 +12,92 @@ from dateutil.relativedelta import relativedelta
|
|||||||
from modules.database import col_applications
|
from modules.database import col_applications
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
|
|
||||||
# Application command ==========================================================================================================
|
# Application command ==========================================================================================================
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.command(["application"], prefixes=["/"]) & custom_filters.admin)
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command(["application"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
async def cmd_application(app: Client, msg: Message):
|
async def cmd_application(app: Client, msg: Message):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
holo_user = HoloUser(int(msg.command[1]))
|
holo_user = HoloUser(int(msg.command[1]))
|
||||||
except (ValueError, UserNotFoundError):
|
except (ValueError, UserNotFoundError):
|
||||||
try:
|
try:
|
||||||
holo_user = HoloUser((await app.get_users(msg.command[1])).id)
|
holo_user = HoloUser((await app.get_users(msg.command[1])).id)
|
||||||
except (bad_request_400.UsernameInvalid, bad_request_400.PeerIdInvalid, bad_request_400.UsernameNotOccupied):
|
except (
|
||||||
await msg.reply_text(locale("no_user_application", "message", locale=msg.from_user).format(msg.command[1]), quote=should_quote(msg))
|
bad_request_400.UsernameInvalid,
|
||||||
|
bad_request_400.PeerIdInvalid,
|
||||||
|
bad_request_400.UsernameNotOccupied,
|
||||||
|
):
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(
|
||||||
|
"no_user_application", "message", locale=msg.from_user
|
||||||
|
).format(msg.command[1]),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
application = col_applications.find_one({"user": holo_user.id})
|
application = col_applications.find_one({"user": holo_user.id})
|
||||||
|
|
||||||
if application is None:
|
if application is None:
|
||||||
logWrite(f"User {msg.from_user.id} requested application of {holo_user.id} but user does not exists")
|
logWrite(
|
||||||
await msg.reply_text(locale("user_invalid", "message", locale=msg.from_user), quote=should_quote(msg))
|
f"User {msg.from_user.id} requested application of {holo_user.id} but user does not exists"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("user_invalid", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
application_content = []
|
application_content = []
|
||||||
i = 1
|
i = 1
|
||||||
|
|
||||||
for question in application['application']:
|
for question in application["application"]:
|
||||||
|
|
||||||
if i == 2:
|
if i == 2:
|
||||||
age = relativedelta(datetime.now(), application['application']['2'])
|
age = relativedelta(datetime.now(), application["application"]["2"])
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)"
|
||||||
|
)
|
||||||
elif i == 3:
|
elif i == 3:
|
||||||
if application['application']['3']['countryCode'] == "UA":
|
if application["application"]["3"]["countryCode"] == "UA":
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application']['3']['name']}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application']['3']['name']}"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application'][question]}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=msg.from_user)} {application['application'][question]}"
|
||||||
|
)
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
application_status = locale("application_status_accepted", "message", locale=msg.from_user).format((await app.get_users(application["admin"])).first_name, application["date"].strftime("%d.%m.%Y, %H:%M"))
|
application_status = locale(
|
||||||
|
"application_status_accepted", "message", locale=msg.from_user
|
||||||
|
).format(
|
||||||
|
(await app.get_users(application["admin"])).first_name,
|
||||||
|
application["date"].strftime("%d.%m.%Y, %H:%M"),
|
||||||
|
)
|
||||||
|
|
||||||
logWrite(f"User {msg.from_user.id} requested application of {holo_user.id}")
|
logWrite(f"User {msg.from_user.id} requested application of {holo_user.id}")
|
||||||
await msg.reply_text(locale("contact", "message", locale=msg.from_user).format(holo_user.id, "\n".join(application_content), application_status), parse_mode=ParseMode.MARKDOWN, quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("contact", "message", locale=msg.from_user).format(
|
||||||
|
holo_user.id, "\n".join(application_content), application_status
|
||||||
|
),
|
||||||
|
parse_mode=ParseMode.MARKDOWN,
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
|
|
||||||
except IndexError:
|
except IndexError:
|
||||||
await msg.reply_text(locale("application_invalid_syntax", "message", locale=msg.from_user), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("application_invalid_syntax", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -10,10 +10,15 @@ from modules.utils import should_quote, jsonSave
|
|||||||
from modules.database import col_applications
|
from modules.database import col_applications
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Applications command =========================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.command(["applications"], prefixes=["/"]) & custom_filters.admin)
|
|
||||||
async def cmd_applications(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Applications command =========================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command(["applications"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
|
async def cmd_applications(app: Client, msg: Message):
|
||||||
logWrite(f"Admin {msg.from_user.id} requested export of a database")
|
logWrite(f"Admin {msg.from_user.id} requested export of a database")
|
||||||
await app.send_chat_action(msg.chat.id, ChatAction.UPLOAD_DOCUMENT)
|
await app.send_chat_action(msg.chat.id, ChatAction.UPLOAD_DOCUMENT)
|
||||||
filename = uuid1()
|
filename = uuid1()
|
||||||
@ -21,10 +26,18 @@ async def cmd_applications(app: Client, msg: Message):
|
|||||||
for entry in col_applications.find():
|
for entry in col_applications.find():
|
||||||
del entry["_id"]
|
del entry["_id"]
|
||||||
entry["date"] = entry["date"].strftime("%d.%m.%Y, %H:%M")
|
entry["date"] = entry["date"].strftime("%d.%m.%Y, %H:%M")
|
||||||
entry["application"]["2"] = entry["application"]["2"].strftime("%d.%m.%Y, %H:%M")
|
entry["application"]["2"] = entry["application"]["2"].strftime(
|
||||||
|
"%d.%m.%Y, %H:%M"
|
||||||
|
)
|
||||||
output.append(entry)
|
output.append(entry)
|
||||||
makedirs("tmp", exist_ok=True)
|
makedirs("tmp", exist_ok=True)
|
||||||
jsonSave(output, f"tmp{sep}{filename}.json")
|
jsonSave(output, f"tmp{sep}{filename}.json")
|
||||||
await msg.reply_document(document=f"tmp{sep}{filename}.json", file_name="applications", quote=should_quote(msg))
|
await msg.reply_document(
|
||||||
|
document=f"tmp{sep}{filename}.json",
|
||||||
|
file_name="applications",
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
remove(f"tmp{sep}{filename}.json")
|
remove(f"tmp{sep}{filename}.json")
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -6,14 +6,30 @@ from modules.utils import should_quote, logWrite, locale
|
|||||||
from modules.database import col_tmp, col_spoilers, col_applications
|
from modules.database import col_tmp, col_spoilers, col_applications
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
|
|
||||||
# Cancel command ===============================================================================================================
|
# Cancel command ===============================================================================================================
|
||||||
@app.on_message((custom_filters.enabled_applications | custom_filters.enabled_sponsorships) & ~filters.scheduled & filters.command("cancel", prefixes=["/"]) & ~custom_filters.banned)
|
@app.on_message(
|
||||||
|
(custom_filters.enabled_applications | custom_filters.enabled_sponsorships)
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command("cancel", prefixes=["/"])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
async def command_cancel(app: Client, msg: Message):
|
async def command_cancel(app: Client, msg: Message):
|
||||||
col_tmp.delete_many( {"user": msg.from_user.id, "sent": False} )
|
col_tmp.delete_many({"user": msg.from_user.id, "sent": False})
|
||||||
col_spoilers.delete_many( {"user": msg.from_user.id, "completed": False} )
|
col_spoilers.delete_many({"user": msg.from_user.id, "completed": False})
|
||||||
if col_applications.find_one( {"user": msg.from_user.id} ) is None:
|
if col_applications.find_one({"user": msg.from_user.id}) is None:
|
||||||
await msg.reply_text(locale("cancel_reapply", "message", locale=msg.from_user), quote=should_quote(msg), reply_markup=ReplyKeyboardRemove())
|
await msg.reply_text(
|
||||||
|
locale("cancel_reapply", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
reply_markup=ReplyKeyboardRemove(),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("cancel", "message", locale=msg.from_user), quote=should_quote(msg), reply_markup=ReplyKeyboardRemove())
|
await msg.reply_text(
|
||||||
|
locale("cancel", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
reply_markup=ReplyKeyboardRemove(),
|
||||||
|
)
|
||||||
logWrite(f"Cancelling all ongoing tmp operations for {msg.from_user.id}")
|
logWrite(f"Cancelling all ongoing tmp operations for {msg.from_user.id}")
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,15 +7,30 @@ from pyrogram.errors import bad_request_400
|
|||||||
from pyrogram.enums.chat_action import ChatAction
|
from pyrogram.enums.chat_action import ChatAction
|
||||||
from classes.errors.holo_user import UserNotFoundError, UserInvalidError
|
from classes.errors.holo_user import UserNotFoundError, UserInvalidError
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from modules.utils import jsonLoad, should_quote, logWrite, locale, download_tmp, create_tmp, find_user
|
from modules.utils import (
|
||||||
|
jsonLoad,
|
||||||
|
should_quote,
|
||||||
|
logWrite,
|
||||||
|
locale,
|
||||||
|
download_tmp,
|
||||||
|
create_tmp,
|
||||||
|
find_user,
|
||||||
|
)
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Identify command =============================================================================================================
|
|
||||||
@app.on_message((custom_filters.enabled_applications | custom_filters.enabled_sponsorships) & ~filters.scheduled & filters.command("identify", prefixes=["/"]) & custom_filters.admin)
|
|
||||||
async def cmd_identify(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Identify command =============================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
(custom_filters.enabled_applications | custom_filters.enabled_sponsorships)
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command("identify", prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
|
async def cmd_identify(app: Client, msg: Message):
|
||||||
if len(msg.command) != 2:
|
if len(msg.command) != 2:
|
||||||
await msg.reply_text(locale("identify_invalid_syntax", "message", locale=msg.from_user))
|
await msg.reply_text(
|
||||||
|
locale("identify_invalid_syntax", "message", locale=msg.from_user)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -23,17 +38,44 @@ async def cmd_identify(app: Client, msg: Message):
|
|||||||
holo_user = HoloUser(int(msg.command[1]))
|
holo_user = HoloUser(int(msg.command[1]))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
holo_user = HoloUser(await find_user(app, msg.command[1]))
|
holo_user = HoloUser(await find_user(app, msg.command[1]))
|
||||||
except (UserInvalidError, UserNotFoundError, bad_request_400.UsernameInvalid, bad_request_400.PeerIdInvalid, bad_request_400.UsernameNotOccupied, TypeError):
|
except (
|
||||||
await msg.reply_text(locale("identify_not_found", "message", locale=msg.from_user).format(msg.command[1]))
|
UserInvalidError,
|
||||||
|
UserNotFoundError,
|
||||||
|
bad_request_400.UsernameInvalid,
|
||||||
|
bad_request_400.PeerIdInvalid,
|
||||||
|
bad_request_400.UsernameNotOccupied,
|
||||||
|
TypeError,
|
||||||
|
):
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("identify_not_found", "message", locale=msg.from_user).format(
|
||||||
|
msg.command[1]
|
||||||
|
)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
role = holo_user.label
|
role = holo_user.label
|
||||||
has_application = locale("yes", "message", locale=msg.from_user) if holo_user.application_approved() is True else locale("no", "message", locale=msg.from_user)
|
has_application = (
|
||||||
has_sponsorship = locale("yes", "message", locale=msg.from_user) if holo_user.sponsorship_valid() is True else locale("no", "message", locale=msg.from_user)
|
locale("yes", "message", locale=msg.from_user)
|
||||||
|
if holo_user.application_approved() is True
|
||||||
|
else locale("no", "message", locale=msg.from_user)
|
||||||
|
)
|
||||||
|
has_sponsorship = (
|
||||||
|
locale("yes", "message", locale=msg.from_user)
|
||||||
|
if holo_user.sponsorship_valid() is True
|
||||||
|
else locale("no", "message", locale=msg.from_user)
|
||||||
|
)
|
||||||
|
|
||||||
username = holo_user.username if holo_user.username is not None else "N/A"
|
username = holo_user.username if holo_user.username is not None else "N/A"
|
||||||
in_chat = locale("yes", "message", locale=msg.from_user) if (holo_user.id in jsonLoad(path.join("cache", "group_members"))) else locale("no", "message", locale=msg.from_user)
|
in_chat = (
|
||||||
is_admin = locale("yes", "message", locale=msg.from_user) if (await isAnAdmin(holo_user.id)) else locale("no", "message", locale=msg.from_user)
|
locale("yes", "message", locale=msg.from_user)
|
||||||
|
if (holo_user.id in jsonLoad(path.join("cache", "group_members")))
|
||||||
|
else locale("no", "message", locale=msg.from_user)
|
||||||
|
)
|
||||||
|
is_admin = (
|
||||||
|
locale("yes", "message", locale=msg.from_user)
|
||||||
|
if (await isAnAdmin(holo_user.id))
|
||||||
|
else locale("no", "message", locale=msg.from_user)
|
||||||
|
)
|
||||||
|
|
||||||
output = locale("identify_success", "message", locale=msg.from_user).format(
|
output = locale("identify_success", "message", locale=msg.from_user).format(
|
||||||
holo_user.id,
|
holo_user.id,
|
||||||
@ -43,7 +85,7 @@ async def cmd_identify(app: Client, msg: Message):
|
|||||||
is_admin,
|
is_admin,
|
||||||
role,
|
role,
|
||||||
has_application,
|
has_application,
|
||||||
has_sponsorship
|
has_sponsorship,
|
||||||
)
|
)
|
||||||
|
|
||||||
user = await app.get_users(holo_user.id)
|
user = await app.get_users(holo_user.id)
|
||||||
@ -51,16 +93,17 @@ async def cmd_identify(app: Client, msg: Message):
|
|||||||
if user.photo is not None:
|
if user.photo is not None:
|
||||||
await app.send_chat_action(msg.chat.id, action=ChatAction.UPLOAD_PHOTO)
|
await app.send_chat_action(msg.chat.id, action=ChatAction.UPLOAD_PHOTO)
|
||||||
await msg.reply_photo(
|
await msg.reply_photo(
|
||||||
create_tmp((await download_tmp(app, user.photo.big_file_id))[1], kind="image"),
|
create_tmp(
|
||||||
|
(await download_tmp(app, user.photo.big_file_id))[1], kind="image"
|
||||||
|
),
|
||||||
quote=should_quote(msg),
|
quote=should_quote(msg),
|
||||||
caption=output
|
caption=output,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await app.send_chat_action(msg.chat.id, action=ChatAction.TYPING)
|
await app.send_chat_action(msg.chat.id, action=ChatAction.TYPING)
|
||||||
await msg.reply_text(
|
await msg.reply_text(output, quote=should_quote(msg))
|
||||||
output,
|
|
||||||
quote=should_quote(msg)
|
|
||||||
)
|
|
||||||
|
|
||||||
logWrite(f"User {msg.from_user.id} identified user {holo_user.id}")
|
logWrite(f"User {msg.from_user.id} identified user {holo_user.id}")
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -9,13 +9,28 @@ from classes.holo_user import HoloUser
|
|||||||
|
|
||||||
|
|
||||||
# Issue command ================================================================================================================
|
# Issue command ================================================================================================================
|
||||||
@app.on_message(custom_filters.enabled_general & ~filters.scheduled & filters.private & filters.command(["issue"], prefixes=["/"]) & ~custom_filters.banned)
|
@app.on_message(
|
||||||
|
custom_filters.enabled_general
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(["issue"], prefixes=["/"])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
async def cmd_issue(app: Client, msg: Message):
|
async def cmd_issue(app: Client, msg: Message):
|
||||||
await msg.reply_text(locale("issue", "message", locale=msg.from_user), disable_web_page_preview=True, reply_markup=InlineKeyboardMarkup(
|
await msg.reply_text(
|
||||||
|
locale("issue", "message", locale=msg.from_user),
|
||||||
|
disable_web_page_preview=True,
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("issue", "button", locale=msg.from_user), url=configGet("issues"))
|
InlineKeyboardButton(
|
||||||
|
locale("issue", "button", locale=msg.from_user),
|
||||||
|
url=configGet("issues"),
|
||||||
|
)
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
))
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,10 +7,15 @@ from classes.errors.holo_user import LabelTooLongError, LabelSettingError
|
|||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Label command ================================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.command(["label"], prefixes=["/"]) & custom_filters.admin)
|
|
||||||
async def cmd_label(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Label command ================================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command(["label"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
|
async def cmd_label(app: Client, msg: Message):
|
||||||
if len(msg.command) < 3:
|
if len(msg.command) < 3:
|
||||||
await msg.reply_text("Invalid syntax:\n`/label USER LABEL`")
|
await msg.reply_text("Invalid syntax:\n`/label USER LABEL`")
|
||||||
return
|
return
|
||||||
@ -18,14 +23,15 @@ async def cmd_label(app: Client, msg: Message):
|
|||||||
target = await find_user(app, msg.command[1])
|
target = await find_user(app, msg.command[1])
|
||||||
|
|
||||||
if target is not None:
|
if target is not None:
|
||||||
|
|
||||||
target = HoloUser(target)
|
target = HoloUser(target)
|
||||||
|
|
||||||
label = " ".join(msg.command[2:])
|
label = " ".join(msg.command[2:])
|
||||||
|
|
||||||
if label.lower() == "reset":
|
if label.lower() == "reset":
|
||||||
await target.label_reset(msg.chat)
|
await target.label_reset(msg.chat)
|
||||||
await msg.reply_text(f"Resetting **{target.id}**'s label...", quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
f"Resetting **{target.id}**'s label...", quote=should_quote(msg)
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
@ -34,10 +40,19 @@ async def cmd_label(app: Client, msg: Message):
|
|||||||
await msg.reply_text(locale("label_too_long", "message"))
|
await msg.reply_text(locale("label_too_long", "message"))
|
||||||
return
|
return
|
||||||
except LabelSettingError as exp:
|
except LabelSettingError as exp:
|
||||||
await app.send_message(configGet("admin", "groups"), exp.__str__(), disable_notification=True)
|
await app.send_message(
|
||||||
|
configGet("admin", "groups"),
|
||||||
|
exp.__str__(),
|
||||||
|
disable_notification=True,
|
||||||
|
)
|
||||||
return
|
return
|
||||||
await msg.reply_text(f"Setting **{target.id}**'s label to **{label}**...", quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
f"Setting **{target.id}**'s label to **{label}**...",
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(f"User not found")
|
await msg.reply_text(f"User not found")
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,28 +7,70 @@ from classes.holo_user import HoloUser
|
|||||||
from modules.utils import logWrite, locale, should_quote, find_user
|
from modules.utils import logWrite, locale, should_quote, find_user
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
|
|
||||||
# Message command ==============================================================================================================
|
# Message command ==============================================================================================================
|
||||||
@app.on_message(custom_filters.enabled_general & ~filters.scheduled & filters.command(["message"], prefixes=["/"]) & custom_filters.admin)
|
@app.on_message(
|
||||||
|
custom_filters.enabled_general
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command(["message"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
async def cmd_message(app: Client, msg: Message):
|
async def cmd_message(app: Client, msg: Message):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
destination = HoloUser(int(msg.command[1]))
|
destination = HoloUser(int(msg.command[1]))
|
||||||
except (ValueError, UserInvalidError):
|
except (ValueError, UserInvalidError):
|
||||||
destination = HoloUser(await find_user(app, query=msg.command[1]))
|
destination = HoloUser(await find_user(app, query=msg.command[1]))
|
||||||
|
|
||||||
if ((msg.text is not None) and (len(str(msg.text).split()) > 2)):
|
if (msg.text is not None) and (len(str(msg.text).split()) > 2):
|
||||||
await destination.message(context=msg, text=" ".join(str(msg.text).split()[2:]), caption=msg.caption, photo=msg.photo, video=msg.video, file=msg.document, voice=msg.voice, animation=msg.animation, adm_context=True)
|
await destination.message(
|
||||||
elif ((msg.caption is not None) and (len(msg.caption.split()) > 2)):
|
context=msg,
|
||||||
await destination.message(context=msg, text=str(msg.text), caption=" ".join(msg.caption.split()[2:]), photo=msg.photo, video=msg.video, file=msg.document, voice=msg.voice, animation=msg.animation, adm_context=True)
|
text=" ".join(str(msg.text).split()[2:]),
|
||||||
|
caption=msg.caption,
|
||||||
|
photo=msg.photo,
|
||||||
|
video=msg.video,
|
||||||
|
file=msg.document,
|
||||||
|
voice=msg.voice,
|
||||||
|
animation=msg.animation,
|
||||||
|
adm_context=True,
|
||||||
|
)
|
||||||
|
elif (msg.caption is not None) and (len(msg.caption.split()) > 2):
|
||||||
|
await destination.message(
|
||||||
|
context=msg,
|
||||||
|
text=str(msg.text),
|
||||||
|
caption=" ".join(msg.caption.split()[2:]),
|
||||||
|
photo=msg.photo,
|
||||||
|
video=msg.video,
|
||||||
|
file=msg.document,
|
||||||
|
voice=msg.voice,
|
||||||
|
animation=msg.animation,
|
||||||
|
adm_context=True,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await destination.message(context=msg, text=None, caption=None, photo=msg.photo, video=msg.video, file=msg.document, voice=msg.voice, animation=msg.animation, adm_context=True)
|
await destination.message(
|
||||||
|
context=msg,
|
||||||
|
text=None,
|
||||||
|
caption=None,
|
||||||
|
photo=msg.photo,
|
||||||
|
video=msg.video,
|
||||||
|
file=msg.document,
|
||||||
|
voice=msg.voice,
|
||||||
|
animation=msg.animation,
|
||||||
|
adm_context=True,
|
||||||
|
)
|
||||||
|
|
||||||
except IndexError:
|
except IndexError:
|
||||||
await msg.reply_text(locale("message_invalid_syntax", "message", locale=msg.from_user), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("message_invalid_syntax", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
logWrite(f"Admin {msg.from_user.id} tried to send message but 'IndexError'")
|
logWrite(f"Admin {msg.from_user.id} tried to send message but 'IndexError'")
|
||||||
except ValueError:
|
except ValueError:
|
||||||
await msg.reply_text(locale("message_invalid_syntax", "message", locale=msg.from_user), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("message_invalid_syntax", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
logWrite(f"Admin {msg.from_user.id} tried to send message but 'ValueError'")
|
logWrite(f"Admin {msg.from_user.id} tried to send message but 'ValueError'")
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -11,50 +11,111 @@ from modules.utils import configGet, jsonLoad, locale, should_quote, find_locati
|
|||||||
from modules.database import col_applications, col_users
|
from modules.database import col_applications, col_users
|
||||||
from classes.errors.geo import PlaceNotFoundError
|
from classes.errors.geo import PlaceNotFoundError
|
||||||
|
|
||||||
# Nearby command ===============================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & (filters.private | (filters.chat(configGet("admin", "groups")) | filters.chat(configGet("users", "groups")))) & filters.command(["nearby"], prefixes=["/"]) & (custom_filters.allowed | custom_filters.admin) & ~custom_filters.banned)
|
|
||||||
async def cmd_nearby(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Nearby command ===============================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& (
|
||||||
|
filters.private
|
||||||
|
| (
|
||||||
|
filters.chat(configGet("admin", "groups"))
|
||||||
|
| filters.chat(configGet("users", "groups"))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
& filters.command(["nearby"], prefixes=["/"])
|
||||||
|
& (custom_filters.allowed | custom_filters.admin)
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
|
async def cmd_nearby(app: Client, msg: Message):
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
|
|
||||||
# Check if any place provided
|
# Check if any place provided
|
||||||
if len(msg.command) == 1: # Action if no place provided
|
if len(msg.command) == 1: # Action if no place provided
|
||||||
application = col_applications.find_one({"user": msg.from_user.id})
|
application = col_applications.find_one({"user": msg.from_user.id})
|
||||||
if application is None:
|
if application is None:
|
||||||
await msg.reply_text(locale("nearby_user_empty", "message", locale=holo_user))
|
await msg.reply_text(
|
||||||
|
locale("nearby_user_empty", "message", locale=holo_user)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
location = application["application"]["3"]["location"][0], application["application"]["3"]["location"][1]
|
location = (
|
||||||
else: # Find a place from input query
|
application["application"]["3"]["location"][0],
|
||||||
|
application["application"]["3"]["location"][1],
|
||||||
|
)
|
||||||
|
else: # Find a place from input query
|
||||||
logWrite(f"Looking for the location by query '{' '.join(msg.command[1:])}'")
|
logWrite(f"Looking for the location by query '{' '.join(msg.command[1:])}'")
|
||||||
try:
|
try:
|
||||||
location_coordinates = find_location(" ".join(msg.command[1:]))
|
location_coordinates = find_location(" ".join(msg.command[1:]))
|
||||||
location = float(location_coordinates["lng"]), float(location_coordinates["lat"])
|
location = float(location_coordinates["lng"]), float(
|
||||||
except PlaceNotFoundError: # Place is not found
|
location_coordinates["lat"]
|
||||||
await msg.reply_text(locale("nearby_invalid", "message", locale=holo_user), quote=should_quote(msg))
|
)
|
||||||
|
except PlaceNotFoundError: # Place is not found
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("nearby_invalid", "message", locale=holo_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
except Exception as exp: # Error occurred while finding the place
|
except Exception as exp: # Error occurred while finding the place
|
||||||
await msg.reply_text(locale("nearby_error", "message", locale=holo_user).format(exp, print_exc()), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("nearby_error", "message", locale=holo_user).format(
|
||||||
|
exp, print_exc()
|
||||||
|
),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Find all users registered in the area provided
|
# Find all users registered in the area provided
|
||||||
output = []
|
output = []
|
||||||
applications_nearby = col_applications.find( {"application.3.location": { "$nearSphere": {"$geometry": {"type": "Point", "coordinates": [location[0], location[1]]}, "$maxDistance": configGet("search_radius")*1000} } } )
|
applications_nearby = col_applications.find(
|
||||||
|
{
|
||||||
|
"application.3.location": {
|
||||||
|
"$nearSphere": {
|
||||||
|
"$geometry": {
|
||||||
|
"type": "Point",
|
||||||
|
"coordinates": [location[0], location[1]],
|
||||||
|
},
|
||||||
|
"$maxDistance": configGet("search_radius") * 1000,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
for entry in applications_nearby:
|
for entry in applications_nearby:
|
||||||
if not entry["user"] == msg.from_user.id:
|
if not entry["user"] == msg.from_user.id:
|
||||||
user = col_users.find_one( {"user": entry["user"]} )
|
user = col_users.find_one({"user": entry["user"]})
|
||||||
if user is not None:
|
if user is not None:
|
||||||
if entry["user"] in jsonLoad(path.join(configGet("cache", "locations"), "group_members")):
|
if entry["user"] in jsonLoad(
|
||||||
if user["tg_username"] not in [None, "None", ""]: # Check if user has any name
|
path.join(configGet("cache", "locations"), "group_members")
|
||||||
output.append(f'• **{user["tg_name"]}** (@{user["tg_username"]}):\n - {entry["application"]["3"]["name"]}, {entry["application"]["3"]["adminName1"]}')
|
):
|
||||||
|
if user["tg_username"] not in [
|
||||||
|
None,
|
||||||
|
"None",
|
||||||
|
"",
|
||||||
|
]: # Check if user has any name
|
||||||
|
output.append(
|
||||||
|
f'• **{user["tg_name"]}** (@{user["tg_username"]}):\n - {entry["application"]["3"]["name"]}, {entry["application"]["3"]["adminName1"]}'
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
output.append(f'• **{user["tg_name"]}**:\n - {entry["application"]["3"]["name"]}, {entry["application"]["3"]["adminName1"]}')
|
output.append(
|
||||||
|
f'• **{user["tg_name"]}**:\n - {entry["application"]["3"]["name"]}, {entry["application"]["3"]["adminName1"]}'
|
||||||
|
)
|
||||||
|
|
||||||
logWrite(f"{holo_user.id} tried to find someone nearby {location[1]} {location[0]} in the radius of {configGet('search_radius')} kilometers")
|
logWrite(
|
||||||
|
f"{holo_user.id} tried to find someone nearby {location[1]} {location[0]} in the radius of {configGet('search_radius')} kilometers"
|
||||||
|
)
|
||||||
|
|
||||||
# Check if any users found
|
# Check if any users found
|
||||||
if len(output) > 0:
|
if len(output) > 0:
|
||||||
await msg.reply_text(locale("nearby_result", "message", locale=holo_user).format("\n".join(output)), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("nearby_result", "message", locale=holo_user).format(
|
||||||
|
"\n".join(output)
|
||||||
|
),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("nearby_empty", "message", locale=holo_user), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("nearby_empty", "message", locale=holo_user), quote=should_quote(msg)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -9,18 +9,32 @@ from modules.handlers.welcome import welcome_pass
|
|||||||
from modules.database import col_tmp, col_applications
|
from modules.database import col_tmp, col_applications
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Reapply command ==============================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.private & filters.command(["reapply"], prefixes=["/"]) & ~custom_filters.banned)
|
|
||||||
async def cmd_reapply(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Reapply command ==============================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(["reapply"], prefixes=["/"])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
|
async def cmd_reapply(app: Client, msg: Message):
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
|
|
||||||
# Check if user has approved/rejected tmp application
|
# Check if user has approved/rejected tmp application
|
||||||
if ((holo_user.application_state()[0] in ["approved", "rejected"]) or (holo_user.application_state()[0] == "none")) and holo_user.spoiler_state() is False:
|
if (
|
||||||
|
(holo_user.application_state()[0] in ["approved", "rejected"])
|
||||||
|
or (holo_user.application_state()[0] == "none")
|
||||||
|
) and holo_user.spoiler_state() is False:
|
||||||
# Check if user's tmp application is already completed or even sent
|
# Check if user's tmp application is already completed or even sent
|
||||||
if ((holo_user.application_state()[1] is True) and (not col_tmp.find_one({"user": holo_user.id, "type": "application"})["sent"])) or (holo_user.application_state()[0] == "none"):
|
if (
|
||||||
|
(holo_user.application_state()[1] is True)
|
||||||
|
and (
|
||||||
|
not col_tmp.find_one({"user": holo_user.id, "type": "application"})[
|
||||||
|
"sent"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
) or (holo_user.application_state()[0] == "none"):
|
||||||
left_chat = True
|
left_chat = True
|
||||||
|
|
||||||
async for member in app.get_chat_members(configGet("users", "groups")):
|
async for member in app.get_chat_members(configGet("users", "groups")):
|
||||||
@ -28,64 +42,132 @@ async def cmd_reapply(app: Client, msg: Message):
|
|||||||
left_chat = False
|
left_chat = False
|
||||||
|
|
||||||
if left_chat is True:
|
if left_chat is True:
|
||||||
|
if holo_user.application_state()[
|
||||||
|
1
|
||||||
|
] is True and holo_user.application_state()[0] not in [
|
||||||
|
"fill",
|
||||||
|
"rejected",
|
||||||
|
]:
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("reapply_left_chat", "message", locale=holo_user),
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale(
|
||||||
|
"reapply_old_one",
|
||||||
|
"button",
|
||||||
|
locale=holo_user,
|
||||||
|
),
|
||||||
|
f"reapply_old_{msg.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale(
|
||||||
|
"reapply_new_one",
|
||||||
|
"button",
|
||||||
|
locale=holo_user,
|
||||||
|
),
|
||||||
|
f"reapply_new_{msg.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
if (holo_user.application_state()[1] is True and holo_user.application_state()[0] not in ["fill", "rejected"]):
|
elif (
|
||||||
|
col_tmp.find_one({"user": holo_user.id, "type": "application"})
|
||||||
await msg.reply_text(locale("reapply_left_chat", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup([
|
is None
|
||||||
[
|
and col_applications.find_one({"user": holo_user.id}) is not None
|
||||||
InlineKeyboardButton(locale("reapply_old_one", "button", locale=holo_user), f"reapply_old_{msg.id}")
|
):
|
||||||
],
|
await msg.reply_text(
|
||||||
[
|
locale("reapply_left_chat", "message", locale=holo_user),
|
||||||
InlineKeyboardButton(locale("reapply_new_one", "button", locale=holo_user), f"reapply_new_{msg.id}")
|
reply_markup=InlineKeyboardMarkup(
|
||||||
]
|
[
|
||||||
]))
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
elif col_tmp.find_one({"user": holo_user.id, "type": "application"}) is None and col_applications.find_one({"user": holo_user.id}) is not None:
|
locale(
|
||||||
|
"reapply_old_one",
|
||||||
await msg.reply_text(locale("reapply_left_chat", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup([
|
"button",
|
||||||
[
|
locale=holo_user,
|
||||||
InlineKeyboardButton(locale("reapply_old_one", "button", locale=holo_user), f"reapply_old_{msg.id}")
|
),
|
||||||
],
|
f"reapply_old_{msg.id}",
|
||||||
[
|
)
|
||||||
InlineKeyboardButton(locale("reapply_new_one", "button", locale=holo_user), f"reapply_new_{msg.id}")
|
],
|
||||||
]
|
[
|
||||||
]))
|
InlineKeyboardButton(
|
||||||
|
locale(
|
||||||
|
"reapply_new_one",
|
||||||
|
"button",
|
||||||
|
locale=holo_user,
|
||||||
|
),
|
||||||
|
f"reapply_new_{msg.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
holo_user.application_restart(reapply=True)
|
holo_user.application_restart(reapply=True)
|
||||||
await welcome_pass(app, msg, once_again=True)
|
await welcome_pass(app, msg, once_again=True)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
if holo_user.sponsorship_state()[0] == "fill":
|
if holo_user.sponsorship_state()[0] == "fill":
|
||||||
await msg.reply_text(locale("finish_sponsorship", "message"), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("finish_sponsorship", "message"), quote=should_quote(msg)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
holo_user.application_restart(reapply=True)
|
holo_user.application_restart(reapply=True)
|
||||||
await welcome_pass(app, msg, once_again=True)
|
await welcome_pass(app, msg, once_again=True)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
await msg.reply_text(
|
||||||
await msg.reply_text(locale("reapply_in_progress", "message", locale=holo_user).format(locale("confirm", "keyboard", locale=holo_user)[1][0]), reply_markup=InlineKeyboardMarkup([
|
locale("reapply_in_progress", "message", locale=holo_user).format(
|
||||||
[
|
locale("confirm", "keyboard", locale=holo_user)[1][0]
|
||||||
InlineKeyboardButton(locale("applying_stop", "button", locale=holo_user), f"reapply_stop_{msg.id}")
|
),
|
||||||
]
|
reply_markup=InlineKeyboardMarkup(
|
||||||
]))
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("applying_stop", "button", locale=holo_user),
|
||||||
|
f"reapply_stop_{msg.id}",
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
elif holo_user.spoiler_state() is True:
|
elif holo_user.spoiler_state() is True:
|
||||||
|
|
||||||
await msg.reply_text(locale("spoiler_in_progress", "message", locale=holo_user))
|
await msg.reply_text(locale("spoiler_in_progress", "message", locale=holo_user))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
if (holo_user.application_state()[0] == "fill") and (
|
||||||
if (holo_user.application_state()[0] == "fill") and (col_tmp.find_one({"user": holo_user.id, "type": "application"})["sent"] is True):
|
col_tmp.find_one({"user": holo_user.id, "type": "application"})["sent"]
|
||||||
await msg.reply_text(locale("reapply_forbidden", "message", locale=holo_user))
|
is True
|
||||||
|
):
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("reapply_forbidden", "message", locale=holo_user)
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("reapply_in_progress", "message", locale=holo_user).format(locale("confirm", "keyboard", locale=holo_user)[1][0]), reply_markup=InlineKeyboardMarkup([
|
await msg.reply_text(
|
||||||
[
|
locale("reapply_in_progress", "message", locale=holo_user).format(
|
||||||
InlineKeyboardButton(locale("applying_stop", "button", locale=holo_user), f"reapply_stop_{msg.id}")
|
locale("confirm", "keyboard", locale=holo_user)[1][0]
|
||||||
]
|
),
|
||||||
]))
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("applying_stop", "button", locale=holo_user),
|
||||||
|
f"reapply_stop_{msg.id}",
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -11,14 +11,28 @@ from modules import custom_filters
|
|||||||
|
|
||||||
pid = getpid()
|
pid = getpid()
|
||||||
|
|
||||||
# Reboot command ===============================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_general & ~filters.scheduled & filters.private & filters.command(["kill", "die", "reboot"], prefixes=["/"]) & custom_filters.admin)
|
|
||||||
async def cmd_kill(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Reboot command ===============================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_general
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(["kill", "die", "reboot"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
|
async def cmd_kill(app: Client, msg: Message):
|
||||||
logWrite(f"Shutting down bot with pid {pid}")
|
logWrite(f"Shutting down bot with pid {pid}")
|
||||||
await msg.reply_text(locale("shutdown", "message", locale=msg.from_user).format(pid), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("shutdown", "message", locale=msg.from_user).format(pid),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
scheduler.shutdown()
|
scheduler.shutdown()
|
||||||
makedirs(configGet("cache", "locations"), exist_ok=True)
|
makedirs(configGet("cache", "locations"), exist_ok=True)
|
||||||
jsonSave({"timestamp": time()}, path.join(configGet("cache", "locations"), "shutdown_time"))
|
jsonSave(
|
||||||
|
{"timestamp": time()},
|
||||||
|
path.join(configGet("cache", "locations"), "shutdown_time"),
|
||||||
|
)
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -9,12 +9,17 @@ from modules import custom_filters
|
|||||||
|
|
||||||
pid = getpid()
|
pid = getpid()
|
||||||
|
|
||||||
|
|
||||||
# Reset commands command =======================================================================================================
|
# Reset commands command =======================================================================================================
|
||||||
@app.on_message(custom_filters.enabled_general & ~filters.scheduled & filters.private & filters.command(["resetcommands"], prefixes=["/"]) & custom_filters.admin)
|
@app.on_message(
|
||||||
|
custom_filters.enabled_general
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(["resetcommands"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
async def cmd_resetcommands(app: Client, msg: Message):
|
async def cmd_resetcommands(app: Client, msg: Message):
|
||||||
|
|
||||||
if msg.from_user.id == configGet("owner"):
|
if msg.from_user.id == configGet("owner"):
|
||||||
|
|
||||||
logWrite(f"Resetting all commands on owner's request")
|
logWrite(f"Resetting all commands on owner's request")
|
||||||
|
|
||||||
valid_locales = []
|
valid_locales = []
|
||||||
@ -24,25 +29,45 @@ async def cmd_resetcommands(app: Client, msg: Message):
|
|||||||
if entry.endswith(".json"):
|
if entry.endswith(".json"):
|
||||||
valid_locales.append(".".join(entry.split(".")[:-1]))
|
valid_locales.append(".".join(entry.split(".")[:-1]))
|
||||||
|
|
||||||
logWrite(f'Resetting commands in groups {configGet("admin", "groups")} and {configGet("users", "groups")}', debug=True)
|
logWrite(
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("admin", "groups")))
|
f'Resetting commands in groups {configGet("admin", "groups")} and {configGet("users", "groups")}',
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("users", "groups")))
|
debug=True,
|
||||||
|
)
|
||||||
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("admin", "groups"))
|
||||||
|
)
|
||||||
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("users", "groups"))
|
||||||
|
)
|
||||||
for lc in valid_locales:
|
for lc in valid_locales:
|
||||||
try:
|
try:
|
||||||
logWrite(f'Resetting commands in groups {configGet("admin", "groups")} and {configGet("users", "groups")} [{lc}]', debug=True)
|
logWrite(
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("admin", "groups")), language_code=lc)
|
f'Resetting commands in groups {configGet("admin", "groups")} and {configGet("users", "groups")} [{lc}]',
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("users", "groups")), language_code=lc)
|
debug=True,
|
||||||
|
)
|
||||||
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("admin", "groups")),
|
||||||
|
language_code=lc,
|
||||||
|
)
|
||||||
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("users", "groups")),
|
||||||
|
language_code=lc,
|
||||||
|
)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
for admin in configGet("admins"):
|
for admin in configGet("admins"):
|
||||||
try:
|
try:
|
||||||
logWrite(f'Resetting commands for admin {admin}', debug=True)
|
logWrite(f"Resetting commands for admin {admin}", debug=True)
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=admin))
|
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=admin))
|
||||||
for lc in valid_locales:
|
for lc in valid_locales:
|
||||||
try:
|
try:
|
||||||
logWrite(f'Resetting commands for admin {admin} [{lc}]', debug=True)
|
logWrite(
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=admin), language_code=lc)
|
f"Resetting commands for admin {admin} [{lc}]", debug=True
|
||||||
|
)
|
||||||
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=admin), language_code=lc
|
||||||
|
)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
@ -51,21 +76,40 @@ async def cmd_resetcommands(app: Client, msg: Message):
|
|||||||
try:
|
try:
|
||||||
logWrite(f'Resetting commands for owner {configGet("owner")}', debug=True)
|
logWrite(f'Resetting commands for owner {configGet("owner")}', debug=True)
|
||||||
for lc in valid_locales:
|
for lc in valid_locales:
|
||||||
logWrite(f'Resetting commands for owner {configGet("owner")} [{lc}]', debug=True)
|
logWrite(
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("owner")), language_code=lc)
|
f'Resetting commands for owner {configGet("owner")} [{lc}]',
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("owner")))
|
debug=True,
|
||||||
|
)
|
||||||
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("owner")),
|
||||||
|
language_code=lc,
|
||||||
|
)
|
||||||
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("owner"))
|
||||||
|
)
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
for lc in valid_locales:
|
for lc in valid_locales:
|
||||||
logWrite(f'Resetting commands for locale {lc}', debug=True)
|
logWrite(f"Resetting commands for locale {lc}", debug=True)
|
||||||
await app.delete_bot_commands(scope=BotCommandScopeDefault(), language_code=lc)
|
await app.delete_bot_commands(
|
||||||
|
scope=BotCommandScopeDefault(), language_code=lc
|
||||||
|
)
|
||||||
|
|
||||||
logWrite(f'Resetting default commands', debug=True)
|
logWrite(f"Resetting default commands", debug=True)
|
||||||
await app.delete_bot_commands()
|
await app.delete_bot_commands()
|
||||||
|
|
||||||
await msg.reply_text("OK", quote=should_quote(msg))
|
await msg.reply_text("OK", quote=should_quote(msg))
|
||||||
|
|
||||||
logWrite(str(await app.get_bot_commands()), debug=True)
|
logWrite(str(await app.get_bot_commands()), debug=True)
|
||||||
logWrite(str(await app.get_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("owner")))), debug=True)
|
logWrite(
|
||||||
|
str(
|
||||||
|
await app.get_bot_commands(
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("owner"))
|
||||||
|
)
|
||||||
|
),
|
||||||
|
debug=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,36 +7,55 @@ from modules.utils import locale
|
|||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
|
|
||||||
|
|
||||||
class DefaultRulesMarkup(list):
|
class DefaultRulesMarkup(list):
|
||||||
def __init__(self, language_code: Union[str, HoloUser, User, None]):
|
def __init__(self, language_code: Union[str, HoloUser, User, None]):
|
||||||
super().__init__([])
|
super().__init__([])
|
||||||
self.keyboard = InlineKeyboardMarkup(
|
self.keyboard = InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("rules_home", "button", locale=language_code), callback_data="rules_home"),
|
InlineKeyboardButton(
|
||||||
InlineKeyboardButton(locale("rules_additional", "button", locale=language_code), callback_data="rules_additional")
|
locale("rules_home", "button", locale=language_code),
|
||||||
|
callback_data="rules_home",
|
||||||
|
),
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale("rules_additional", "button", locale=language_code),
|
||||||
|
callback_data="rules_additional",
|
||||||
|
),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton("1", callback_data="rule_1"),
|
InlineKeyboardButton("1", callback_data="rule_1"),
|
||||||
InlineKeyboardButton("2", callback_data="rule_2"),
|
InlineKeyboardButton("2", callback_data="rule_2"),
|
||||||
InlineKeyboardButton("3", callback_data="rule_3")
|
InlineKeyboardButton("3", callback_data="rule_3"),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton("4", callback_data="rule_4"),
|
InlineKeyboardButton("4", callback_data="rule_4"),
|
||||||
InlineKeyboardButton("5", callback_data="rule_5"),
|
InlineKeyboardButton("5", callback_data="rule_5"),
|
||||||
InlineKeyboardButton("6", callback_data="rule_6")
|
InlineKeyboardButton("6", callback_data="rule_6"),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton("7", callback_data="rule_7"),
|
InlineKeyboardButton("7", callback_data="rule_7"),
|
||||||
InlineKeyboardButton("8", callback_data="rule_8"),
|
InlineKeyboardButton("8", callback_data="rule_8"),
|
||||||
InlineKeyboardButton("9", callback_data="rule_9")
|
InlineKeyboardButton("9", callback_data="rule_9"),
|
||||||
]
|
],
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Rules command =============================================================================================================
|
# Rules command =============================================================================================================
|
||||||
@app.on_message(custom_filters.enabled_general & ~filters.scheduled & filters.private & ~custom_filters.banned & filters.command(["rules"], prefixes=["/"]))
|
@app.on_message(
|
||||||
|
custom_filters.enabled_general
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& ~custom_filters.banned
|
||||||
|
& filters.command(["rules"], prefixes=["/"])
|
||||||
|
)
|
||||||
async def cmd_rules(app: Client, msg: Message):
|
async def cmd_rules(app: Client, msg: Message):
|
||||||
await msg.reply_text(locale("rules_msg", locale=msg.from_user), disable_web_page_preview=True, reply_markup=DefaultRulesMarkup(msg.from_user).keyboard)
|
await msg.reply_text(
|
||||||
|
locale("rules_msg", locale=msg.from_user),
|
||||||
|
disable_web_page_preview=True,
|
||||||
|
reply_markup=DefaultRulesMarkup(msg.from_user).keyboard,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -9,24 +9,30 @@ from modules.utils import locale
|
|||||||
from modules.database import col_spoilers, col_applications
|
from modules.database import col_spoilers, col_applications
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Spoiler command ==============================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_spoilers & ~filters.scheduled & filters.private & ~custom_filters.banned & filters.command(["spoiler"], prefixes=["/"]))
|
|
||||||
async def cmd_spoiler(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Spoiler command ==============================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_spoilers
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& ~custom_filters.banned
|
||||||
|
& filters.command(["spoiler"], prefixes=["/"])
|
||||||
|
)
|
||||||
|
async def cmd_spoiler(app: Client, msg: Message):
|
||||||
try:
|
try:
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
except (UserInvalidError, UserNotFoundError):
|
except (UserInvalidError, UserNotFoundError):
|
||||||
return
|
return
|
||||||
|
|
||||||
if col_applications.find_one( {"user": holo_user.id} ) is None:
|
if col_applications.find_one({"user": holo_user.id}) is None:
|
||||||
|
|
||||||
await msg.reply_text(locale("not_member", "message", locale=msg.from_user))
|
await msg.reply_text(locale("not_member", "message", locale=msg.from_user))
|
||||||
return
|
return
|
||||||
|
|
||||||
if holo_user.application_state()[0] != "fill" and holo_user.sponsorship_state()[0] != "fill":
|
if (
|
||||||
|
holo_user.application_state()[0] != "fill"
|
||||||
if col_spoilers.find_one( {"user": holo_user.id, "completed": False} ) is None:
|
and holo_user.sponsorship_state()[0] != "fill"
|
||||||
|
):
|
||||||
|
if col_spoilers.find_one({"user": holo_user.id, "completed": False}) is None:
|
||||||
col_spoilers.insert_one(
|
col_spoilers.insert_one(
|
||||||
{
|
{
|
||||||
"user": holo_user.id,
|
"user": holo_user.id,
|
||||||
@ -39,13 +45,24 @@ async def cmd_spoiler(app: Client, msg: Message):
|
|||||||
"animation": None,
|
"animation": None,
|
||||||
"document": None,
|
"document": None,
|
||||||
"caption": None,
|
"caption": None,
|
||||||
"text": None
|
"text": None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
await msg.reply_text(locale("spoiler_started", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("spoiler_categories", "keyboard"), resize_keyboard=True, one_time_keyboard=True))
|
await msg.reply_text(
|
||||||
|
locale("spoiler_started", "message", locale=msg.from_user),
|
||||||
|
reply_markup=ReplyKeyboardMarkup(
|
||||||
|
locale("spoiler_categories", "keyboard"),
|
||||||
|
resize_keyboard=True,
|
||||||
|
one_time_keyboard=True,
|
||||||
|
),
|
||||||
|
)
|
||||||
logWrite(f"User {msg.from_user.id} started creating new spoiler")
|
logWrite(f"User {msg.from_user.id} started creating new spoiler")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("spoiler_unfinished", "message", locale=msg.from_user))
|
await msg.reply_text(
|
||||||
|
locale("spoiler_unfinished", "message", locale=msg.from_user)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,17 +7,44 @@ from modules import custom_filters
|
|||||||
from modules.utils import locale, should_quote
|
from modules.utils import locale, should_quote
|
||||||
from modules.database import col_applications
|
from modules.database import col_applications
|
||||||
|
|
||||||
|
|
||||||
# Sponsorship command ==========================================================================================================
|
# Sponsorship command ==========================================================================================================
|
||||||
@app.on_message(custom_filters.enabled_sponsorships & ~filters.scheduled & filters.command(["sponsorship"], prefixes=["/"]) & ~custom_filters.banned & (custom_filters.allowed | custom_filters.admin))
|
@app.on_message(
|
||||||
|
custom_filters.enabled_sponsorships
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command(["sponsorship"], prefixes=["/"])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
& (custom_filters.allowed | custom_filters.admin)
|
||||||
|
)
|
||||||
async def cmd_sponsorship(app: Client, msg: Message):
|
async def cmd_sponsorship(app: Client, msg: Message):
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
if holo_user.application_state()[0] == "fill":
|
if holo_user.application_state()[0] == "fill":
|
||||||
await msg.reply_text(locale("finish_application", "message", locale=msg.from_user), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("finish_application", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
if holo_user.spoiler_state() is True:
|
if holo_user.spoiler_state() is True:
|
||||||
await msg.reply_text(locale("spoiler_in_progress", "message", locale=holo_user))
|
await msg.reply_text(locale("spoiler_in_progress", "message", locale=holo_user))
|
||||||
return
|
return
|
||||||
await msg.reply_text(locale("sponsorship_apply", "message", locale=msg.from_user), reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(text=str(locale("sponsor_apply", "button", locale=msg.from_user)), callback_data=f"sponsor_apply_{msg.from_user.id}")]]), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("sponsorship_apply", "message", locale=msg.from_user),
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(
|
||||||
|
locale("sponsor_apply", "button", locale=msg.from_user)
|
||||||
|
),
|
||||||
|
callback_data=f"sponsor_apply_{msg.from_user.id}",
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
# else:
|
# else:
|
||||||
# await msg.reply_text(locale("sponsorship_application_empty", "message"))
|
# await msg.reply_text(locale("sponsorship_application_empty", "message"))
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -8,42 +8,67 @@ from modules import custom_filters
|
|||||||
from bson.objectid import ObjectId
|
from bson.objectid import ObjectId
|
||||||
from bson.errors import InvalidId
|
from bson.errors import InvalidId
|
||||||
|
|
||||||
# Start command ================================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.private & filters.command(["start"], prefixes=["/"]) & ~custom_filters.banned)
|
|
||||||
async def cmd_start(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Start command ================================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(["start"], prefixes=["/"])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
|
async def cmd_start(app: Client, msg: Message):
|
||||||
user = col_users.find_one({"user": msg.from_user.id})
|
user = col_users.find_one({"user": msg.from_user.id})
|
||||||
|
|
||||||
if user is None:
|
if user is None:
|
||||||
|
col_users.insert_one(
|
||||||
col_users.insert_one({
|
{
|
||||||
"user": msg.from_user.id,
|
"user": msg.from_user.id,
|
||||||
"link": None,
|
"link": None,
|
||||||
"label": "",
|
"label": "",
|
||||||
"tg_name": msg.from_user.first_name,
|
"tg_name": msg.from_user.first_name,
|
||||||
"tg_phone": msg.from_user.phone_number,
|
"tg_phone": msg.from_user.phone_number,
|
||||||
"tg_locale": msg.from_user.language_code,
|
"tg_locale": msg.from_user.language_code,
|
||||||
"tg_username": msg.from_user.username
|
"tg_username": msg.from_user.username,
|
||||||
})
|
}
|
||||||
|
)
|
||||||
|
|
||||||
logWrite(f"User {msg.from_user.id} started bot interaction")
|
logWrite(f"User {msg.from_user.id} started bot interaction")
|
||||||
await msg.reply_text(locale("start", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("welcome", "keyboard", locale=msg.from_user), resize_keyboard=True))
|
await msg.reply_text(
|
||||||
|
locale("start", "message", locale=msg.from_user),
|
||||||
|
reply_markup=ReplyKeyboardMarkup(
|
||||||
|
locale("welcome", "keyboard", locale=msg.from_user),
|
||||||
|
resize_keyboard=True,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
if len(msg.command) > 1:
|
if len(msg.command) > 1:
|
||||||
try:
|
try:
|
||||||
spoiler = col_spoilers.find_one( {"_id": ObjectId(msg.command[1])} )
|
spoiler = col_spoilers.find_one({"_id": ObjectId(msg.command[1])})
|
||||||
if spoiler["photo"] is not None:
|
if spoiler["photo"] is not None:
|
||||||
await msg.reply_cached_media(spoiler["photo"], caption=spoiler["caption"])
|
await msg.reply_cached_media(
|
||||||
|
spoiler["photo"], caption=spoiler["caption"]
|
||||||
|
)
|
||||||
if spoiler["video"] is not None:
|
if spoiler["video"] is not None:
|
||||||
await msg.reply_cached_media(spoiler["video"], caption=spoiler["caption"])
|
await msg.reply_cached_media(
|
||||||
|
spoiler["video"], caption=spoiler["caption"]
|
||||||
|
)
|
||||||
if spoiler["audio"] is not None:
|
if spoiler["audio"] is not None:
|
||||||
await msg.reply_cached_media(spoiler["audio"], caption=spoiler["caption"])
|
await msg.reply_cached_media(
|
||||||
|
spoiler["audio"], caption=spoiler["caption"]
|
||||||
|
)
|
||||||
if spoiler["animation"] is not None:
|
if spoiler["animation"] is not None:
|
||||||
await msg.reply_cached_media(spoiler["animation"], caption=spoiler["caption"])
|
await msg.reply_cached_media(
|
||||||
|
spoiler["animation"], caption=spoiler["caption"]
|
||||||
|
)
|
||||||
if spoiler["document"] is not None:
|
if spoiler["document"] is not None:
|
||||||
await msg.reply_cached_media(spoiler["document"], caption=spoiler["caption"])
|
await msg.reply_cached_media(
|
||||||
|
spoiler["document"], caption=spoiler["caption"]
|
||||||
|
)
|
||||||
if spoiler["text"] is not None:
|
if spoiler["text"] is not None:
|
||||||
await msg.reply_text(spoiler["text"])
|
await msg.reply_text(spoiler["text"])
|
||||||
except InvalidId:
|
except InvalidId:
|
||||||
await msg.reply_text(f"Got an invalid ID {msg.command[1]}")
|
await msg.reply_text(f"Got an invalid ID {msg.command[1]}")
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,16 +7,41 @@ from modules.utils import configGet, locale
|
|||||||
from modules.database import col_warnings
|
from modules.database import col_warnings
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Warn command =================================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_warnings & ~filters.scheduled & filters.command(["warn"], prefixes=["/"]) & custom_filters.admin)
|
|
||||||
async def cmd_warn(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Warn command =================================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_warnings
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command(["warn"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
|
async def cmd_warn(app: Client, msg: Message):
|
||||||
if msg.chat.id == configGet("users", "groups"):
|
if msg.chat.id == configGet("users", "groups"):
|
||||||
if msg.reply_to_message_id != None:
|
if msg.reply_to_message_id != None:
|
||||||
message = " ".join(msg.command[1:]) if len(msg.command) > 1 else ""
|
message = " ".join(msg.command[1:]) if len(msg.command) > 1 else ""
|
||||||
col_warnings.insert_one({"user": msg.reply_to_message.from_user.id, "admin": msg.from_user.id, "date": datetime.now(), "reason": message})
|
col_warnings.insert_one(
|
||||||
|
{
|
||||||
|
"user": msg.reply_to_message.from_user.id,
|
||||||
|
"admin": msg.from_user.id,
|
||||||
|
"date": datetime.now(),
|
||||||
|
"reason": message,
|
||||||
|
}
|
||||||
|
)
|
||||||
if message == "":
|
if message == "":
|
||||||
await msg.reply_text(locale("warned", "message").format(msg.reply_to_message.from_user.first_name, msg.reply_to_message.from_user.id))
|
await msg.reply_text(
|
||||||
|
locale("warned", "message").format(
|
||||||
|
msg.reply_to_message.from_user.first_name,
|
||||||
|
msg.reply_to_message.from_user.id,
|
||||||
|
)
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("warned_reason", "message").format(msg.reply_to_message.from_user.first_name, msg.reply_to_message.from_user.id, message))
|
await msg.reply_text(
|
||||||
|
locale("warned_reason", "message").format(
|
||||||
|
msg.reply_to_message.from_user.first_name,
|
||||||
|
msg.reply_to_message.from_user.id,
|
||||||
|
message,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,12 +7,20 @@ from modules.utils import configGet, locale, should_quote
|
|||||||
from modules.database import col_users, col_warnings
|
from modules.database import col_users, col_warnings
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Warnings command =============================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_warnings & ~filters.scheduled & filters.command(["warnings"], prefixes=["/"]) & custom_filters.admin)
|
|
||||||
async def cmd_warnings(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Warnings command =============================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_warnings
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.command(["warnings"], prefixes=["/"])
|
||||||
|
& custom_filters.admin
|
||||||
|
)
|
||||||
|
async def cmd_warnings(app: Client, msg: Message):
|
||||||
if len(msg.command) <= 1:
|
if len(msg.command) <= 1:
|
||||||
await msg.reply_text(locale("syntax_warnings", "message", locale=msg.from_user), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("syntax_warnings", "message", locale=msg.from_user),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -21,7 +29,11 @@ async def cmd_warnings(app: Client, msg: Message):
|
|||||||
target_name = user_db["tg_name"]
|
target_name = user_db["tg_name"]
|
||||||
except:
|
except:
|
||||||
list_of_users = []
|
list_of_users = []
|
||||||
async for m in app.get_chat_members(configGet("users", "groups"), filter=ChatMembersFilter.SEARCH, query=msg.command[1]):
|
async for m in app.get_chat_members(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
filter=ChatMembersFilter.SEARCH,
|
||||||
|
query=msg.command[1],
|
||||||
|
):
|
||||||
list_of_users.append(m)
|
list_of_users.append(m)
|
||||||
|
|
||||||
if len(list_of_users) != 0:
|
if len(list_of_users) != 0:
|
||||||
@ -29,16 +41,37 @@ async def cmd_warnings(app: Client, msg: Message):
|
|||||||
target_name = target.first_name
|
target_name = target.first_name
|
||||||
target_id = str(target.id)
|
target_id = str(target.id)
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("no_user_warnings", "message", locale=msg.from_user).format(msg.command[1]))
|
await msg.reply_text(
|
||||||
|
locale("no_user_warnings", "message", locale=msg.from_user).format(
|
||||||
|
msg.command[1]
|
||||||
|
)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
warns = len(list(col_warnings.find({"user": target_id})))
|
warns = len(list(col_warnings.find({"user": target_id})))
|
||||||
|
|
||||||
if warns == 0:
|
if warns == 0:
|
||||||
await msg.reply_text(locale("no_warnings", "message", locale=msg.from_user).format(target_name, target_id), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("no_warnings", "message", locale=msg.from_user).format(
|
||||||
|
target_name, target_id
|
||||||
|
),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
if warns <= 5:
|
if warns <= 5:
|
||||||
await msg.reply_text(locale("warnings_1", "message", locale=msg.from_user).format(target_name, target_id, warns), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("warnings_1", "message", locale=msg.from_user).format(
|
||||||
|
target_name, target_id, warns
|
||||||
|
),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("warnings_2", "message", locale=msg.from_user).format(target_name, target_id, warns), quote=should_quote(msg))
|
await msg.reply_text(
|
||||||
|
locale("warnings_2", "message", locale=msg.from_user).format(
|
||||||
|
target_name, target_id, warns
|
||||||
|
),
|
||||||
|
quote=should_quote(msg),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -12,44 +12,73 @@ from pyrogram.types import Message
|
|||||||
async def admin_func(_, __, msg: Message):
|
async def admin_func(_, __, msg: Message):
|
||||||
return await isAnAdmin(msg.from_user.id)
|
return await isAnAdmin(msg.from_user.id)
|
||||||
|
|
||||||
|
|
||||||
async def member_func(_, __, msg: Message):
|
async def member_func(_, __, msg: Message):
|
||||||
return True if (msg.from_user.id in jsonLoad(path.join(configGet("cache", "locations"), "group_members"))) else False
|
return (
|
||||||
|
True
|
||||||
|
if (
|
||||||
|
msg.from_user.id
|
||||||
|
in jsonLoad(path.join(configGet("cache", "locations"), "group_members"))
|
||||||
|
)
|
||||||
|
else False
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def allowed_func(_, __, msg: Message):
|
async def allowed_func(_, __, msg: Message):
|
||||||
output = False
|
output = False
|
||||||
output = True if (col_applications.find_one({"user": msg.from_user.id}) is not None) else False
|
output = (
|
||||||
if path.exists(path.join(configGet("cache", "locations"), "group_members")) and (msg.from_user.id not in jsonLoad(path.join(configGet("cache", "locations"), "group_members"))):
|
True
|
||||||
|
if (col_applications.find_one({"user": msg.from_user.id}) is not None)
|
||||||
|
else False
|
||||||
|
)
|
||||||
|
if path.exists(path.join(configGet("cache", "locations"), "group_members")) and (
|
||||||
|
msg.from_user.id
|
||||||
|
not in jsonLoad(path.join(configGet("cache", "locations"), "group_members"))
|
||||||
|
):
|
||||||
output = False
|
output = False
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
async def banned_func(_, __, msg: Message):
|
async def banned_func(_, __, msg: Message):
|
||||||
return True if col_bans.find_one( {"user": msg.from_user.id} ) is not None else False
|
return True if col_bans.find_one({"user": msg.from_user.id}) is not None else False
|
||||||
|
|
||||||
|
|
||||||
async def enabled_general_func(_, __, msg: Message):
|
async def enabled_general_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "general")
|
return configGet("enabled", "features", "general")
|
||||||
|
|
||||||
|
|
||||||
async def enabled_applications_func(_, __, msg: Message):
|
async def enabled_applications_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "applications")
|
return configGet("enabled", "features", "applications")
|
||||||
|
|
||||||
|
|
||||||
async def enabled_sponsorships_func(_, __, msg: Message):
|
async def enabled_sponsorships_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "sponsorships")
|
return configGet("enabled", "features", "sponsorships")
|
||||||
|
|
||||||
|
|
||||||
async def enabled_warnings_func(_, __, msg: Message):
|
async def enabled_warnings_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "warnings")
|
return configGet("enabled", "features", "warnings")
|
||||||
|
|
||||||
|
|
||||||
async def enabled_invites_check_func(_, __, msg: Message):
|
async def enabled_invites_check_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "invites_check")
|
return configGet("enabled", "features", "invites_check")
|
||||||
|
|
||||||
|
|
||||||
async def enabled_dinovoice_func(_, __, msg: Message):
|
async def enabled_dinovoice_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "dinovoice")
|
return configGet("enabled", "features", "dinovoice")
|
||||||
|
|
||||||
|
|
||||||
async def enabled_spoilers_func(_, __, msg: Message):
|
async def enabled_spoilers_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "spoilers")
|
return configGet("enabled", "features", "spoilers")
|
||||||
|
|
||||||
|
|
||||||
async def filling_sponsorship_func(_, __, msg: Message):
|
async def filling_sponsorship_func(_, __, msg: Message):
|
||||||
return True if col_tmp.find_one({"user": msg.from_user.id, "type": "sponsorship"}) is not None else False
|
return (
|
||||||
|
True
|
||||||
|
if col_tmp.find_one({"user": msg.from_user.id, "type": "sponsorship"})
|
||||||
|
is not None
|
||||||
|
else False
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
admin = filters.create(admin_func)
|
admin = filters.create(admin_func)
|
||||||
member = filters.create(member_func)
|
member = filters.create(member_func)
|
||||||
|
@ -9,18 +9,16 @@ with open("config.json", "r", encoding="utf-8") as f:
|
|||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
if db_config["user"] is not None and db_config["password"] is not None:
|
if db_config["user"] is not None and db_config["password"] is not None:
|
||||||
con_string = 'mongodb://{0}:{1}@{2}:{3}/{4}'.format(
|
con_string = "mongodb://{0}:{1}@{2}:{3}/{4}".format(
|
||||||
db_config["user"],
|
db_config["user"],
|
||||||
db_config["password"],
|
db_config["password"],
|
||||||
db_config["host"],
|
db_config["host"],
|
||||||
db_config["port"],
|
db_config["port"],
|
||||||
db_config["name"]
|
db_config["name"],
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
con_string = 'mongodb://{0}:{1}/{2}'.format(
|
con_string = "mongodb://{0}:{1}/{2}".format(
|
||||||
db_config["host"],
|
db_config["host"], db_config["port"], db_config["name"]
|
||||||
db_config["port"],
|
|
||||||
db_config["name"]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
db_client = MongoClient(con_string)
|
db_client = MongoClient(con_string)
|
||||||
@ -28,7 +26,18 @@ db = db_client.get_database(name=db_config["name"])
|
|||||||
|
|
||||||
collections = db.list_collection_names()
|
collections = db.list_collection_names()
|
||||||
|
|
||||||
for collection in ["tmp", "bans", "users", "context", "youtube", "spoilers", "messages", "warnings", "applications", "sponsorships"]:
|
for collection in [
|
||||||
|
"tmp",
|
||||||
|
"bans",
|
||||||
|
"users",
|
||||||
|
"context",
|
||||||
|
"youtube",
|
||||||
|
"spoilers",
|
||||||
|
"messages",
|
||||||
|
"warnings",
|
||||||
|
"applications",
|
||||||
|
"sponsorships",
|
||||||
|
]:
|
||||||
if not collection in collections:
|
if not collection in collections:
|
||||||
db.create_collection(collection)
|
db.create_collection(collection)
|
||||||
|
|
||||||
|
@ -3,7 +3,13 @@ from dateutil.relativedelta import relativedelta
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from app import app
|
from app import app
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.types import ReplyKeyboardRemove, InlineKeyboardMarkup, InlineKeyboardButton, ForceReply, Message
|
from pyrogram.types import (
|
||||||
|
ReplyKeyboardRemove,
|
||||||
|
InlineKeyboardMarkup,
|
||||||
|
InlineKeyboardButton,
|
||||||
|
ForceReply,
|
||||||
|
Message,
|
||||||
|
)
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from pyrogram.enums.parse_mode import ParseMode
|
from pyrogram.enums.parse_mode import ParseMode
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
@ -16,16 +22,30 @@ from modules import custom_filters
|
|||||||
confirmation_1 = []
|
confirmation_1 = []
|
||||||
for pattern in all_locales("confirm", "keyboard"):
|
for pattern in all_locales("confirm", "keyboard"):
|
||||||
confirmation_1.append(pattern[0][0])
|
confirmation_1.append(pattern[0][0])
|
||||||
@app.on_message((custom_filters.enabled_applications | custom_filters.enabled_sponsorships) & ~filters.scheduled & filters.private & filters.command(confirmation_1, prefixes=[""]) & ~custom_filters.banned)
|
|
||||||
async def confirm_yes(app: Client, msg: Message, kind: Literal["application", "sponsorship", "unknown"] = "unknown"):
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.on_message(
|
||||||
|
(custom_filters.enabled_applications | custom_filters.enabled_sponsorships)
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(confirmation_1, prefixes=[""])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
|
async def confirm_yes(
|
||||||
|
app: Client,
|
||||||
|
msg: Message,
|
||||||
|
kind: Literal["application", "sponsorship", "unknown"] = "unknown",
|
||||||
|
):
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
|
|
||||||
if configGet("enabled", "features", "applications") is True:
|
if configGet("enabled", "features", "applications") is True:
|
||||||
|
if (kind == "application") or (
|
||||||
if (kind == "application") or ((holo_user.application_state()[0] == "fill") and (holo_user.application_state()[1] is True)):
|
(holo_user.application_state()[0] == "fill")
|
||||||
|
and (holo_user.application_state()[1] is True)
|
||||||
tmp_application = col_tmp.find_one({"user": holo_user.id, "type": "application"})
|
):
|
||||||
|
tmp_application = col_tmp.find_one(
|
||||||
|
{"user": holo_user.id, "type": "application"}
|
||||||
|
)
|
||||||
|
|
||||||
if tmp_application is None:
|
if tmp_application is None:
|
||||||
logWrite(f"Application of {holo_user.id} is nowhere to be found.")
|
logWrite(f"Application of {holo_user.id} is nowhere to be found.")
|
||||||
@ -34,73 +54,120 @@ async def confirm_yes(app: Client, msg: Message, kind: Literal["application", "s
|
|||||||
if tmp_application["sent"] is True:
|
if tmp_application["sent"] is True:
|
||||||
return
|
return
|
||||||
|
|
||||||
await msg.reply_text(locale("application_sent", "message"), reply_markup=ReplyKeyboardRemove())
|
await msg.reply_text(
|
||||||
|
locale("application_sent", "message"),
|
||||||
|
reply_markup=ReplyKeyboardRemove(),
|
||||||
|
)
|
||||||
|
|
||||||
application_content = []
|
application_content = []
|
||||||
i = 1
|
i = 1
|
||||||
|
|
||||||
for question in tmp_application['application']:
|
for question in tmp_application["application"]:
|
||||||
|
|
||||||
if i == 2:
|
if i == 2:
|
||||||
age = relativedelta(datetime.now(), tmp_application['application']['2'])
|
age = relativedelta(
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
datetime.now(), tmp_application["application"]["2"]
|
||||||
|
)
|
||||||
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)"
|
||||||
|
)
|
||||||
elif i == 3:
|
elif i == 3:
|
||||||
if tmp_application['application']['3']['countryCode'] == "UA":
|
if tmp_application["application"]["3"]["countryCode"] == "UA":
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application']['3']['name']}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application']['3']['name']}"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application']['3']['name']} ({tmp_application['application']['3']['adminName1']}, {tmp_application['application']['3']['countryName']})")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application']['3']['name']} ({tmp_application['application']['3']['adminName1']}, {tmp_application['application']['3']['countryName']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application'][question]}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {tmp_application['application'][question]}"
|
||||||
|
)
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
if tmp_application["reapply"] is True and col_applications.find_one({"user": holo_user.id}) is not None:
|
if (
|
||||||
|
tmp_application["reapply"] is True
|
||||||
|
and col_applications.find_one({"user": holo_user.id}) is not None
|
||||||
|
):
|
||||||
await app.send_message(
|
await app.send_message(
|
||||||
chat_id=configGet("admin", "groups"),
|
chat_id=configGet("admin", "groups"),
|
||||||
text=(locale("reapply_got", "message")).format(str(holo_user.id),msg.from_user.first_name, msg.from_user.username, "\n".join(application_content)),
|
text=(locale("reapply_got", "message")).format(
|
||||||
|
str(holo_user.id),
|
||||||
|
msg.from_user.first_name,
|
||||||
|
msg.from_user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
),
|
||||||
parse_mode=ParseMode.MARKDOWN,
|
parse_mode=ParseMode.MARKDOWN,
|
||||||
reply_markup=InlineKeyboardMarkup(
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("reapply_yes", "button")), callback_data=f"reapply_yes_{holo_user.id}")
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("reapply_yes", "button")),
|
||||||
|
callback_data=f"reapply_yes_{holo_user.id}",
|
||||||
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("reapply_no", "button")), callback_data=f"reapply_no_{holo_user.id}")
|
InlineKeyboardButton(
|
||||||
]
|
text=str(locale("reapply_no", "button")),
|
||||||
|
callback_data=f"reapply_no_{holo_user.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await app.send_message(
|
await app.send_message(
|
||||||
chat_id=configGet("admin", "groups"),
|
chat_id=configGet("admin", "groups"),
|
||||||
text=(locale("application_got", "message")).format(str(holo_user.id), msg.from_user.first_name, msg.from_user.username, "\n".join(application_content)),
|
text=(locale("application_got", "message")).format(
|
||||||
|
str(holo_user.id),
|
||||||
|
msg.from_user.first_name,
|
||||||
|
msg.from_user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
),
|
||||||
parse_mode=ParseMode.MARKDOWN,
|
parse_mode=ParseMode.MARKDOWN,
|
||||||
reply_markup=InlineKeyboardMarkup(
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sub_yes", "button")), callback_data=f"sub_yes_{holo_user.id}")
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("sub_yes", "button")),
|
||||||
|
callback_data=f"sub_yes_{holo_user.id}",
|
||||||
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sub_no", "button")), callback_data=f"sub_no_{holo_user.id}")
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("sub_no", "button")),
|
||||||
|
callback_data=f"sub_no_{holo_user.id}",
|
||||||
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sub_russian", "button")), callback_data=f"sub_russian_{holo_user.id}")
|
InlineKeyboardButton(
|
||||||
]
|
text=str(locale("sub_russian", "button")),
|
||||||
|
callback_data=f"sub_russian_{holo_user.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} sent his application and it will now be reviewed")
|
logWrite(
|
||||||
|
f"User {holo_user.id} sent his application and it will now be reviewed"
|
||||||
|
)
|
||||||
|
|
||||||
col_tmp.update_one({"user": holo_user.id, "type": "application"}, {"$set": {"sent": True}})
|
col_tmp.update_one(
|
||||||
|
{"user": holo_user.id, "type": "application"}, {"$set": {"sent": True}}
|
||||||
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if configGet("enabled", "features", "sponsorships") is True:
|
if configGet("enabled", "features", "sponsorships") is True:
|
||||||
|
if (kind == "sponsorship") or (
|
||||||
if (kind == "sponsorship") or ((holo_user.sponsorship_state()[0] == "fill") and (holo_user.sponsorship_state()[1] is True)):
|
(holo_user.sponsorship_state()[0] == "fill")
|
||||||
|
and (holo_user.sponsorship_state()[1] is True)
|
||||||
tmp_sponsorship = col_tmp.find_one({"user": holo_user.id, "type": "sponsorship"})
|
):
|
||||||
|
tmp_sponsorship = col_tmp.find_one(
|
||||||
|
{"user": holo_user.id, "type": "sponsorship"}
|
||||||
|
)
|
||||||
|
|
||||||
if tmp_sponsorship is None:
|
if tmp_sponsorship is None:
|
||||||
logWrite(f"Sponsorship of {holo_user.id} is nowhere to be found.")
|
logWrite(f"Sponsorship of {holo_user.id} is nowhere to be found.")
|
||||||
@ -109,58 +176,116 @@ async def confirm_yes(app: Client, msg: Message, kind: Literal["application", "s
|
|||||||
if tmp_sponsorship["sent"] is True:
|
if tmp_sponsorship["sent"] is True:
|
||||||
return
|
return
|
||||||
|
|
||||||
await msg.reply_text(locale("sponsorship_sent", "message"), reply_markup=ReplyKeyboardRemove())
|
await msg.reply_text(
|
||||||
|
locale("sponsorship_sent", "message"),
|
||||||
|
reply_markup=ReplyKeyboardRemove(),
|
||||||
|
)
|
||||||
|
|
||||||
sponsorship_content = []
|
sponsorship_content = []
|
||||||
|
|
||||||
for question in tmp_sponsorship['sponsorship']:
|
for question in tmp_sponsorship["sponsorship"]:
|
||||||
|
|
||||||
if question == "expires":
|
if question == "expires":
|
||||||
sponsorship_content.append(f"{locale(f'question_{question}', 'message', 'sponsor_titles')} {tmp_sponsorship['sponsorship'][question].strftime('%d.%m.%Y')}")
|
sponsorship_content.append(
|
||||||
|
f"{locale(f'question_{question}', 'message', 'sponsor_titles')} {tmp_sponsorship['sponsorship'][question].strftime('%d.%m.%Y')}"
|
||||||
|
)
|
||||||
elif question == "proof":
|
elif question == "proof":
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
sponsorship_content.append(f"{locale(f'question_{question}', 'message', 'sponsor_titles')} {tmp_sponsorship['sponsorship'][question]}")
|
sponsorship_content.append(
|
||||||
|
f"{locale(f'question_{question}', 'message', 'sponsor_titles')} {tmp_sponsorship['sponsorship'][question]}"
|
||||||
|
)
|
||||||
|
|
||||||
await app.send_cached_media(configGet("admin", "groups"), tmp_sponsorship["sponsorship"]["proof"], caption=(locale("sponsor_got", "message")).format(str(holo_user.id), msg.from_user.first_name, msg.from_user.username, "\n".join(sponsorship_content)), parse_mode=ParseMode.MARKDOWN, reply_markup=InlineKeyboardMarkup(
|
await app.send_cached_media(
|
||||||
|
configGet("admin", "groups"),
|
||||||
|
tmp_sponsorship["sponsorship"]["proof"],
|
||||||
|
caption=(locale("sponsor_got", "message")).format(
|
||||||
|
str(holo_user.id),
|
||||||
|
msg.from_user.first_name,
|
||||||
|
msg.from_user.username,
|
||||||
|
"\n".join(sponsorship_content),
|
||||||
|
),
|
||||||
|
parse_mode=ParseMode.MARKDOWN,
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sponsor_yes", "button")), callback_data=f"sponsor_yes_{holo_user.id}")
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("sponsor_yes", "button")),
|
||||||
|
callback_data=f"sponsor_yes_{holo_user.id}",
|
||||||
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sponsor_no", "button")), callback_data=f"sponsor_no_{holo_user.id}")
|
InlineKeyboardButton(
|
||||||
]
|
text=str(locale("sponsor_no", "button")),
|
||||||
|
callback_data=f"sponsor_no_{holo_user.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
# remove(f"tmp{sep}{filename}.jpg")
|
# remove(f"tmp{sep}{filename}.jpg")
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} sent his sponsorship application and it will now be reviewed")
|
logWrite(
|
||||||
|
f"User {holo_user.id} sent his sponsorship application and it will now be reviewed"
|
||||||
|
)
|
||||||
|
|
||||||
col_tmp.update_one({"user": holo_user.id, "type": "sponsorship"}, {"$set": {"sent": True}})
|
col_tmp.update_one(
|
||||||
|
{"user": holo_user.id, "type": "sponsorship"}, {"$set": {"sent": True}}
|
||||||
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
confirmation_2 = []
|
confirmation_2 = []
|
||||||
for pattern in all_locales("confirm", "keyboard"):
|
for pattern in all_locales("confirm", "keyboard"):
|
||||||
confirmation_2.append(pattern[1][0])
|
confirmation_2.append(pattern[1][0])
|
||||||
@app.on_message((custom_filters.enabled_applications | custom_filters.enabled_sponsorships) & ~filters.scheduled & filters.private & filters.command(confirmation_2, prefixes=[""]) & ~custom_filters.banned)
|
|
||||||
async def confirm_no(app: Client, msg: Message, kind: Literal["application", "sponsorship", "unknown"] = "unknown"):
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.on_message(
|
||||||
|
(custom_filters.enabled_applications | custom_filters.enabled_sponsorships)
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(confirmation_2, prefixes=[""])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
|
async def confirm_no(
|
||||||
|
app: Client,
|
||||||
|
msg: Message,
|
||||||
|
kind: Literal["application", "sponsorship", "unknown"] = "unknown",
|
||||||
|
):
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
|
|
||||||
if configGet("enabled", "features", "applications") is True:
|
if configGet("enabled", "features", "applications") is True:
|
||||||
if (kind == "application") or ((holo_user.application_state()[0] == "fill") and (holo_user.application_state()[1] is True)):
|
if (kind == "application") or (
|
||||||
|
(holo_user.application_state()[0] == "fill")
|
||||||
|
and (holo_user.application_state()[1] is True)
|
||||||
|
):
|
||||||
holo_user.application_restart()
|
holo_user.application_restart()
|
||||||
await welcome_pass(app, msg, once_again=True)
|
await welcome_pass(app, msg, once_again=True)
|
||||||
logWrite(f"User {msg.from_user.id} restarted the application due to typo in it")
|
logWrite(
|
||||||
|
f"User {msg.from_user.id} restarted the application due to typo in it"
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
if configGet("enabled", "features", "sponsorships") is True:
|
if configGet("enabled", "features", "sponsorships") is True:
|
||||||
if (kind == "sponsorship") or ((holo_user.sponsorship_state()[0] == "fill") and (holo_user.sponsorship_state()[1] is True)):
|
if (kind == "sponsorship") or (
|
||||||
|
(holo_user.sponsorship_state()[0] == "fill")
|
||||||
|
and (holo_user.sponsorship_state()[1] is True)
|
||||||
|
):
|
||||||
holo_user.sponsorship_restart()
|
holo_user.sponsorship_restart()
|
||||||
await app.send_message(holo_user.id, locale(f"sponsor1", "message", locale=holo_user.locale), reply_markup=ForceReply(placeholder=str(locale(f"sponsor1", "force_reply", locale=holo_user.locale))))
|
await app.send_message(
|
||||||
logWrite(f"User {msg.from_user.id} restarted the sponsorship application due to typo in it")
|
holo_user.id,
|
||||||
|
locale(f"sponsor1", "message", locale=holo_user.locale),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=str(
|
||||||
|
locale(f"sponsor1", "force_reply", locale=holo_user.locale)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"User {msg.from_user.id} restarted the sponsorship application due to typo in it"
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -9,46 +9,79 @@ from modules.database import col_applications
|
|||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Contact getting ==============================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.contact & filters.private & (custom_filters.allowed | custom_filters.admin) & ~custom_filters.banned)
|
|
||||||
async def get_contact(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
# Contact getting ==============================================================================================================
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.contact
|
||||||
|
& filters.private
|
||||||
|
& (custom_filters.allowed | custom_filters.admin)
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
|
async def get_contact(app: Client, msg: Message):
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
|
|
||||||
if msg.contact.user_id != None:
|
if msg.contact.user_id != None:
|
||||||
|
|
||||||
application = col_applications.find_one({"user": msg.contact.user_id})
|
application = col_applications.find_one({"user": msg.contact.user_id})
|
||||||
|
|
||||||
if application is None:
|
if application is None:
|
||||||
logWrite(f"User {holo_user.id} requested application of {msg.contact.user_id} but user does not exists")
|
logWrite(
|
||||||
await msg.reply_text(locale("contact_invalid", "message", locale=holo_user.locale))
|
f"User {holo_user.id} requested application of {msg.contact.user_id} but user does not exists"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("contact_invalid", "message", locale=holo_user.locale)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
application_content = []
|
application_content = []
|
||||||
i = 1
|
i = 1
|
||||||
|
|
||||||
for question in application['application']:
|
for question in application["application"]:
|
||||||
|
|
||||||
if i == 2:
|
if i == 2:
|
||||||
age = relativedelta(datetime.now(), application['application']['2'])
|
age = relativedelta(datetime.now(), application["application"]["2"])
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)"
|
||||||
|
)
|
||||||
elif i == 3:
|
elif i == 3:
|
||||||
if application['application']['3']['countryCode'] == "UA":
|
if application["application"]["3"]["countryCode"] == "UA":
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application']['3']['name']}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application']['3']['name']}"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application'][question]}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=holo_user.locale)} {application['application'][question]}"
|
||||||
|
)
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
application_status = locale("application_status_accepted", "message", locale=holo_user.locale).format((await app.get_users(application["admin"])).first_name, application["date"].strftime("%d.%m.%Y, %H:%M"))
|
application_status = locale(
|
||||||
|
"application_status_accepted", "message", locale=holo_user.locale
|
||||||
|
).format(
|
||||||
|
(await app.get_users(application["admin"])).first_name,
|
||||||
|
application["date"].strftime("%d.%m.%Y, %H:%M"),
|
||||||
|
)
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} requested application of {msg.contact.user_id}")
|
logWrite(f"User {holo_user.id} requested application of {msg.contact.user_id}")
|
||||||
await msg.reply_text(locale("contact", "message", locale=holo_user.locale).format(str(msg.contact.user_id), "\n".join(application_content), application_status))
|
await msg.reply_text(
|
||||||
|
locale("contact", "message", locale=holo_user.locale).format(
|
||||||
|
str(msg.contact.user_id),
|
||||||
|
"\n".join(application_content),
|
||||||
|
application_status,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logWrite(f"User {holo_user.id} requested application of someone but user is not telegram user")
|
logWrite(
|
||||||
await msg.reply_text(locale("contact_not_member", "message", locale=holo_user.locale))
|
f"User {holo_user.id} requested application of someone but user is not telegram user"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("contact_not_member", "message", locale=holo_user.locale)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -3,35 +3,55 @@ from app import app, isAnAdmin
|
|||||||
import asyncio
|
import asyncio
|
||||||
from ftfy import fix_text
|
from ftfy import fix_text
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.types import Message, ForceReply, InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardRemove
|
from pyrogram.types import (
|
||||||
|
Message,
|
||||||
|
ForceReply,
|
||||||
|
InlineKeyboardMarkup,
|
||||||
|
InlineKeyboardButton,
|
||||||
|
ReplyKeyboardRemove,
|
||||||
|
)
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from modules.utils import configGet, logWrite, locale, all_locales
|
from modules.utils import configGet, logWrite, locale, all_locales
|
||||||
from modules.database import col_messages, col_spoilers
|
from modules.database import col_messages, col_spoilers
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
|
|
||||||
async def message_involved(msg: Message) -> bool:
|
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})
|
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:
|
if message is not None:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
async def message_context(msg: Message) -> tuple:
|
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})
|
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:
|
if message is not None:
|
||||||
return message["origin"]["chat"], message["origin"]["id"]
|
return message["origin"]["chat"], message["origin"]["id"]
|
||||||
return 0, 0
|
return 0, 0
|
||||||
|
|
||||||
|
|
||||||
# Any other input ==============================================================================================================
|
# Any other input ==============================================================================================================
|
||||||
@app.on_message(~ filters.scheduled & (filters.private | filters.chat(configGet("admin", "groups"))) & ~custom_filters.banned)
|
@app.on_message(
|
||||||
|
~filters.scheduled
|
||||||
|
& (filters.private | filters.chat(configGet("admin", "groups")))
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
async def any_stage(app: Client, msg: Message):
|
async def any_stage(app: Client, msg: Message):
|
||||||
|
|
||||||
if msg.via_bot is None:
|
if msg.via_bot is None:
|
||||||
|
|
||||||
holo_user = HoloUser(msg.from_user)
|
holo_user = HoloUser(msg.from_user)
|
||||||
|
|
||||||
if (msg.reply_to_message is not None) and (await message_involved(msg)):
|
if (msg.reply_to_message is not None) and (await message_involved(msg)):
|
||||||
|
|
||||||
context = await message_context(msg)
|
context = await message_context(msg)
|
||||||
context_message = await app.get_messages(context[0], context[1])
|
context_message = await app.get_messages(context[0], context[1])
|
||||||
|
|
||||||
@ -51,7 +71,7 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
animation=msg.animation,
|
animation=msg.animation,
|
||||||
voice=msg.voice,
|
voice=msg.voice,
|
||||||
adm_origin=await isAnAdmin(context_message.from_user.id),
|
adm_origin=await isAnAdmin(context_message.from_user.id),
|
||||||
adm_context=await isAnAdmin(msg.from_user.id)
|
adm_context=await isAnAdmin(msg.from_user.id),
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
@ -60,29 +80,30 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if msg.text is not None:
|
if msg.text is not None:
|
||||||
|
|
||||||
if configGet("enabled", "features", "applications") is True:
|
if configGet("enabled", "features", "applications") is True:
|
||||||
await holo_user.application_next(str(msg.text), msg=msg)
|
await holo_user.application_next(str(msg.text), msg=msg)
|
||||||
|
|
||||||
if configGet("enabled", "features", "sponsorships") is True:
|
if configGet("enabled", "features", "sponsorships") is True:
|
||||||
|
|
||||||
await holo_user.sponsorship_next(str(msg.text), msg)
|
await holo_user.sponsorship_next(str(msg.text), msg)
|
||||||
|
|
||||||
if msg.photo is not None:
|
if msg.photo is not None:
|
||||||
await holo_user.sponsorship_next(str(msg.text), msg=msg, photo=msg.photo)
|
await holo_user.sponsorship_next(str(msg.text), msg=msg, photo=msg.photo)
|
||||||
|
|
||||||
if holo_user.application_state()[0] != "fill" and holo_user.sponsorship_state()[0] != "fill":
|
if (
|
||||||
|
holo_user.application_state()[0] != "fill"
|
||||||
|
and holo_user.sponsorship_state()[0] != "fill"
|
||||||
|
):
|
||||||
if configGet("enabled", "features", "spoilers") is False:
|
if configGet("enabled", "features", "spoilers") is False:
|
||||||
return
|
return
|
||||||
|
|
||||||
spoiler = col_spoilers.find_one( {"user": msg.from_user.id, "completed": False} )
|
spoiler = col_spoilers.find_one(
|
||||||
|
{"user": msg.from_user.id, "completed": False}
|
||||||
|
)
|
||||||
|
|
||||||
if spoiler is None:
|
if spoiler is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
if spoiler["category"] is None:
|
if spoiler["category"] is None:
|
||||||
|
|
||||||
found = False
|
found = False
|
||||||
|
|
||||||
# Find category in all locales
|
# Find category in all locales
|
||||||
@ -93,86 +114,226 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
category = key
|
category = key
|
||||||
|
|
||||||
if found is False:
|
if found is False:
|
||||||
await msg.reply_text(locale("spoiler_incorrect_category", "message", locale=msg.from_user))
|
await msg.reply_text(
|
||||||
|
locale(
|
||||||
|
"spoiler_incorrect_category",
|
||||||
|
"message",
|
||||||
|
locale=msg.from_user,
|
||||||
|
)
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
col_spoilers.find_one_and_update( {"_id": spoiler["_id"]}, {"$set": {"category": category}} )
|
col_spoilers.find_one_and_update(
|
||||||
await msg.reply_text(locale("spoiler_send_description", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user)))
|
{"_id": spoiler["_id"]}, {"$set": {"category": category}}
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("spoiler_send_description", "message", locale=msg.from_user),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=locale(
|
||||||
|
"spoiler_description", "force_reply", locale=msg.from_user
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
if spoiler["description"] is None and (spoiler["photo"] is None and spoiler["video"] is None and spoiler["audio"] is None and spoiler["animation"] is None and spoiler["text"] is None):
|
if spoiler["description"] is None and (
|
||||||
|
spoiler["photo"] is None
|
||||||
|
and spoiler["video"] is None
|
||||||
|
and spoiler["audio"] is None
|
||||||
|
and spoiler["animation"] is None
|
||||||
|
and spoiler["text"] is None
|
||||||
|
):
|
||||||
# for lc in all_locales("spoiler_description", "keyboard"):
|
# for lc in all_locales("spoiler_description", "keyboard"):
|
||||||
# if msg.text == lc[-1][0]:
|
# if msg.text == lc[-1][0]:
|
||||||
# await msg.reply_text(locale("spoiler_description_enter", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user)))
|
# await msg.reply_text(locale("spoiler_description_enter", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user)))
|
||||||
# return
|
# return
|
||||||
|
|
||||||
|
|
||||||
if str(msg.text) != "-":
|
if str(msg.text) != "-":
|
||||||
msg.text = fix_text(str(msg.text))
|
msg.text = fix_text(str(msg.text))
|
||||||
if len(str(msg.text)) > 1024:
|
if len(str(msg.text)) > 1024:
|
||||||
await msg.reply_text(locale("spoiler_description_too_long", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("spoiler_description", "force_reply", locale=msg.from_user)))
|
await msg.reply_text(
|
||||||
|
locale(
|
||||||
|
"spoiler_description_too_long",
|
||||||
|
"message",
|
||||||
|
locale=msg.from_user,
|
||||||
|
),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=locale(
|
||||||
|
"spoiler_description",
|
||||||
|
"force_reply",
|
||||||
|
locale=msg.from_user,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
return
|
return
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"description": msg.text}} )
|
col_spoilers.find_one_and_update(
|
||||||
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{"$set": {"description": msg.text}},
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"description": ""}} )
|
col_spoilers.find_one_and_update(
|
||||||
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{"$set": {"description": ""}},
|
||||||
|
)
|
||||||
|
|
||||||
logWrite(f"Adding description '{str(msg.text)}' to {msg.from_user.id}'s spoiler")
|
logWrite(
|
||||||
await msg.reply_text(locale("spoiler_using_description", "message", locale=msg.from_user).format(msg.text), reply_markup=ForceReply(placeholder=locale("spoiler_content", "force_reply", locale=msg.from_user)))
|
f"Adding description '{str(msg.text)}' to {msg.from_user.id}'s spoiler"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale(
|
||||||
|
"spoiler_using_description", "message", locale=msg.from_user
|
||||||
|
).format(msg.text),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=locale(
|
||||||
|
"spoiler_content", "force_reply", locale=msg.from_user
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
ready = False
|
ready = False
|
||||||
|
|
||||||
if msg.photo is not None:
|
if msg.photo is not None:
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"photo": msg.photo.file_id, "caption": msg.caption, "completed": True}} )
|
col_spoilers.find_one_and_update(
|
||||||
logWrite(f"Adding photo with id {msg.photo.file_id} to {msg.from_user.id}'s spoiler")
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"photo": msg.photo.file_id,
|
||||||
|
"caption": msg.caption,
|
||||||
|
"completed": True,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"Adding photo with id {msg.photo.file_id} to {msg.from_user.id}'s spoiler"
|
||||||
|
)
|
||||||
ready = True
|
ready = True
|
||||||
|
|
||||||
if msg.video is not None:
|
if msg.video is not None:
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"video": msg.video.file_id, "caption": msg.caption, "completed": True}} )
|
col_spoilers.find_one_and_update(
|
||||||
logWrite(f"Adding audio with id {msg.video.file_id} to {msg.from_user.id}'s spoiler")
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"video": msg.video.file_id,
|
||||||
|
"caption": msg.caption,
|
||||||
|
"completed": True,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"Adding audio with id {msg.video.file_id} to {msg.from_user.id}'s spoiler"
|
||||||
|
)
|
||||||
ready = True
|
ready = True
|
||||||
|
|
||||||
if msg.audio is not None:
|
if msg.audio is not None:
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"audio": msg.audio.file_id, "caption": msg.caption, "completed": True}} )
|
col_spoilers.find_one_and_update(
|
||||||
logWrite(f"Adding video with id {msg.audio.file_id} to {msg.from_user.id}'s spoiler")
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"audio": msg.audio.file_id,
|
||||||
|
"caption": msg.caption,
|
||||||
|
"completed": True,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"Adding video with id {msg.audio.file_id} to {msg.from_user.id}'s spoiler"
|
||||||
|
)
|
||||||
ready = True
|
ready = True
|
||||||
|
|
||||||
if msg.animation is not None:
|
if msg.animation is not None:
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"animation": msg.animation.file_id, "caption": msg.caption, "completed": True}} )
|
col_spoilers.find_one_and_update(
|
||||||
logWrite(f"Adding animation with id {msg.animation.file_id} to {msg.from_user.id}'s spoiler")
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"animation": msg.animation.file_id,
|
||||||
|
"caption": msg.caption,
|
||||||
|
"completed": True,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"Adding animation with id {msg.animation.file_id} to {msg.from_user.id}'s spoiler"
|
||||||
|
)
|
||||||
ready = True
|
ready = True
|
||||||
|
|
||||||
if msg.document is not None:
|
if msg.document is not None:
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"document": msg.document.file_id, "caption": msg.caption, "completed": True}} )
|
col_spoilers.find_one_and_update(
|
||||||
logWrite(f"Adding document with id {msg.document.file_id} to {msg.from_user.id}'s spoiler")
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{
|
||||||
|
"$set": {
|
||||||
|
"document": msg.document.file_id,
|
||||||
|
"caption": msg.caption,
|
||||||
|
"completed": True,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"Adding document with id {msg.document.file_id} to {msg.from_user.id}'s spoiler"
|
||||||
|
)
|
||||||
ready = True
|
ready = True
|
||||||
|
|
||||||
if spoiler["photo"] is None and spoiler["video"] is None and spoiler["audio"] is None and spoiler["animation"] is None and spoiler["document"] is None and spoiler["text"] is None:
|
if (
|
||||||
|
spoiler["photo"] is None
|
||||||
|
and spoiler["video"] is None
|
||||||
|
and spoiler["audio"] is None
|
||||||
|
and spoiler["animation"] is None
|
||||||
|
and spoiler["document"] is None
|
||||||
|
and spoiler["text"] is None
|
||||||
|
):
|
||||||
if msg.text is not None:
|
if msg.text is not None:
|
||||||
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"text": str(msg.text), "completed": True}} )
|
col_spoilers.find_one_and_update(
|
||||||
logWrite(f"Adding text '{str(msg.text)}' to {msg.from_user.id}'s spoiler")
|
{"user": msg.from_user.id, "completed": False},
|
||||||
|
{"$set": {"text": str(msg.text), "completed": True}},
|
||||||
|
)
|
||||||
|
logWrite(
|
||||||
|
f"Adding text '{str(msg.text)}' to {msg.from_user.id}'s spoiler"
|
||||||
|
)
|
||||||
ready = True
|
ready = True
|
||||||
|
|
||||||
if ready is True:
|
if ready is True:
|
||||||
await msg.reply_text(locale("spoiler_ready", "message", locale=msg.from_user), reply_markup=ReplyKeyboardRemove())
|
await msg.reply_text(
|
||||||
|
locale("spoiler_ready", "message", locale=msg.from_user),
|
||||||
|
reply_markup=ReplyKeyboardRemove(),
|
||||||
|
)
|
||||||
if configGet("allow_external", "features", "spoilers") is True:
|
if configGet("allow_external", "features", "spoilers") is True:
|
||||||
await msg.reply_text(
|
await msg.reply_text(
|
||||||
locale("spoiler_send", "message", locale=msg.from_user),
|
locale("spoiler_send", "message", locale=msg.from_user),
|
||||||
reply_markup=InlineKeyboardMarkup(
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("spoiler_preview", "button", locale=msg.from_user), callback_data=f"sid_{spoiler['_id'].__str__()}")
|
InlineKeyboardButton(
|
||||||
|
locale(
|
||||||
|
"spoiler_preview",
|
||||||
|
"button",
|
||||||
|
locale=msg.from_user,
|
||||||
|
),
|
||||||
|
callback_data=f"sid_{spoiler['_id'].__str__()}",
|
||||||
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("spoiler_send_chat", "button", locale=msg.from_user), callback_data=f"shc_{spoiler['_id'].__str__()}")
|
InlineKeyboardButton(
|
||||||
|
locale(
|
||||||
|
"spoiler_send_chat",
|
||||||
|
"button",
|
||||||
|
locale=msg.from_user,
|
||||||
|
),
|
||||||
|
callback_data=f"shc_{spoiler['_id'].__str__()}",
|
||||||
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("spoiler_send_other", "button", locale=msg.from_user), switch_inline_query=f"spoiler:{spoiler['_id'].__str__()}")
|
InlineKeyboardButton(
|
||||||
]
|
locale(
|
||||||
|
"spoiler_send_other",
|
||||||
|
"button",
|
||||||
|
locale=msg.from_user,
|
||||||
|
),
|
||||||
|
switch_inline_query=f"spoiler:{spoiler['_id'].__str__()}",
|
||||||
|
)
|
||||||
|
],
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(
|
await msg.reply_text(
|
||||||
@ -180,33 +341,65 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
reply_markup=InlineKeyboardMarkup(
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("spoiler_preview", "button", locale=msg.from_user), callback_data=f"sid_{spoiler['_id'].__str__()}")
|
InlineKeyboardButton(
|
||||||
|
locale(
|
||||||
|
"spoiler_preview",
|
||||||
|
"button",
|
||||||
|
locale=msg.from_user,
|
||||||
|
),
|
||||||
|
callback_data=f"sid_{spoiler['_id'].__str__()}",
|
||||||
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(locale("spoiler_send_chat", "button", locale=msg.from_user), callback_data=f"shc_{spoiler['_id'].__str__()}")
|
InlineKeyboardButton(
|
||||||
]
|
locale(
|
||||||
|
"spoiler_send_chat",
|
||||||
|
"button",
|
||||||
|
locale=msg.from_user,
|
||||||
|
),
|
||||||
|
callback_data=f"shc_{spoiler['_id'].__str__()}",
|
||||||
|
)
|
||||||
|
],
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("spoiler_incorrect_content", "message", locale=msg.from_user))
|
await msg.reply_text(
|
||||||
|
locale("spoiler_incorrect_content", "message", locale=msg.from_user)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.on_message(~ filters.scheduled & filters.group)
|
@app.on_message(~filters.scheduled & filters.group)
|
||||||
async def message_in_group(app: Client, msg: Message):
|
async def message_in_group(app: Client, msg: Message):
|
||||||
if (msg.chat is not None) and (msg.via_bot is not None):
|
if (msg.chat is not None) and (msg.via_bot is not None):
|
||||||
if (msg.via_bot.id == (await app.get_me()).id) and (msg.chat.id == configGet("users", "groups")):
|
if (msg.via_bot.id == (await app.get_me()).id) and (
|
||||||
if str(msg.text).startswith(locale("spoiler_described", "message").split()[0]) or str(msg.text).startswith(locale("spoiler_empty", "message").split()[0]):
|
msg.chat.id == configGet("users", "groups")
|
||||||
|
):
|
||||||
|
if str(msg.text).startswith(
|
||||||
|
locale("spoiler_described", "message").split()[0]
|
||||||
|
) or str(msg.text).startswith(
|
||||||
|
locale("spoiler_empty", "message").split()[0]
|
||||||
|
):
|
||||||
logWrite(f"User {msg.from_user.id} sent spoiler to user's group")
|
logWrite(f"User {msg.from_user.id} sent spoiler to user's group")
|
||||||
try:
|
try:
|
||||||
logWrite("Forwarding spoiler to admin's group")
|
logWrite("Forwarding spoiler to admin's group")
|
||||||
await msg.copy(configGet("admin", "groups"), disable_notification=True)
|
await msg.copy(
|
||||||
|
configGet("admin", "groups"), disable_notification=True
|
||||||
|
)
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not forward spoiler to admin's group due to '{exp}': {print_exc()}")
|
logWrite(
|
||||||
|
f"Could not forward spoiler to admin's group due to '{exp}': {print_exc()}"
|
||||||
|
)
|
||||||
return
|
return
|
||||||
if configGet("remove_application_time") > 0:
|
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")
|
logWrite(
|
||||||
await asyncio.sleep(configGet("remove_application_time")*60)
|
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()
|
await msg.delete()
|
||||||
logWrite(f"Removed application requested by {msg.from_user.id} in destination group")
|
logWrite(
|
||||||
|
f"Removed application requested by {msg.from_user.id} in destination group"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -1,6 +1,11 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from app import app, isAnAdmin
|
from app import app, isAnAdmin
|
||||||
from pyrogram.types import ChatPermissions, InlineKeyboardMarkup, InlineKeyboardButton, ChatMemberUpdated
|
from pyrogram.types import (
|
||||||
|
ChatPermissions,
|
||||||
|
InlineKeyboardMarkup,
|
||||||
|
InlineKeyboardButton,
|
||||||
|
ChatMemberUpdated,
|
||||||
|
)
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from modules.utils import configGet, locale
|
from modules.utils import configGet, locale
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
@ -9,45 +14,64 @@ from modules.database import col_applications
|
|||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
|
|
||||||
# Filter users on join =========================================================================================================
|
# Filter users on join =========================================================================================================
|
||||||
@app.on_chat_member_updated(custom_filters.enabled_invites_check, group=configGet("users", "groups"))
|
@app.on_chat_member_updated(
|
||||||
#@app.on_message(filters.new_chat_members, group=configGet("users", "groups"))
|
custom_filters.enabled_invites_check, group=configGet("users", "groups")
|
||||||
|
)
|
||||||
|
# @app.on_message(filters.new_chat_members, group=configGet("users", "groups"))
|
||||||
async def filter_join(app: Client, member: ChatMemberUpdated):
|
async def filter_join(app: Client, member: ChatMemberUpdated):
|
||||||
|
|
||||||
if member.invite_link != None:
|
if member.invite_link != None:
|
||||||
|
|
||||||
holo_user = HoloUser(member.from_user)
|
holo_user = HoloUser(member.from_user)
|
||||||
|
|
||||||
if (holo_user.link is not None) and (holo_user.link == member.invite_link.invite_link):
|
if (holo_user.link is not None) and (
|
||||||
|
holo_user.link == member.invite_link.invite_link
|
||||||
logWrite(f"User {holo_user.id} joined destination group with correct link {holo_user.link}")
|
):
|
||||||
|
logWrite(
|
||||||
|
f"User {holo_user.id} joined destination group with correct link {holo_user.link}"
|
||||||
|
)
|
||||||
|
|
||||||
application = col_applications.find_one({"user": holo_user.id})
|
application = col_applications.find_one({"user": holo_user.id})
|
||||||
application_content = []
|
application_content = []
|
||||||
i = 1
|
i = 1
|
||||||
|
|
||||||
for question in application['application']:
|
for question in application["application"]:
|
||||||
|
|
||||||
if i == 2:
|
if i == 2:
|
||||||
age = relativedelta(datetime.now(), application['application']['2'])
|
age = relativedelta(datetime.now(), application["application"]["2"])
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)"
|
||||||
|
)
|
||||||
elif i == 3:
|
elif i == 3:
|
||||||
if application['application']['3']['countryCode'] == "UA":
|
if application["application"]["3"]["countryCode"] == "UA":
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']}"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application'][question]}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application'][question]}"
|
||||||
|
)
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
await app.send_message(configGet("users", "groups"), locale("joined_application", "message").format(member.from_user.first_name, member.from_user.username, "\n".join(application_content)))
|
await app.send_message(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
locale("joined_application", "message").format(
|
||||||
|
member.from_user.first_name,
|
||||||
|
member.from_user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if await isAnAdmin(member.invite_link.creator.id):
|
if await isAnAdmin(member.invite_link.creator.id):
|
||||||
|
logWrite(
|
||||||
logWrite(f"User {holo_user.id} joined destination group with link {holo_user.link} of an admin {member.invite_link.creator.id}")
|
f"User {holo_user.id} joined destination group with link {holo_user.link} of an admin {member.invite_link.creator.id}"
|
||||||
|
)
|
||||||
|
|
||||||
application = col_applications.find_one({"user": holo_user.id})
|
application = col_applications.find_one({"user": holo_user.id})
|
||||||
|
|
||||||
@ -57,42 +81,75 @@ async def filter_join(app: Client, member: ChatMemberUpdated):
|
|||||||
application_content = []
|
application_content = []
|
||||||
i = 1
|
i = 1
|
||||||
|
|
||||||
for question in application['application']:
|
for question in application["application"]:
|
||||||
|
|
||||||
if i == 2:
|
if i == 2:
|
||||||
age = relativedelta(datetime.now(), application['application']['2'])
|
age = relativedelta(datetime.now(), application["application"]["2"])
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)"
|
||||||
|
)
|
||||||
elif i == 3:
|
elif i == 3:
|
||||||
if application['application']['3']['countryCode'] == "UA":
|
if application["application"]["3"]["countryCode"] == "UA":
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']}"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application'][question]}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles')} {application['application'][question]}"
|
||||||
|
)
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
await app.send_message(configGet("users", "groups"), locale("joined_application", "message").format(member.from_user.first_name, member.from_user.username, "\n".join(application_content)))
|
await app.send_message(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
locale("joined_application", "message").format(
|
||||||
|
member.from_user.first_name,
|
||||||
|
member.from_user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} joined destination group with stolen/unapproved link {holo_user.link}")
|
logWrite(
|
||||||
|
f"User {holo_user.id} joined destination group with stolen/unapproved link {holo_user.link}"
|
||||||
|
)
|
||||||
|
|
||||||
await app.send_message(configGet("admin", "groups"), locale("joined_false_link", "message").format(member.from_user.first_name, member.from_user.id), reply_markup=InlineKeyboardMarkup(
|
await app.send_message(
|
||||||
[
|
configGet("admin", "groups"),
|
||||||
|
locale("joined_false_link", "message").format(
|
||||||
|
member.from_user.first_name, member.from_user.id
|
||||||
|
),
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sus_allow", "button")), callback_data=f"sus_allow_{member.from_user.id}")
|
[
|
||||||
],
|
InlineKeyboardButton(
|
||||||
[
|
text=str(locale("sus_allow", "button")),
|
||||||
InlineKeyboardButton(text=str(locale("sus_reject", "button")), callback_data=f"sus_reject_{member.from_user.id}")
|
callback_data=f"sus_allow_{member.from_user.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=str(locale("sus_reject", "button")),
|
||||||
|
callback_data=f"sus_reject_{member.from_user.id}",
|
||||||
|
)
|
||||||
|
],
|
||||||
]
|
]
|
||||||
]
|
),
|
||||||
))
|
)
|
||||||
await app.restrict_chat_member(member.chat.id, member.from_user.id, permissions=ChatPermissions(
|
await app.restrict_chat_member(
|
||||||
|
member.chat.id,
|
||||||
|
member.from_user.id,
|
||||||
|
permissions=ChatPermissions(
|
||||||
can_send_messages=False,
|
can_send_messages=False,
|
||||||
can_send_media_messages=False,
|
can_send_media_messages=False,
|
||||||
can_send_other_messages=False,
|
can_send_other_messages=False,
|
||||||
can_send_polls=False
|
can_send_polls=False,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -7,7 +7,13 @@ from modules.logging import logWrite
|
|||||||
from modules.utils import configGet, locale
|
from modules.utils import configGet, locale
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
@app.on_message(custom_filters.enabled_dinovoice & ~filters.scheduled & filters.voice & filters.chat(configGet("users", "groups")))
|
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_dinovoice
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.voice
|
||||||
|
& filters.chat(configGet("users", "groups"))
|
||||||
|
)
|
||||||
async def voice_message(app: Client, msg: Message):
|
async def voice_message(app: Client, msg: Message):
|
||||||
logWrite(f"User {msg.from_user.id} sent voice message in destination group")
|
logWrite(f"User {msg.from_user.id} sent voice message in destination group")
|
||||||
await msg.reply_text(choice(locale("voice_message", "message")))
|
await msg.reply_text(choice(locale("voice_message", "message")))
|
@ -12,7 +12,15 @@ for pattern in all_locales("welcome", "keyboard"):
|
|||||||
welcome_1.append(pattern[0][0])
|
welcome_1.append(pattern[0][0])
|
||||||
for pattern in all_locales("return", "keyboard"):
|
for pattern in all_locales("return", "keyboard"):
|
||||||
welcome_1.append(pattern[0][0])
|
welcome_1.append(pattern[0][0])
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.private & filters.command(welcome_1, prefixes=[""]) & ~custom_filters.banned)
|
|
||||||
|
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(welcome_1, prefixes=[""])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
async def welcome_pass(app: Client, msg: Message, once_again: bool = False) -> None:
|
async def welcome_pass(app: Client, msg: Message, once_again: bool = False) -> None:
|
||||||
"""Set user's stage to 1 and start a fresh application
|
"""Set user's stage to 1 and start a fresh application
|
||||||
|
|
||||||
@ -33,15 +41,37 @@ async def welcome_pass(app: Client, msg: Message, once_again: bool = False) -> N
|
|||||||
if once_again is True:
|
if once_again is True:
|
||||||
logWrite(f"User {msg.from_user.id} confirmed starting the application")
|
logWrite(f"User {msg.from_user.id} confirmed starting the application")
|
||||||
else:
|
else:
|
||||||
logWrite(f"User {msg.from_user.id} confirmed starting the application once again")
|
logWrite(
|
||||||
await msg.reply_text(locale("question1", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("question1", "force_reply", locale=msg.from_user)))
|
f"User {msg.from_user.id} confirmed starting the application once again"
|
||||||
|
)
|
||||||
|
await msg.reply_text(
|
||||||
|
locale("question1", "message", locale=msg.from_user),
|
||||||
|
reply_markup=ForceReply(
|
||||||
|
placeholder=locale("question1", "force_reply", locale=msg.from_user)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
welcome_2 = []
|
welcome_2 = []
|
||||||
for pattern in all_locales("welcome", "keyboard"):
|
for pattern in all_locales("welcome", "keyboard"):
|
||||||
welcome_2.append(pattern[1][0])
|
welcome_2.append(pattern[1][0])
|
||||||
@app.on_message(custom_filters.enabled_applications & ~filters.scheduled & filters.private & filters.command(welcome_2, prefixes=[""]) & ~custom_filters.banned)
|
|
||||||
async def welcome_reject(app: Client, msg: Message):
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.on_message(
|
||||||
|
custom_filters.enabled_applications
|
||||||
|
& ~filters.scheduled
|
||||||
|
& filters.private
|
||||||
|
& filters.command(welcome_2, prefixes=[""])
|
||||||
|
& ~custom_filters.banned
|
||||||
|
)
|
||||||
|
async def welcome_reject(app: Client, msg: Message):
|
||||||
logWrite(f"User {msg.from_user.id} rejected to start the application")
|
logWrite(f"User {msg.from_user.id} rejected to start the application")
|
||||||
await msg.reply_text(locale("goodbye", "message", locale=msg.from_user), reply_markup=ReplyKeyboardMarkup(locale("return", "keyboard", locale=msg.from_user), resize_keyboard=True))
|
await msg.reply_text(
|
||||||
|
locale("goodbye", "message", locale=msg.from_user),
|
||||||
|
reply_markup=ReplyKeyboardMarkup(
|
||||||
|
locale("return", "keyboard", locale=msg.from_user), resize_keyboard=True
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@ -4,7 +4,13 @@ all inline queries that bot receives"""
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from os import path, sep
|
from os import path, sep
|
||||||
from app import app, isAnAdmin
|
from app import app, isAnAdmin
|
||||||
from pyrogram.types import InlineQueryResultArticle, InputTextMessageContent, InlineQuery, InlineKeyboardMarkup, InlineKeyboardButton
|
from pyrogram.types import (
|
||||||
|
InlineQueryResultArticle,
|
||||||
|
InputTextMessageContent,
|
||||||
|
InlineQuery,
|
||||||
|
InlineKeyboardMarkup,
|
||||||
|
InlineKeyboardButton,
|
||||||
|
)
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from pyrogram.enums.chat_type import ChatType
|
from pyrogram.enums.chat_type import ChatType
|
||||||
from pyrogram.enums.chat_members_filter import ChatMembersFilter
|
from pyrogram.enums.chat_members_filter import ChatMembersFilter
|
||||||
@ -17,51 +23,95 @@ from modules.database import col_applications, col_spoilers
|
|||||||
from bson.objectid import ObjectId
|
from bson.objectid import ObjectId
|
||||||
from bson.errors import InvalidId
|
from bson.errors import InvalidId
|
||||||
|
|
||||||
|
|
||||||
@app.on_inline_query()
|
@app.on_inline_query()
|
||||||
async def inline_answer(client: Client, inline_query: InlineQuery):
|
async def inline_answer(client: Client, inline_query: InlineQuery):
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
if configGet("allow_external", "features", "spoilers") is True:
|
if configGet("allow_external", "features", "spoilers") is True:
|
||||||
|
|
||||||
if inline_query.query.startswith("spoiler:"):
|
if inline_query.query.startswith("spoiler:"):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
spoil = col_spoilers.find_one(
|
||||||
spoil = col_spoilers.find_one( {"_id": ObjectId(inline_query.query.removeprefix("spoiler:"))} )
|
{"_id": ObjectId(inline_query.query.removeprefix("spoiler:"))}
|
||||||
|
)
|
||||||
|
|
||||||
if spoil is not None:
|
if spoil is not None:
|
||||||
|
desc = (
|
||||||
desc = locale("spoiler_empty", "message", locale=inline_query.from_user).format(locale(spoil["category"], "message", "spoiler_categories")) if spoil["description"] == "" else locale("spoiler_described", "message", locale=inline_query.from_user).format(locale(spoil["category"], "message", "spoiler_categories"), spoil["description"])
|
locale(
|
||||||
|
"spoiler_empty", "message", locale=inline_query.from_user
|
||||||
|
).format(
|
||||||
|
locale(spoil["category"], "message", "spoiler_categories")
|
||||||
|
)
|
||||||
|
if spoil["description"] == ""
|
||||||
|
else locale(
|
||||||
|
"spoiler_described",
|
||||||
|
"message",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(
|
||||||
|
locale(spoil["category"], "message", "spoiler_categories"),
|
||||||
|
spoil["description"],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
results = [
|
results = [
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=locale("title", "inline", "spoiler", locale=inline_query.from_user),
|
title=locale(
|
||||||
description=locale("description", "inline", "spoiler", locale=inline_query.from_user),
|
"title",
|
||||||
input_message_content=InputTextMessageContent(desc, disable_web_page_preview=True),
|
"inline",
|
||||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_view", "button", locale=inline_query.from_user), callback_data=f'sid_{inline_query.query.removeprefix("spoiler:")}')]])
|
"spoiler",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
),
|
||||||
|
description=locale(
|
||||||
|
"description",
|
||||||
|
"inline",
|
||||||
|
"spoiler",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
),
|
||||||
|
input_message_content=InputTextMessageContent(
|
||||||
|
desc, disable_web_page_preview=True
|
||||||
|
),
|
||||||
|
reply_markup=InlineKeyboardMarkup(
|
||||||
|
[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
locale(
|
||||||
|
"spoiler_view",
|
||||||
|
"button",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
),
|
||||||
|
callback_data=f'sid_{inline_query.query.removeprefix("spoiler:")}',
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
),
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
except InvalidId:
|
except InvalidId:
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
|
await inline_query.answer(results=results)
|
||||||
await inline_query.answer(
|
|
||||||
results=results
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if inline_query.chat_type in [ChatType.CHANNEL]:
|
if inline_query.chat_type in [ChatType.CHANNEL]:
|
||||||
await inline_query.answer(
|
await inline_query.answer(
|
||||||
results=[
|
results=[
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=locale("title", "inline", "not_pm", locale=inline_query.from_user),
|
title=locale(
|
||||||
input_message_content=InputTextMessageContent(
|
"title", "inline", "not_pm", locale=inline_query.from_user
|
||||||
locale("message_content", "inline", "not_pm", locale=inline_query.from_user)
|
),
|
||||||
),
|
input_message_content=InputTextMessageContent(
|
||||||
description=locale("description", "inline", "not_pm", locale=inline_query.from_user)
|
locale(
|
||||||
|
"message_content",
|
||||||
|
"inline",
|
||||||
|
"not_pm",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
description=locale(
|
||||||
|
"description", "inline", "not_pm", locale=inline_query.from_user
|
||||||
|
),
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@ -71,39 +121,59 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
|
|||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=locale("title", "inline", "forbidden", locale=inline_query.from_user),
|
title=locale("title", "inline", "forbidden", locale=inline_query.from_user),
|
||||||
input_message_content=InputTextMessageContent(
|
input_message_content=InputTextMessageContent(
|
||||||
locale("message_content", "inline", "forbidden", locale=inline_query.from_user)
|
locale(
|
||||||
|
"message_content",
|
||||||
|
"inline",
|
||||||
|
"forbidden",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
description=locale(
|
||||||
|
"description", "inline", "forbidden", locale=inline_query.from_user
|
||||||
),
|
),
|
||||||
description=locale("description", "inline", "forbidden", locale=inline_query.from_user)
|
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
holo_user = HoloUser(inline_query.from_user)
|
holo_user = HoloUser(inline_query.from_user)
|
||||||
except (UserNotFoundError, UserInvalidError):
|
except (UserNotFoundError, UserInvalidError):
|
||||||
logWrite(f"Could not find application of {inline_query.from_user.id}, ignoring inline query", debug=True)
|
logWrite(
|
||||||
await inline_query.answer(
|
f"Could not find application of {inline_query.from_user.id}, ignoring inline query",
|
||||||
results=results_forbidden
|
debug=True,
|
||||||
)
|
)
|
||||||
|
await inline_query.answer(results=results_forbidden)
|
||||||
return
|
return
|
||||||
|
|
||||||
if path.exists(path.join(configGet("cache", "locations"), "group_members")) and (inline_query.from_user.id not in jsonLoad(path.join(configGet("cache", "locations"), "group_members"))):
|
if path.exists(path.join(configGet("cache", "locations"), "group_members")) and (
|
||||||
if path.exists(path.join(configGet("cache", "locations"), "admins")) and (inline_query.from_user.id not in jsonLoad(path.join(configGet("cache", "locations"), "admins"))):
|
inline_query.from_user.id
|
||||||
logWrite(f"{inline_query.from_user.id} is not an admin and not in members group, ignoring inline query", debug=True)
|
not in jsonLoad(path.join(configGet("cache", "locations"), "group_members"))
|
||||||
await inline_query.answer(
|
):
|
||||||
results=results_forbidden
|
if path.exists(path.join(configGet("cache", "locations"), "admins")) and (
|
||||||
|
inline_query.from_user.id
|
||||||
|
not in jsonLoad(path.join(configGet("cache", "locations"), "admins"))
|
||||||
|
):
|
||||||
|
logWrite(
|
||||||
|
f"{inline_query.from_user.id} is not an admin and not in members group, ignoring inline query",
|
||||||
|
debug=True,
|
||||||
)
|
)
|
||||||
|
await inline_query.answer(results=results_forbidden)
|
||||||
return
|
return
|
||||||
|
|
||||||
if holo_user.application_approved() or (await isAnAdmin(holo_user.id) is True):
|
if holo_user.application_approved() or (await isAnAdmin(holo_user.id) is True):
|
||||||
|
max_results = (
|
||||||
max_results = configGet("inline_preview_count") if inline_query.query != "" else 200
|
configGet("inline_preview_count") if inline_query.query != "" else 200
|
||||||
|
)
|
||||||
|
|
||||||
list_of_users = []
|
list_of_users = []
|
||||||
async for m in app.get_chat_members(configGet("users", "groups"), limit=max_results, filter=ChatMembersFilter.SEARCH, query=inline_query.query):
|
async for m in app.get_chat_members(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
limit=max_results,
|
||||||
|
filter=ChatMembersFilter.SEARCH,
|
||||||
|
query=inline_query.query,
|
||||||
|
):
|
||||||
list_of_users.append(m)
|
list_of_users.append(m)
|
||||||
|
|
||||||
for match in list_of_users:
|
for match in list_of_users:
|
||||||
|
|
||||||
application = col_applications.find_one({"user": match.user.id})
|
application = col_applications.find_one({"user": match.user.id})
|
||||||
|
|
||||||
if application is None:
|
if application is None:
|
||||||
@ -112,34 +182,63 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
|
|||||||
application_content = []
|
application_content = []
|
||||||
i = 1
|
i = 1
|
||||||
|
|
||||||
for question in application['application']:
|
for question in application["application"]:
|
||||||
|
|
||||||
if i == 2:
|
if i == 2:
|
||||||
age = relativedelta(datetime.now(), application['application']['2'])
|
age = relativedelta(datetime.now(), application["application"]["2"])
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)"
|
||||||
|
)
|
||||||
elif i == 3:
|
elif i == 3:
|
||||||
if application['application']['3']['countryCode'] == "UA":
|
if application["application"]["3"]["countryCode"] == "UA":
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application']['3']['name']}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application']['3']['name']}"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application'][question]}")
|
application_content.append(
|
||||||
|
f"{locale(f'question{i}', 'message', 'question_titles', locale=inline_query.from_user)} {application['application'][question]}"
|
||||||
|
)
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
if match.user.photo != None:
|
if match.user.photo != None:
|
||||||
try:
|
try:
|
||||||
if not path.exists(f'{configGet("cache", "locations")}{sep}avatars{sep}{match.user.photo.big_file_id}'):
|
if not path.exists(
|
||||||
print(f'Downloaded avatar {match.user.photo.big_file_id} of {match.user.id} and uploaded to {configGet("api")}/?avatar_id={match.user.photo.big_file_id}', flush=True)
|
f'{configGet("cache", "locations")}{sep}avatars{sep}{match.user.photo.big_file_id}'
|
||||||
await app.download_media(match.user.photo.big_file_id, file_name=f'{configGet("cache", "locations")}{sep}avatars{sep}{match.user.photo.big_file_id}')
|
):
|
||||||
|
print(
|
||||||
|
f'Downloaded avatar {match.user.photo.big_file_id} of {match.user.id} and uploaded to {configGet("api")}/?avatar_id={match.user.photo.big_file_id}',
|
||||||
|
flush=True,
|
||||||
|
)
|
||||||
|
await app.download_media(
|
||||||
|
match.user.photo.big_file_id,
|
||||||
|
file_name=f'{configGet("cache", "locations")}{sep}avatars{sep}{match.user.photo.big_file_id}',
|
||||||
|
)
|
||||||
results.append(
|
results.append(
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=str(match.user.first_name),
|
title=str(match.user.first_name),
|
||||||
input_message_content=InputTextMessageContent(
|
input_message_content=InputTextMessageContent(
|
||||||
locale("message_content", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username, "\n".join(application_content))
|
locale(
|
||||||
|
"message_content",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(
|
||||||
|
match.user.first_name,
|
||||||
|
match.user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
description=locale("description", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username),
|
description=locale(
|
||||||
thumb_url=f'{configGet("api")}/?avatar_id={match.user.photo.big_file_id}'
|
"description",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(match.user.first_name, match.user.username),
|
||||||
|
thumb_url=f'{configGet("api")}/?avatar_id={match.user.photo.big_file_id}',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@ -147,9 +246,23 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
|
|||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=str(match.user.first_name),
|
title=str(match.user.first_name),
|
||||||
input_message_content=InputTextMessageContent(
|
input_message_content=InputTextMessageContent(
|
||||||
locale("message_content", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username, "\n".join(application_content))
|
locale(
|
||||||
|
"message_content",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(
|
||||||
|
match.user.first_name,
|
||||||
|
match.user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
description=locale("description", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username)
|
description=locale(
|
||||||
|
"description",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(match.user.first_name, match.user.username),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
@ -157,9 +270,23 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
|
|||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=str(match.user.first_name),
|
title=str(match.user.first_name),
|
||||||
input_message_content=InputTextMessageContent(
|
input_message_content=InputTextMessageContent(
|
||||||
locale("message_content", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username, "\n".join(application_content))
|
locale(
|
||||||
|
"message_content",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(
|
||||||
|
match.user.first_name,
|
||||||
|
match.user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
description=locale("description", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username)
|
description=locale(
|
||||||
|
"description",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(match.user.first_name, match.user.username),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@ -167,14 +294,24 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
|
|||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=str(match.user.first_name),
|
title=str(match.user.first_name),
|
||||||
input_message_content=InputTextMessageContent(
|
input_message_content=InputTextMessageContent(
|
||||||
locale("message_content", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username, "\n".join(application_content))
|
locale(
|
||||||
|
"message_content",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(
|
||||||
|
match.user.first_name,
|
||||||
|
match.user.username,
|
||||||
|
"\n".join(application_content),
|
||||||
|
)
|
||||||
),
|
),
|
||||||
description=locale("description", "inline", "user", locale=inline_query.from_user).format(match.user.first_name, match.user.username)
|
description=locale(
|
||||||
|
"description",
|
||||||
|
"inline",
|
||||||
|
"user",
|
||||||
|
locale=inline_query.from_user,
|
||||||
|
).format(match.user.first_name, match.user.username),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
await inline_query.answer(
|
await inline_query.answer(results=results, cache_time=10, is_personal=True)
|
||||||
results=results,
|
|
||||||
cache_time=10,
|
|
||||||
is_personal=True
|
|
||||||
)
|
|
||||||
|
@ -5,12 +5,13 @@ from shutil import copyfileobj
|
|||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
with open(getcwd()+path.sep+"config.json", "r", encoding='utf8') as file:
|
with open(getcwd() + path.sep + "config.json", "r", encoding="utf8") as file:
|
||||||
json_contents = loads(file.read())
|
json_contents = loads(file.read())
|
||||||
log_size = json_contents["logging"]["size"]
|
log_size = json_contents["logging"]["size"]
|
||||||
log_folder = json_contents["logging"]["location"]
|
log_folder = json_contents["logging"]["location"]
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
|
|
||||||
# Check latest log size
|
# Check latest log size
|
||||||
def checkSize(debug=False):
|
def checkSize(debug=False):
|
||||||
"""Check size of latest.log file and rotate it if needed
|
"""Check size of latest.log file and rotate it if needed
|
||||||
@ -30,15 +31,24 @@ def checkSize(debug=False):
|
|||||||
makedirs(log_folder, exist_ok=True)
|
makedirs(log_folder, exist_ok=True)
|
||||||
log = stat(path.join(log_folder, log_file))
|
log = stat(path.join(log_folder, log_file))
|
||||||
if (log.st_size / 1024) > log_size:
|
if (log.st_size / 1024) > log_size:
|
||||||
with open(path.join(log_folder, log_file), 'rb') as f_in:
|
with open(path.join(log_folder, log_file), "rb") as f_in:
|
||||||
with gzipopen(path.join(log_folder, f'{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.log.gz'), 'wb') as f_out:
|
with gzipopen(
|
||||||
|
path.join(
|
||||||
|
log_folder,
|
||||||
|
f'{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.log.gz',
|
||||||
|
),
|
||||||
|
"wb",
|
||||||
|
) as f_out:
|
||||||
copyfileobj(f_in, f_out)
|
copyfileobj(f_in, f_out)
|
||||||
print(f'Copied {path.join(log_folder, datetime.now().strftime("%d.%m.%Y_%H:%M:%S"))}.log.gz')
|
print(
|
||||||
open(path.join(log_folder, log_file), 'w').close()
|
f'Copied {path.join(log_folder, datetime.now().strftime("%d.%m.%Y_%H:%M:%S"))}.log.gz'
|
||||||
|
)
|
||||||
|
open(path.join(log_folder, log_file), "w").close()
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print(f'Log file {path.join(log_folder, log_file)} does not exist')
|
print(f"Log file {path.join(log_folder, log_file)} does not exist")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# Append string to log
|
# Append string to log
|
||||||
def logAppend(message: str, debug=False):
|
def logAppend(message: str, debug=False):
|
||||||
"""Write message to log file
|
"""Write message to log file
|
||||||
@ -58,10 +68,11 @@ def logAppend(message: str, debug=False):
|
|||||||
else:
|
else:
|
||||||
log_file = "latest.log"
|
log_file = "latest.log"
|
||||||
|
|
||||||
log = open(path.join(log_folder, log_file), 'a')
|
log = open(path.join(log_folder, log_file), "a")
|
||||||
log.write(f'{message_formatted}\n')
|
log.write(f"{message_formatted}\n")
|
||||||
log.close()
|
log.close()
|
||||||
|
|
||||||
|
|
||||||
# Print to stdout and then to log
|
# Print to stdout and then to log
|
||||||
def logWrite(message: str, debug=False):
|
def logWrite(message: str, debug=False):
|
||||||
"""Write message to stdout and log file
|
"""Write message to stdout and log file
|
||||||
@ -71,5 +82,5 @@ def logWrite(message: str, debug=False):
|
|||||||
* debug (`bool`, *optional*): Whether this is a debug log. Defaults to `False`.
|
* debug (`bool`, *optional*): Whether this is a debug log. Defaults to `False`.
|
||||||
"""
|
"""
|
||||||
# save to log file and rotation is to be done
|
# save to log file and rotation is to be done
|
||||||
logAppend(f'{message}', debug=debug)
|
logAppend(f"{message}", debug=debug)
|
||||||
print(f"{message}", flush=True)
|
print(f"{message}", flush=True)
|
@ -8,7 +8,11 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from ujson import dumps
|
from ujson import dumps
|
||||||
from app import app
|
from app import app
|
||||||
from pyrogram.types import BotCommand, BotCommandScopeChat, BotCommandScopeChatAdministrators
|
from pyrogram.types import (
|
||||||
|
BotCommand,
|
||||||
|
BotCommandScopeChat,
|
||||||
|
BotCommandScopeChatAdministrators,
|
||||||
|
)
|
||||||
from pyrogram.errors import bad_request_400
|
from pyrogram.errors import bad_request_400
|
||||||
from pyrogram.enums.chat_members_filter import ChatMembersFilter
|
from pyrogram.enums.chat_members_filter import ChatMembersFilter
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
@ -21,18 +25,27 @@ from requests import get
|
|||||||
scheduler = AsyncIOScheduler()
|
scheduler = AsyncIOScheduler()
|
||||||
|
|
||||||
if configGet("enabled", "scheduler", "cache_members"):
|
if configGet("enabled", "scheduler", "cache_members"):
|
||||||
@scheduler.scheduled_job(trigger="interval", seconds=configGet("interval", "scheduler", "cache_members"))
|
|
||||||
|
@scheduler.scheduled_job(
|
||||||
|
trigger="interval", seconds=configGet("interval", "scheduler", "cache_members")
|
||||||
|
)
|
||||||
async def cache_group_members():
|
async def cache_group_members():
|
||||||
list_of_users = []
|
list_of_users = []
|
||||||
async for member in app.get_chat_members(configGet("users", "groups")):
|
async for member in app.get_chat_members(configGet("users", "groups")):
|
||||||
list_of_users.append(member.user.id)
|
list_of_users.append(member.user.id)
|
||||||
makedirs(configGet("cache", "locations"), exist_ok=True)
|
makedirs(configGet("cache", "locations"), exist_ok=True)
|
||||||
jsonSave(list_of_users, path.join(configGet("cache", "locations"), "group_members"))
|
jsonSave(
|
||||||
|
list_of_users, path.join(configGet("cache", "locations"), "group_members")
|
||||||
|
)
|
||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
logWrite("User group caching performed", debug=True)
|
logWrite("User group caching performed", debug=True)
|
||||||
|
|
||||||
|
|
||||||
if configGet("enabled", "scheduler", "cache_admins"):
|
if configGet("enabled", "scheduler", "cache_admins"):
|
||||||
@scheduler.scheduled_job(trigger="interval", seconds=configGet("interval", "scheduler", "cache_admins"))
|
|
||||||
|
@scheduler.scheduled_job(
|
||||||
|
trigger="interval", seconds=configGet("interval", "scheduler", "cache_admins")
|
||||||
|
)
|
||||||
async def cache_admins():
|
async def cache_admins():
|
||||||
list_of_users = []
|
list_of_users = []
|
||||||
async for member in app.get_chat_members(configGet("admin", "groups")):
|
async for member in app.get_chat_members(configGet("admin", "groups")):
|
||||||
@ -42,37 +55,66 @@ if configGet("enabled", "scheduler", "cache_admins"):
|
|||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
logWrite("Admin group caching performed", debug=True)
|
logWrite("Admin group caching performed", debug=True)
|
||||||
|
|
||||||
|
|
||||||
# Cache the avatars of group members
|
# Cache the avatars of group members
|
||||||
if configGet("enabled", "scheduler", "cache_avatars"):
|
if configGet("enabled", "scheduler", "cache_avatars"):
|
||||||
@scheduler.scheduled_job(trigger="date", run_date=datetime.now()+timedelta(seconds=15))
|
|
||||||
@scheduler.scheduled_job(trigger="interval", hours=configGet("interval", "scheduler", "cache_avatars"))
|
@scheduler.scheduled_job(
|
||||||
|
trigger="date", run_date=datetime.now() + timedelta(seconds=15)
|
||||||
|
)
|
||||||
|
@scheduler.scheduled_job(
|
||||||
|
trigger="interval", hours=configGet("interval", "scheduler", "cache_avatars")
|
||||||
|
)
|
||||||
async def cache_avatars():
|
async def cache_avatars():
|
||||||
list_of_users = []
|
list_of_users = []
|
||||||
async for member in app.get_chat_members(configGet("users", "groups"), filter=ChatMembersFilter.SEARCH, query=""):
|
async for member in app.get_chat_members(
|
||||||
|
configGet("users", "groups"), filter=ChatMembersFilter.SEARCH, query=""
|
||||||
|
):
|
||||||
list_of_users.append(member.user)
|
list_of_users.append(member.user)
|
||||||
for user in list_of_users:
|
for user in list_of_users:
|
||||||
if user.photo != None:
|
if user.photo != None:
|
||||||
if not path.exists(f'{configGet("cache", "locations")}{sep}avatars{sep}{user.photo.big_file_id}'):
|
if not path.exists(
|
||||||
print(f'Pre-cached avatar {user.photo.big_file_id} of {user.id}', flush=True)
|
f'{configGet("cache", "locations")}{sep}avatars{sep}{user.photo.big_file_id}'
|
||||||
await app.download_media(user.photo.big_file_id, file_name=path.join(configGet("cache", "locations"), "avatars", user.photo.big_file_id))
|
):
|
||||||
|
print(
|
||||||
|
f"Pre-cached avatar {user.photo.big_file_id} of {user.id}",
|
||||||
|
flush=True,
|
||||||
|
)
|
||||||
|
await app.download_media(
|
||||||
|
user.photo.big_file_id,
|
||||||
|
file_name=path.join(
|
||||||
|
configGet("cache", "locations"),
|
||||||
|
"avatars",
|
||||||
|
user.photo.big_file_id,
|
||||||
|
),
|
||||||
|
)
|
||||||
logWrite("Avatars caching performed")
|
logWrite("Avatars caching performed")
|
||||||
|
|
||||||
|
|
||||||
# Check for birthdays
|
# Check for birthdays
|
||||||
if configGet("enabled", "features", "applications") is True:
|
if configGet("enabled", "features", "applications") is True:
|
||||||
if configGet("enabled", "scheduler", "birthdays") is True:
|
if configGet("enabled", "scheduler", "birthdays") is True:
|
||||||
@scheduler.scheduled_job(trigger="cron", hour=configGet("time", "scheduler", "birthdays"))
|
|
||||||
|
@scheduler.scheduled_job(
|
||||||
|
trigger="cron", hour=configGet("time", "scheduler", "birthdays")
|
||||||
|
)
|
||||||
async def check_birthdays():
|
async def check_birthdays():
|
||||||
for entry in col_applications.find():
|
for entry in col_applications.find():
|
||||||
if entry["application"]["2"].strftime("%d.%m") == datetime.now().strftime("%d.%m"):
|
if entry["application"]["2"].strftime(
|
||||||
|
"%d.%m"
|
||||||
|
) == datetime.now().strftime("%d.%m"):
|
||||||
try:
|
try:
|
||||||
if entry["user"] not in jsonLoad(path.join(configGet("cache", "locations"), "group_members")):
|
if entry["user"] not in jsonLoad(
|
||||||
|
path.join(configGet("cache", "locations"), "group_members")
|
||||||
|
):
|
||||||
continue
|
continue
|
||||||
tg_user = await app.get_users(entry["user"])
|
tg_user = await app.get_users(entry["user"])
|
||||||
await app.send_message( configGet("admin", "groups"), locale("birthday", "message").format(str(tg_user.first_name), str(tg_user.username), str(relativedelta(datetime.now(), entry["application"]["2"], '%d.%m.%Y').years)) ) # type: ignore
|
await app.send_message(configGet("admin", "groups"), locale("birthday", "message").format(str(tg_user.first_name), str(tg_user.username), str(relativedelta(datetime.now(), entry["application"]["2"], "%d.%m.%Y").years))) # type: ignore
|
||||||
logWrite(f"Notified admins about {entry['user']}'s birthday")
|
logWrite(f"Notified admins about {entry['user']}'s birthday")
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not find user {entry['user']} to send a message about birthday due to '{exp}'")
|
logWrite(
|
||||||
|
f"Could not find user {entry['user']} to send a message about birthday due to '{exp}'"
|
||||||
|
)
|
||||||
continue
|
continue
|
||||||
logWrite("Birthdays check performed")
|
logWrite("Birthdays check performed")
|
||||||
|
|
||||||
@ -80,42 +122,71 @@ if configGet("enabled", "features", "applications") is True:
|
|||||||
# Check for expired sponsorships
|
# Check for expired sponsorships
|
||||||
if configGet("enabled", "features", "sponsorships") is True:
|
if configGet("enabled", "features", "sponsorships") is True:
|
||||||
if configGet("enabled", "scheduler", "sponsorships") is True:
|
if configGet("enabled", "scheduler", "sponsorships") is True:
|
||||||
@scheduler.scheduled_job(trigger="cron", hour=configGet("time", "scheduler", "sponsorships"))
|
|
||||||
|
@scheduler.scheduled_job(
|
||||||
|
trigger="cron", hour=configGet("time", "scheduler", "sponsorships")
|
||||||
|
)
|
||||||
async def check_sponsors():
|
async def check_sponsors():
|
||||||
for entry in col_sponsorships.find({"sponsorship.expires": {"$lt": datetime.now()+timedelta(days=2)}}):
|
for entry in col_sponsorships.find(
|
||||||
|
{"sponsorship.expires": {"$lt": datetime.now() + timedelta(days=2)}}
|
||||||
|
):
|
||||||
try:
|
try:
|
||||||
if entry["user"] not in jsonLoad(path.join(configGet("cache", "locations"), "group_members")):
|
if entry["user"] not in jsonLoad(
|
||||||
|
path.join(configGet("cache", "locations"), "group_members")
|
||||||
|
):
|
||||||
continue
|
continue
|
||||||
tg_user = await app.get_users(entry["user"])
|
tg_user = await app.get_users(entry["user"])
|
||||||
until_expiry = abs(relativedelta(datetime.now(), entry["sponsorship"]["expires"]).days)+1
|
until_expiry = (
|
||||||
await app.send_message( tg_user.id, locale("sponsorships_expires", "message").format(until_expiry) ) # type: ignore
|
abs(
|
||||||
logWrite(f"Notified user {entry['user']} that sponsorship expires in {until_expiry} days")
|
relativedelta(
|
||||||
|
datetime.now(), entry["sponsorship"]["expires"]
|
||||||
|
).days
|
||||||
|
)
|
||||||
|
+ 1
|
||||||
|
)
|
||||||
|
await app.send_message(tg_user.id, locale("sponsorships_expires", "message").format(until_expiry)) # type: ignore
|
||||||
|
logWrite(
|
||||||
|
f"Notified user {entry['user']} that sponsorship expires in {until_expiry} days"
|
||||||
|
)
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not find user {entry['user']} notify about sponsorship expiry due to '{exp}'")
|
logWrite(
|
||||||
|
f"Could not find user {entry['user']} notify about sponsorship expiry due to '{exp}'"
|
||||||
|
)
|
||||||
continue
|
continue
|
||||||
for entry in col_sponsorships.find({"sponsorship.expires": {"$lt": datetime.now()-timedelta(days=1)}}):
|
for entry in col_sponsorships.find(
|
||||||
|
{"sponsorship.expires": {"$lt": datetime.now() - timedelta(days=1)}}
|
||||||
|
):
|
||||||
try:
|
try:
|
||||||
holo_user = HoloUser(entry["user"])
|
holo_user = HoloUser(entry["user"])
|
||||||
col_sponsorships.find_one_and_delete({"user": holo_user.id})
|
col_sponsorships.find_one_and_delete({"user": holo_user.id})
|
||||||
if entry["user"] not in jsonLoad(path.join(configGet("cache", "locations"), "group_members")):
|
if entry["user"] not in jsonLoad(
|
||||||
|
path.join(configGet("cache", "locations"), "group_members")
|
||||||
|
):
|
||||||
continue
|
continue
|
||||||
await app.send_message( entry["user"], locale("sponsorships_expired", "message") ) # type: ignore
|
await app.send_message(entry["user"], locale("sponsorships_expired", "message")) # type: ignore
|
||||||
await holo_user.label_reset(configGet("users", "groups"))
|
await holo_user.label_reset(configGet("users", "groups"))
|
||||||
try:
|
try:
|
||||||
tg_user = await app.get_users(entry["user"])
|
tg_user = await app.get_users(entry["user"])
|
||||||
logWrite(f"Notified user {entry['user']} that sponsorship expired")
|
logWrite(
|
||||||
|
f"Notified user {entry['user']} that sponsorship expired"
|
||||||
|
)
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not find user {entry['user']} notify about sponsorship expired due to '{exp}'")
|
logWrite(
|
||||||
|
f"Could not find user {entry['user']} notify about sponsorship expired due to '{exp}'"
|
||||||
|
)
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not reset label of user {entry['user']} due to '{exp}'")
|
logWrite(
|
||||||
|
f"Could not reset label of user {entry['user']} due to '{exp}'"
|
||||||
|
)
|
||||||
continue
|
continue
|
||||||
logWrite("Sponsorships check performed")
|
logWrite("Sponsorships check performed")
|
||||||
|
|
||||||
|
|
||||||
# Register all bot commands
|
# Register all bot commands
|
||||||
@scheduler.scheduled_job(trigger="date", run_date=datetime.now()+timedelta(seconds=10))
|
@scheduler.scheduled_job(
|
||||||
|
trigger="date", run_date=datetime.now() + timedelta(seconds=10)
|
||||||
|
)
|
||||||
async def commands_register():
|
async def commands_register():
|
||||||
|
|
||||||
commands = {
|
commands = {
|
||||||
"users": [],
|
"users": [],
|
||||||
"admins": [],
|
"admins": [],
|
||||||
@ -123,7 +194,7 @@ async def commands_register():
|
|||||||
"group_users": [],
|
"group_users": [],
|
||||||
"group_admins": [],
|
"group_admins": [],
|
||||||
"group_users_admins": [],
|
"group_users_admins": [],
|
||||||
"locales": {}
|
"locales": {},
|
||||||
}
|
}
|
||||||
|
|
||||||
commands_raw = {
|
commands_raw = {
|
||||||
@ -133,7 +204,7 @@ async def commands_register():
|
|||||||
"group_users": [],
|
"group_users": [],
|
||||||
"group_admins": [],
|
"group_admins": [],
|
||||||
"group_users_admins": [],
|
"group_users_admins": [],
|
||||||
"locales": {}
|
"locales": {},
|
||||||
}
|
}
|
||||||
|
|
||||||
valid_locales = []
|
valid_locales = []
|
||||||
@ -148,7 +219,7 @@ async def commands_register():
|
|||||||
"owner": [],
|
"owner": [],
|
||||||
"group_users": [],
|
"group_users": [],
|
||||||
"group_admins": [],
|
"group_admins": [],
|
||||||
"group_users_admins": []
|
"group_users_admins": [],
|
||||||
}
|
}
|
||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
commands_raw["locales"][".".join(entry.split(".")[:-1])] = {
|
commands_raw["locales"][".".join(entry.split(".")[:-1])] = {
|
||||||
@ -157,15 +228,13 @@ async def commands_register():
|
|||||||
"owner": [],
|
"owner": [],
|
||||||
"group_users": [],
|
"group_users": [],
|
||||||
"group_admins": [],
|
"group_admins": [],
|
||||||
"group_users_admins": []
|
"group_users_admins": [],
|
||||||
}
|
}
|
||||||
|
|
||||||
config_modules = configGet("features")
|
config_modules = configGet("features")
|
||||||
config_commands = configGet("commands")
|
config_commands = configGet("commands")
|
||||||
|
|
||||||
|
|
||||||
for command in config_commands:
|
for command in config_commands:
|
||||||
|
|
||||||
enabled = False
|
enabled = False
|
||||||
|
|
||||||
for module in config_commands[command]["modules"]:
|
for module in config_commands[command]["modules"]:
|
||||||
@ -177,22 +246,27 @@ async def commands_register():
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
for permission in config_commands[command]["permissions"]:
|
for permission in config_commands[command]["permissions"]:
|
||||||
|
commands[permission].append(
|
||||||
commands[permission].append(BotCommand(command, locale("commands")[command]))
|
BotCommand(command, locale("commands")[command])
|
||||||
|
)
|
||||||
|
|
||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
commands_raw[permission].append({f"{command}": locale("commands")[command]})
|
commands_raw[permission].append(
|
||||||
|
{f"{command}": locale("commands")[command]}
|
||||||
|
)
|
||||||
logWrite(f"Registering {command} for {permission}")
|
logWrite(f"Registering {command} for {permission}")
|
||||||
|
|
||||||
for lc in valid_locales:
|
for lc in valid_locales:
|
||||||
|
commands["locales"][lc][permission].append(
|
||||||
commands["locales"][lc][permission].append(BotCommand(command, locale("commands", locale=lc)[command]))
|
BotCommand(command, locale("commands", locale=lc)[command])
|
||||||
|
)
|
||||||
|
|
||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
commands_raw["locales"][lc][permission].append({f"{command}": locale("commands", locale=lc)[command]})
|
commands_raw["locales"][lc][permission].append(
|
||||||
|
{f"{command}": locale("commands", locale=lc)[command]}
|
||||||
|
)
|
||||||
logWrite(f"Registering {command} for {permission} [{lc}]")
|
logWrite(f"Registering {command} for {permission} [{lc}]")
|
||||||
|
|
||||||
|
|
||||||
# Registering user commands
|
# Registering user commands
|
||||||
await app.set_bot_commands(commands["users"])
|
await app.set_bot_commands(commands["users"])
|
||||||
logWrite("Registered user commands for default locale")
|
logWrite("Registered user commands for default locale")
|
||||||
@ -205,55 +279,94 @@ async def commands_register():
|
|||||||
# Registering admin commands
|
# Registering admin commands
|
||||||
for admin in configGet("admins"):
|
for admin in configGet("admins"):
|
||||||
try:
|
try:
|
||||||
await app.set_bot_commands(commands["admins"]+commands["users"], scope=BotCommandScopeChat(chat_id=admin))
|
await app.set_bot_commands(
|
||||||
|
commands["admins"] + commands["users"],
|
||||||
|
scope=BotCommandScopeChat(chat_id=admin),
|
||||||
|
)
|
||||||
logWrite(f"Registered admin commands for admin {admin}")
|
logWrite(f"Registered admin commands for admin {admin}")
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Registering owner commands
|
# Registering owner commands
|
||||||
try:
|
try:
|
||||||
await app.set_bot_commands(commands["admins"]+commands["owner"]+commands["users"], scope=BotCommandScopeChat(chat_id=configGet("owner")))
|
await app.set_bot_commands(
|
||||||
|
commands["admins"] + commands["owner"] + commands["users"],
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("owner")),
|
||||||
|
)
|
||||||
for lc in valid_locales:
|
for lc in valid_locales:
|
||||||
await app.set_bot_commands(commands["locales"][lc]["admins"]+commands["locales"][lc]["owner"]+commands["locales"][lc]["users"], scope=BotCommandScopeChat(chat_id=configGet("owner")))
|
await app.set_bot_commands(
|
||||||
|
commands["locales"][lc]["admins"]
|
||||||
|
+ commands["locales"][lc]["owner"]
|
||||||
|
+ commands["locales"][lc]["users"],
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("owner")),
|
||||||
|
)
|
||||||
logWrite(f"Registered admin commands for owner {configGet('owner')}")
|
logWrite(f"Registered admin commands for owner {configGet('owner')}")
|
||||||
except bad_request_400.PeerIdInvalid:
|
except bad_request_400.PeerIdInvalid:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Registering admin group commands
|
# Registering admin group commands
|
||||||
try:
|
try:
|
||||||
await app.set_bot_commands(commands["group_admins"], scope=BotCommandScopeChat(chat_id=configGet("admin", "groups")))
|
await app.set_bot_commands(
|
||||||
|
commands["group_admins"],
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("admin", "groups")),
|
||||||
|
)
|
||||||
logWrite("Registered admin group commands for default locale")
|
logWrite("Registered admin group commands for default locale")
|
||||||
except bad_request_400.ChannelInvalid:
|
except bad_request_400.ChannelInvalid:
|
||||||
logWrite(f"Could not register commands for admin group. Bot is likely not in the group.")
|
logWrite(
|
||||||
|
f"Could not register commands for admin group. Bot is likely not in the group."
|
||||||
|
)
|
||||||
|
|
||||||
# Registering destination group commands
|
# Registering destination group commands
|
||||||
try:
|
try:
|
||||||
await app.set_bot_commands(commands["group_users"], scope=BotCommandScopeChat(chat_id=configGet("users", "groups")))
|
await app.set_bot_commands(
|
||||||
|
commands["group_users"],
|
||||||
|
scope=BotCommandScopeChat(chat_id=configGet("users", "groups")),
|
||||||
|
)
|
||||||
logWrite("Registered destination group commands")
|
logWrite("Registered destination group commands")
|
||||||
except bad_request_400.ChannelInvalid:
|
except bad_request_400.ChannelInvalid:
|
||||||
logWrite(f"Could not register commands for destination group. Bot is likely not in the group.")
|
logWrite(
|
||||||
|
f"Could not register commands for destination group. Bot is likely not in the group."
|
||||||
|
)
|
||||||
|
|
||||||
# Registering destination group admin commands
|
# Registering destination group admin commands
|
||||||
try:
|
try:
|
||||||
await app.set_bot_commands(commands["group_users_admins"], scope=BotCommandScopeChatAdministrators(chat_id=configGet("users", "groups")))
|
await app.set_bot_commands(
|
||||||
|
commands["group_users_admins"],
|
||||||
|
scope=BotCommandScopeChatAdministrators(
|
||||||
|
chat_id=configGet("users", "groups")
|
||||||
|
),
|
||||||
|
)
|
||||||
logWrite("Registered destination group admin commands")
|
logWrite("Registered destination group admin commands")
|
||||||
except bad_request_400.ChannelInvalid:
|
except bad_request_400.ChannelInvalid:
|
||||||
logWrite(f"Could not register admin commands for destination group. Bot is likely not in the group.")
|
logWrite(
|
||||||
|
f"Could not register admin commands for destination group. Bot is likely not in the group."
|
||||||
|
)
|
||||||
|
|
||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
print(commands, flush=True)
|
print(commands, flush=True)
|
||||||
logWrite(f"Complete commands registration:\n{dumps(commands_raw, indent=4, ensure_ascii=False, encode_html_chars=False)}", debug=True)
|
logWrite(
|
||||||
|
f"Complete commands registration:\n{dumps(commands_raw, indent=4, ensure_ascii=False, encode_html_chars=False)}",
|
||||||
|
debug=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if configGet("enabled", "scheduler", "channels_monitor"):
|
if configGet("enabled", "scheduler", "channels_monitor"):
|
||||||
@scheduler.scheduled_job(trigger="interval", minutes=configGet("interval", "scheduler", "channels_monitor"))
|
|
||||||
|
@scheduler.scheduled_job(
|
||||||
|
trigger="interval",
|
||||||
|
minutes=configGet("interval", "scheduler", "channels_monitor"),
|
||||||
|
)
|
||||||
async def channels_monitor():
|
async def channels_monitor():
|
||||||
for channel in configGet("channels", "scheduler", "channels_monitor"):
|
for channel in configGet("channels", "scheduler", "channels_monitor"):
|
||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
logWrite(f'Processing videos of {channel["name"]} ({channel["id"]})', debug=True)
|
logWrite(
|
||||||
|
f'Processing videos of {channel["name"]} ({channel["id"]})',
|
||||||
|
debug=True,
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
req = get(f'https://www.youtube.com/feeds/videos.xml?channel_id={channel["id"]}')
|
req = get(
|
||||||
|
f'https://www.youtube.com/feeds/videos.xml?channel_id={channel["id"]}'
|
||||||
|
)
|
||||||
parsed = parse(req.content)
|
parsed = parse(req.content)
|
||||||
if "feed" not in parsed:
|
if "feed" not in parsed:
|
||||||
continue
|
continue
|
||||||
@ -262,11 +375,33 @@ if configGet("enabled", "scheduler", "channels_monitor"):
|
|||||||
for entry in parsed["feed"]["entry"]:
|
for entry in parsed["feed"]["entry"]:
|
||||||
if "yt:videoId" not in entry:
|
if "yt:videoId" not in entry:
|
||||||
continue
|
continue
|
||||||
if col_youtube.find_one( {"channel": channel["id"], "video": entry["yt:videoId"]} ) is None:
|
if (
|
||||||
col_youtube.insert_one( {"channel": channel["id"], "video": entry["yt:videoId"], "date": datetime.fromisoformat(entry["published"])} )
|
col_youtube.find_one(
|
||||||
await app.send_message(configGet("users", "groups"), locale("youtube_video", "message").format(channel["name"], channel["link"], entry["title"], entry["link"]["@href"]), disable_web_page_preview=False)
|
{"channel": channel["id"], "video": entry["yt:videoId"]}
|
||||||
|
)
|
||||||
|
is None
|
||||||
|
):
|
||||||
|
col_youtube.insert_one(
|
||||||
|
{
|
||||||
|
"channel": channel["id"],
|
||||||
|
"video": entry["yt:videoId"],
|
||||||
|
"date": datetime.fromisoformat(entry["published"]),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
await app.send_message(
|
||||||
|
configGet("users", "groups"),
|
||||||
|
locale("youtube_video", "message").format(
|
||||||
|
channel["name"],
|
||||||
|
channel["link"],
|
||||||
|
entry["title"],
|
||||||
|
entry["link"]["@href"],
|
||||||
|
),
|
||||||
|
disable_web_page_preview=False,
|
||||||
|
)
|
||||||
await sleep(2)
|
await sleep(2)
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f'Could not get last videos of {channel["name"]} ({channel["id"]}) due to {exp}: {format_exc()}')
|
logWrite(
|
||||||
|
f'Could not get last videos of {channel["name"]} ({channel["id"]}) due to {exp}: {format_exc()}'
|
||||||
|
)
|
||||||
if configGet("debug") is True:
|
if configGet("debug") is True:
|
||||||
logWrite("Admin group caching performed", debug=True)
|
logWrite("Admin group caching performed", debug=True)
|
@ -16,23 +16,29 @@ from classes.errors.geo import PlaceNotFoundError
|
|||||||
|
|
||||||
from modules.logging import logWrite
|
from modules.logging import logWrite
|
||||||
|
|
||||||
|
|
||||||
def jsonLoad(filename):
|
def jsonLoad(filename):
|
||||||
"""Loads arg1 as json and returns its contents"""
|
"""Loads arg1 as json and returns its contents"""
|
||||||
with open(filename, "r", encoding='utf8') as file:
|
with open(filename, "r", encoding="utf8") as file:
|
||||||
try:
|
try:
|
||||||
output = loads(file.read())
|
output = loads(file.read())
|
||||||
except JSONDecodeError:
|
except JSONDecodeError:
|
||||||
logWrite(f"Could not load json file {filename}: file seems to be incorrect!\n{print_exc()}")
|
logWrite(
|
||||||
|
f"Could not load json file {filename}: file seems to be incorrect!\n{print_exc()}"
|
||||||
|
)
|
||||||
raise
|
raise
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
logWrite(f"Could not load json file {filename}: file does not seem to exist!\n{print_exc()}")
|
logWrite(
|
||||||
|
f"Could not load json file {filename}: file does not seem to exist!\n{print_exc()}"
|
||||||
|
)
|
||||||
raise
|
raise
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
def jsonSave(contents, filename):
|
def jsonSave(contents, filename):
|
||||||
"""Dumps dict/list arg1 to file arg2"""
|
"""Dumps dict/list arg1 to file arg2"""
|
||||||
try:
|
try:
|
||||||
with open(filename, "w", encoding='utf8') as file:
|
with open(filename, "w", encoding="utf8") as file:
|
||||||
file.write(dumps(contents, ensure_ascii=False, indent=4))
|
file.write(dumps(contents, ensure_ascii=False, indent=4))
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not save json file {filename}: {exp}\n{print_exc()}")
|
logWrite(f"Could not save json file {filename}: {exp}\n{print_exc()}")
|
||||||
@ -52,6 +58,7 @@ def nested_set(dic, keys, value, create_missing=True):
|
|||||||
d[keys[-1]] = value
|
d[keys[-1]] = value
|
||||||
return dic
|
return dic
|
||||||
|
|
||||||
|
|
||||||
def configSet(keys: list, value: Any, file: str = "config", create_missing=True):
|
def configSet(keys: list, value: Any, file: str = "config", create_missing=True):
|
||||||
"""Set config's value to provided one
|
"""Set config's value to provided one
|
||||||
|
|
||||||
@ -69,7 +76,10 @@ def configSet(keys: list, value: Any, file: str = "config", create_missing=True)
|
|||||||
this_dict = jsonLoad("config_debug.json")
|
this_dict = jsonLoad("config_debug.json")
|
||||||
file = "config_debug"
|
file = "config_debug"
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print("Debug mode is set but config_debug.json is not there! Falling back to config.json", flush=True)
|
print(
|
||||||
|
"Debug mode is set but config_debug.json is not there! Falling back to config.json",
|
||||||
|
flush=True,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
filepath = f"data{sep}users{sep}"
|
filepath = f"data{sep}users{sep}"
|
||||||
this_dict = jsonLoad(f"{filepath}{file}.json")
|
this_dict = jsonLoad(f"{filepath}{file}.json")
|
||||||
@ -78,6 +88,7 @@ def configSet(keys: list, value: Any, file: str = "config", create_missing=True)
|
|||||||
jsonSave(this_dict, f"{filepath}{file}.json")
|
jsonSave(this_dict, f"{filepath}{file}.json")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def configGet(key: str, *args: str, file: str = "config"):
|
def configGet(key: str, *args: str, file: str = "config"):
|
||||||
"""Get value of the config key
|
"""Get value of the config key
|
||||||
### Args:
|
### Args:
|
||||||
@ -91,13 +102,19 @@ def configGet(key: str, *args: str, file: str = "config"):
|
|||||||
try:
|
try:
|
||||||
this_dict = jsonLoad("config.json")
|
this_dict = jsonLoad("config.json")
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print("Config file not found! Copy config_example.json to config.json, configure it and rerun the bot!", flush=True)
|
print(
|
||||||
|
"Config file not found! Copy config_example.json to config.json, configure it and rerun the bot!",
|
||||||
|
flush=True,
|
||||||
|
)
|
||||||
exit()
|
exit()
|
||||||
if this_dict["debug"] is True:
|
if this_dict["debug"] is True:
|
||||||
try:
|
try:
|
||||||
this_dict = jsonLoad("config_debug.json")
|
this_dict = jsonLoad("config_debug.json")
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print("Debug mode is set but config_debug.json is not there! Falling back to config.json", flush=True)
|
print(
|
||||||
|
"Debug mode is set but config_debug.json is not there! Falling back to config.json",
|
||||||
|
flush=True,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
this_dict = jsonLoad(f"data{sep}users{sep}{file}.json")
|
this_dict = jsonLoad(f"data{sep}users{sep}{file}.json")
|
||||||
this_key = this_dict
|
this_key = this_dict
|
||||||
@ -105,6 +122,7 @@ def configGet(key: str, *args: str, file: str = "config"):
|
|||||||
this_key = this_key[dict_key]
|
this_key = this_key[dict_key]
|
||||||
return this_key[key]
|
return this_key[key]
|
||||||
|
|
||||||
|
|
||||||
def locale(key: str, *args: str, locale: Union[str, User] = configGet("locale")) -> Any:
|
def locale(key: str, *args: str, locale: Union[str, User] = configGet("locale")) -> Any:
|
||||||
"""Get value of locale string
|
"""Get value of locale string
|
||||||
### Args:
|
### Args:
|
||||||
@ -126,7 +144,9 @@ def locale(key: str, *args: str, locale: Union[str, User] = configGet("locale"))
|
|||||||
this_dict = jsonLoad(f'{configGet("locale", "locations")}{sep}{locale}.json')
|
this_dict = jsonLoad(f'{configGet("locale", "locations")}{sep}{locale}.json')
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
try:
|
try:
|
||||||
this_dict = jsonLoad(f'{configGet("locale", "locations")}{sep}{configGet("locale")}.json')
|
this_dict = jsonLoad(
|
||||||
|
f'{configGet("locale", "locations")}{sep}{configGet("locale")}.json'
|
||||||
|
)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
||||||
|
|
||||||
@ -139,6 +159,7 @@ def locale(key: str, *args: str, locale: Union[str, User] = configGet("locale"))
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
||||||
|
|
||||||
|
|
||||||
def all_locales(key: str, *args: str) -> list:
|
def all_locales(key: str, *args: str) -> list:
|
||||||
"""Get value of the provided key and path in all available locales
|
"""Get value of the provided key and path in all available locales
|
||||||
|
|
||||||
@ -174,6 +195,7 @@ def all_locales(key: str, *args: str) -> list:
|
|||||||
|
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
def find_location(query: str) -> dict:
|
def find_location(query: str) -> dict:
|
||||||
"""Find location on geonames.org by query. Search is made with feature classes A and P.
|
"""Find location on geonames.org by query. Search is made with feature classes A and P.
|
||||||
|
|
||||||
@ -187,12 +209,20 @@ def find_location(query: str) -> dict:
|
|||||||
* `dict`: One instance of geonames response
|
* `dict`: One instance of geonames response
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
result = (get(f"http://api.geonames.org/searchJSON?q={query}&maxRows=1&countryBias=UA&lang=uk&orderby=relevance&featureClass=P&featureClass=A&username={configGet('username', 'geocoding')}")).json()
|
result = (
|
||||||
|
get(
|
||||||
|
f"http://api.geonames.org/searchJSON?q={query}&maxRows=1&countryBias=UA&lang=uk&orderby=relevance&featureClass=P&featureClass=A&username={configGet('username', 'geocoding')}"
|
||||||
|
)
|
||||||
|
).json()
|
||||||
return result["geonames"][0]
|
return result["geonames"][0]
|
||||||
except (ValueError, KeyError, IndexError):
|
except (ValueError, KeyError, IndexError):
|
||||||
raise PlaceNotFoundError(query)
|
raise PlaceNotFoundError(query)
|
||||||
|
|
||||||
def create_tmp(bytedata: Union[bytes, bytearray], kind: Union[Literal["image", "video"], None] = None) -> str:
|
|
||||||
|
def create_tmp(
|
||||||
|
bytedata: Union[bytes, bytearray],
|
||||||
|
kind: Union[Literal["image", "video"], None] = None,
|
||||||
|
) -> str:
|
||||||
"""Create temporary file to help uploading it
|
"""Create temporary file to help uploading it
|
||||||
|
|
||||||
### Args:
|
### Args:
|
||||||
@ -212,6 +242,7 @@ def create_tmp(bytedata: Union[bytes, bytearray], kind: Union[Literal["image", "
|
|||||||
file.write(bytedata)
|
file.write(bytedata)
|
||||||
return path.join("tmp", filename)
|
return path.join("tmp", filename)
|
||||||
|
|
||||||
|
|
||||||
async def download_tmp(app: Client, file_id: str) -> Tuple[str, bytes]:
|
async def download_tmp(app: Client, file_id: str) -> Tuple[str, bytes]:
|
||||||
"""Download file by its ID and return its bytes
|
"""Download file by its ID and return its bytes
|
||||||
|
|
||||||
@ -229,24 +260,31 @@ async def download_tmp(app: Client, file_id: str) -> Tuple[str, bytes]:
|
|||||||
bytedata = f.read()
|
bytedata = f.read()
|
||||||
return path.join("tmp", filename), bytedata
|
return path.join("tmp", filename), bytedata
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from psutil import Process
|
from psutil import Process
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
# print(locale("deps_missing", "console", locale=configGet("locale")), flush=True)
|
# print(locale("deps_missing", "console", locale=configGet("locale")), flush=True)
|
||||||
print("Missing dependencies! Please install all needed dependencies and run the bot again!")
|
print(
|
||||||
|
"Missing dependencies! Please install all needed dependencies and run the bot again!"
|
||||||
|
)
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
|
|
||||||
def killProc(pid):
|
def killProc(pid):
|
||||||
if osname == "posix":
|
if osname == "posix":
|
||||||
from signal import SIGKILL
|
from signal import SIGKILL
|
||||||
|
|
||||||
kill(pid, SIGKILL)
|
kill(pid, SIGKILL)
|
||||||
else:
|
else:
|
||||||
p = Process(pid)
|
p = Process(pid)
|
||||||
p.kill()
|
p.kill()
|
||||||
|
|
||||||
|
|
||||||
def should_quote(msg):
|
def should_quote(msg):
|
||||||
return True if msg.chat.type is not ChatType.PRIVATE else False
|
return True if msg.chat.type is not ChatType.PRIVATE else False
|
||||||
|
|
||||||
|
|
||||||
async def find_user(app: Client, query: Union[str, int]):
|
async def find_user(app: Client, query: Union[str, int]):
|
||||||
try:
|
try:
|
||||||
result = await app.get_users(int(query))
|
result = await app.get_users(int(query))
|
||||||
|
Reference in New Issue
Block a user