13 Commits

Author SHA1 Message Date
717d636497 Added one more check 2023-01-09 13:19:17 +01:00
64b0562bc4 Added "group_users_admins" command scope 2023-01-09 13:08:02 +01:00
eced1b7984 Added one more check 2023-01-09 12:54:00 +01:00
da3dd3a2fe Changed debug logging logic 2023-01-09 12:39:39 +01:00
3e166a3fca Fixed inline query caching 2023-01-09 12:21:21 +01:00
d090b18655 Added additional caching message on debug 2023-01-09 12:11:29 +01:00
e2d28f442c Changed inline caching time 2023-01-09 12:10:07 +01:00
496240c48b Fixed id attribute in sponsorships scheduler 2023-01-09 11:39:24 +01:00
Profitroll
0bf5ae70eb Improved inline query usage filters 2023-01-07 10:20:58 +01:00
Profitroll
bcaf80e2e1 Fixed reply_document() issue 2023-01-07 00:38:53 +01:00
Profitroll
21bf460b28 Fixes + improved logging 2023-01-07 00:38:35 +01:00
Profitroll
a4bbb837d7 Added delay for label setting 2023-01-06 21:27:47 +01:00
Profitroll
1a438fc32e Fixed api method 2023-01-06 21:27:32 +01:00
9 changed files with 87 additions and 55 deletions

View File

@@ -1,4 +1,5 @@
from datetime import datetime from datetime import datetime
from asyncio import sleep
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
@@ -123,11 +124,11 @@ 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}") 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}") 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}") 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:
@@ -164,7 +165,7 @@ class HoloUser():
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_document(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
@@ -189,7 +190,7 @@ class HoloUser():
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_document(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
@@ -227,6 +228,7 @@ class HoloUser():
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 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:

View File

@@ -114,7 +114,6 @@
"permissions": [ "permissions": [
"users", "users",
"admins", "admins",
"group_users",
"group_admins" "group_admins"
], ],
"modules": [ "modules": [
@@ -123,7 +122,7 @@
}, },
"warn": { "warn": {
"permissions": [ "permissions": [
"group_users" "group_users_admins"
], ],
"modules": [ "modules": [
"warnings" "warnings"

View File

@@ -3,6 +3,7 @@ from pyrogram import filters
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, Message from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, Message
from pyrogram.client import Client from pyrogram.client import Client
from classes.holo_user import HoloUser from classes.holo_user import HoloUser
from modules.logging import logWrite
from modules.utils import configGet, locale, should_quote from modules.utils import configGet, locale, should_quote
from modules.handlers.welcome import welcome_pass from modules.handlers.welcome import welcome_pass
from modules.database import col_tmp from modules.database import col_tmp
@@ -34,14 +35,22 @@ async def cmd_reapply(app: Client, msg: Message):
await welcome_pass(app, msg, once_again=True) await welcome_pass(app, msg, once_again=True)
else: else:
await msg.reply_text(locale("reapply_left_chat", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup([
[ if holo_user.application_state()[1] is True and holo_user.application_state()[0] != "fill":
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), reply_markup=InlineKeyboardMarkup([
[ [
InlineKeyboardButton(locale("reapply_new_one", "button", locale=holo_user), f"reapply_new_{msg.id}") 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}")
]
]))
else:
holo_user.application_restart(reapply=True)
await welcome_pass(app, msg, once_again=True)
else: else:

View File

@@ -24,42 +24,35 @@ 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]))
if configGet("debug") is True: logWrite(f'Resetting commands in groups {configGet("admin", "groups")} and {configGet("users", "groups")}', debug=True)
logWrite(f'Resetting commands in groups {configGet("admin", "groups")} and {configGet("users", "groups")}')
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("admin", "groups"))) await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("admin", "groups")))
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("users", "groups"))) await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("users", "groups")))
for admin in configGet("admins"): for admin in configGet("admins"):
try: try:
if configGet("debug") is True: logWrite(f'Resetting commands for admin {admin}', debug=True)
logWrite(f'Resetting commands for admin {admin}')
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=admin)) await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=admin))
except bad_request_400.PeerIdInvalid: except bad_request_400.PeerIdInvalid:
pass pass
try: try:
if configGet("debug") is True: logWrite(f'Resetting commands for owner {configGet("owner")}', debug=True)
logWrite(f'Resetting commands for owner {configGet("owner")}')
for lc in valid_locales: for lc in valid_locales:
if configGet("debug") is True: logWrite(f'Resetting commands for owner {configGet("owner")} [{lc}]', debug=True)
logWrite(f'Resetting commands for owner {configGet("owner")} [{lc}]')
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")), language_code=lc)
await app.delete_bot_commands(scope=BotCommandScopeChat(chat_id=configGet("owner"))) 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:
if configGet("debug") is True: logWrite(f'Resetting commands for locale {lc}', debug=True)
logWrite(f'Resetting commands for locale {lc}')
await app.delete_bot_commands(scope=BotCommandScopeDefault(), language_code=lc) await app.delete_bot_commands(scope=BotCommandScopeDefault(), language_code=lc)
if configGet("debug") is True: logWrite(f'Resetting default commands', debug=True)
logWrite(f'Resetting default commands')
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))
if configGet("debug") is True: logWrite(str(await app.get_bot_commands()), debug=True)
logWrite(str(await app.get_bot_commands())) 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")))))
# ============================================================================================================================== # ==============================================================================================================================

View File

@@ -33,13 +33,13 @@ async def cmd_start(app: Client, msg: Message):
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_document(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["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_document(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:

View File

@@ -15,7 +15,11 @@ 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):
return True if (col_applications.find_one({"user": msg.from_user.id}) is not None) else False output = False
output = 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
return output
async def enabled_general_func(_, __, msg: Message): async def enabled_general_func(_, __, msg: Message):
return configGet("enabled", "features", "general") return configGet("enabled", "features", "general")

View File

@@ -117,7 +117,7 @@ async def confirm_yes(app: Client, msg: Message, kind: Literal["application", "s
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(chat_id=configGet("admin", "groups"), photo=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}")

View File

@@ -11,7 +11,8 @@ from pyrogram.enums.chat_members_filter import ChatMembersFilter
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
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 configGet, locale from modules.logging import logWrite
from modules.utils import configGet, jsonLoad, locale
from modules.database import col_applications, col_spoilers 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
@@ -64,22 +65,33 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
) )
return return
results_forbidden = [
InlineQueryResultArticle(
title=locale("title", "inline", "forbidden", locale=inline_query.from_user),
input_message_content=InputTextMessageContent(
locale("message_content", "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)
await inline_query.answer( await inline_query.answer(
results=[ results=results_forbidden
InlineQueryResultArticle(
title=locale("title", "inline", "forbidden", locale=inline_query.from_user),
input_message_content=InputTextMessageContent(
locale("message_content", "inline", "forbidden", locale=inline_query.from_user)
),
description=locale("description", "inline", "forbidden", locale=inline_query.from_user)
)
]
) )
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"), "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
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 = configGet("inline_preview_count") if inline_query.query != "" else 200 max_results = configGet("inline_preview_count") if inline_query.query != "" else 200
@@ -161,5 +173,6 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
await inline_query.answer( await inline_query.answer(
results=results, results=results,
cache_time=10 cache_time=10,
) is_personal=True
)

View File

@@ -6,7 +6,7 @@ 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 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
@@ -22,8 +22,9 @@ if configGet("enabled", "scheduler", "cache_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("cache", 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"))
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"))
@@ -31,8 +32,9 @@ if configGet("enabled", "scheduler", "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")):
list_of_users.append(member.user.id) list_of_users.append(member.user.id)
makedirs("cache", exist_ok=True) makedirs(configGet("cache", "locations"), exist_ok=True)
jsonSave(list_of_users, path.join(configGet("cache", "locations"), "admins")) jsonSave(list_of_users, path.join(configGet("cache", "locations"), "admins"))
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"):
@@ -76,7 +78,7 @@ if configGet("enabled", "features", "sponsorships") is True:
try: try:
tg_user = await app.get_users(entry["user"]) tg_user = await app.get_users(entry["user"])
until_expiry = relativedelta(datetime.now(), entry["sponsorship"]["expires"]).days until_expiry = relativedelta(datetime.now(), entry["sponsorship"]["expires"]).days
await app.send_message( tg_user, locale("sponsorships_expires", "message").format(until_expiry) ) # type: ignore await app.send_message( tg_user.id, locale("sponsorships_expires", "message").format(until_expiry) ) # type: ignore
logWrite(f"Notified user that sponsorship expires in {until_expiry} days") logWrite(f"Notified 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}'")
@@ -108,6 +110,7 @@ async def commands_register():
"owner": [], "owner": [],
"group_users": [], "group_users": [],
"group_admins": [], "group_admins": [],
"group_users_admins": [],
"locales": {} "locales": {}
} }
@@ -117,6 +120,7 @@ async def commands_register():
"owner": [], "owner": [],
"group_users": [], "group_users": [],
"group_admins": [], "group_admins": [],
"group_users_admins": [],
"locales": {} "locales": {}
} }
@@ -131,7 +135,8 @@ async def commands_register():
"admins": [], "admins": [],
"owner": [], "owner": [],
"group_users": [], "group_users": [],
"group_admins": [] "group_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])] = {
@@ -139,7 +144,8 @@ async def commands_register():
"admins": [], "admins": [],
"owner": [], "owner": [],
"group_users": [], "group_users": [],
"group_admins": [] "group_admins": [],
"group_users_admins": []
} }
config_modules = configGet("features") config_modules = configGet("features")
@@ -155,8 +161,7 @@ async def commands_register():
enabled = True enabled = True
if enabled is False: if enabled is False:
if configGet("debug") is True: logWrite(f"Not registering {command} at all", debug=True)
logWrite(f"Not registering {command} at all")
continue continue
for permission in config_commands[command]["permissions"]: for permission in config_commands[command]["permissions"]:
@@ -216,7 +221,14 @@ async def commands_register():
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
try:
await app.set_bot_commands(commands["group_users_admins"], scope=BotCommandScopeChatAdministrators(chat_id=configGet("users", "groups")))
logWrite("Registered destination group admin commands")
except bad_request_400.ChannelInvalid:
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)}") logWrite(f"Complete commands registration:\n{dumps(commands_raw, indent=4, ensure_ascii=False, encode_html_chars=False)}", debug=True)