Compare commits
20 Commits
v1.1
...
00a408ac6c
Author | SHA1 | Date | |
---|---|---|---|
00a408ac6c | |||
b67b1daf7c | |||
f83751c07d | |||
f5e3cd5a50 | |||
478fb174c5 | |||
30dfe4ff04 | |||
bdc775dcbd | |||
717d636497 | |||
64b0562bc4 | |||
eced1b7984 | |||
da3dd3a2fe | |||
3e166a3fca | |||
d090b18655 | |||
e2d28f442c | |||
496240c48b | |||
|
0bf5ae70eb | ||
|
bcaf80e2e1 | ||
|
21bf460b28 | ||
|
a4bbb837d7 | ||
|
1a438fc32e |
@@ -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:
|
||||||
|
@@ -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"
|
||||||
|
@@ -262,7 +262,7 @@
|
|||||||
"description": "Надіслати цей спойлер до чату"
|
"description": "Надіслати цей спойлер до чату"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rules_msg": "📢Правила можуть доповнюватись та змінюватись, залежно від потреби. У такому разі, порушення, які були вчинені до введення (змінення) правила, порушеннями вважатися не будуть. Про всі зміни в правилах, ви будете проінформовані за допомогою закріплених повідомлень. Але вони не будуть закріплені на постійній основі, тому, час від часу, перевіряйте актуальність правил у боті.\n\n🔔Якщо ви бачите, як хтось із учасників порушив правила, тегніть одного із адмінів, у відповідь на повідомлення, яке, на вашу думку, є порушенням. У дописі до тегу, вкажіть, по якому пункту ви побачили порушення. Або перешліть повідомлення до будь кого із адміністраторів у особисті повідомлення, та коротко опишіть ситуацію.\nСписок адміністраторів: @Chirkopol @Za_NerZula @Denialvapr\nЗ питань функціонування бота звертайтесь до @Profitroll2281337\n\n❗️Будь-який заборонений контент, може бути відправлений до чату за допомогою бота - https://t.me/spoilerobot з повним описом контенту, що міститься під спойлером. За неправильний або некоректний опис, може бути видане попередження.\n\n‼️Видалені або змінені повідомлення, все ще є повідомленнями від вашого імені, які могли побачити учасники чату, і які можуть бути відстежені через адмінську панель.\n\n🔨 За порушення - ви отримаєте попередження. За наявності 3-х попереджень - мут на добу. За повторні порушення, ви одразу отримаєте покарання, без додаткових попереджень.",
|
"rules_msg": "📢Правила можуть доповнюватись та змінюватись, залежно від потреби. У такому разі, порушення, які були вчинені до введення (змінення) правила, порушеннями вважатися не будуть. Про всі зміни в правилах, ви будете проінформовані за допомогою закріплених повідомлень. Але вони не будуть закріплені на постійній основі, тому, час від часу, перевіряйте актуальність правил у боті.\n\n🔔Якщо ви бачите, як хтось із учасників порушив правила, тегніть одного із адмінів, у відповідь на повідомлення, яке, на вашу думку, є порушенням. У дописі до тегу, вкажіть, по якому пункту ви побачили порушення. Або перешліть повідомлення до будь кого із адміністраторів у особисті повідомлення, та коротко опишіть ситуацію.\nСписок адміністраторів: @Chirkopol @Za_NerZula @Denialvapr\nЗ питань функціонування бота звертайтесь до @Profitroll2281337\n\n❗️Будь-який заборонений контент, може бути відправлений допомогою команди /spoiler у бота - з повним описом контенту, що міститься під спойлером. За неправильний або некоректний опис, може бути видане попередження.\n\n‼️Видалені або змінені повідомлення, все ще є повідомленнями від вашого імені, які могли побачити учасники чату, і які можуть бути відстежені через адмінську панель.\n\n🔨 За порушення - ви отримаєте попередження. За наявності 3-х попереджень - мут на добу. За повторні порушення, ви одразу отримаєте покарання, без додаткових попереджень.",
|
||||||
"rules": [
|
"rules": [
|
||||||
"1️⃣) \"HoloKyiv Chat\" та \"HoloUA (Hololive Ukraine) Chat\" створені виключно для українців (13+). В них можуть знаходитись тільки люди які: \n- Народились в Україні, та проживають, на данний момент, у ній.\n- Народились за межами України, але проживають у ній.\n- Народились в Україні але, на даний момент, не проживають у ній.\n\"HoloUA (Hololive Ukraine) Chat\" відкритий для усіх українців. Щоб потрапити до нього, заповніть, будь ласка, анкету, та дочекайтесь, поки її схвалять адміни.\nУ \"HoloKyiv Chat\" можна потрапити тільки особисто, якщо ви проживаєте у Київі, або є близьким другом одного із учасників чату. Із приводу додавання до чату пишіть @Chirkopol у приватні повідомлення.\n🔨 Якщо у процесі спілкування виявиться, що ви не українець, вас буде видалено із чату, до моменту, поки ви їм не станете. Без образ. Ми створюємо виключно українське ком'юніті.",
|
"1️⃣) \"HoloKyiv Chat\" та \"HoloUA (Hololive Ukraine) Chat\" створені виключно для українців (13+). В них можуть знаходитись тільки люди які: \n- Народились в Україні, та проживають, на данний момент, у ній.\n- Народились за межами України, але проживають у ній.\n- Народились в Україні але, на даний момент, не проживають у ній.\n\"HoloUA (Hololive Ukraine) Chat\" відкритий для усіх українців. Щоб потрапити до нього, заповніть, будь ласка, анкету, та дочекайтесь, поки її схвалять адміни.\nУ \"HoloKyiv Chat\" можна потрапити тільки особисто, якщо ви проживаєте у Київі, або є близьким другом одного із учасників чату. Із приводу додавання до чату пишіть @Chirkopol у приватні повідомлення.\n🔨 Якщо у процесі спілкування виявиться, що ви не українець, вас буде видалено із чату, до моменту, поки ви їм не станете. Без образ. Ми створюємо виключно українське ком'юніті.",
|
||||||
"2️⃣) Заборонено поширення NSFW-контенту з прямим або частково прихованим порнографічним змістом. На контенті \"еротичного характеру\" повинні бути закриті \"сумнівні\" ділянки тіл. \nЗаборонено поширення шок-контенту з великою наявністю крові та/або фізичних пошкоджень.",
|
"2️⃣) Заборонено поширення NSFW-контенту з прямим або частково прихованим порнографічним змістом. На контенті \"еротичного характеру\" повинні бути закриті \"сумнівні\" ділянки тіл. \nЗаборонено поширення шок-контенту з великою наявністю крові та/або фізичних пошкоджень.",
|
||||||
|
@@ -9,7 +9,7 @@ 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=["/"]))
|
@app.on_message((custom_filters.enabled_applications | custom_filters.enabled_sponsorships) & ~filters.scheduled & filters.command("cancel", prefixes=["/"]))
|
||||||
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} )
|
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} )
|
||||||
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}")
|
||||||
|
@@ -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:
|
||||||
|
|
||||||
|
@@ -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")))))
|
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@@ -30,6 +30,7 @@ async def cmd_spoiler(app: Client, msg: Message):
|
|||||||
"description": None,
|
"description": None,
|
||||||
"photo": None,
|
"photo": None,
|
||||||
"video": None,
|
"video": None,
|
||||||
|
"audio": None,
|
||||||
"animation": None,
|
"animation": None,
|
||||||
"document": None,
|
"document": None,
|
||||||
"caption": None,
|
"caption": None,
|
||||||
|
@@ -33,13 +33,15 @@ 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["audio"] is not None:
|
||||||
|
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_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:
|
||||||
|
@@ -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")
|
||||||
|
@@ -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}")
|
||||||
|
@@ -89,7 +89,7 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
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)))
|
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["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]:
|
||||||
@@ -115,7 +115,12 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
|
|
||||||
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( {"user": msg.from_user.id, "completed": False}, {"$set": {"video": msg.video.file_id, "caption": msg.caption, "completed": True}} )
|
||||||
logWrite(f"Adding video with id {msg.video.file_id} to {msg.from_user.id}'s spoiler")
|
logWrite(f"Adding audio with id {msg.video.file_id} to {msg.from_user.id}'s spoiler")
|
||||||
|
ready = True
|
||||||
|
|
||||||
|
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}} )
|
||||||
|
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:
|
||||||
@@ -128,7 +133,7 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
logWrite(f"Adding document with id {msg.document.file_id} to {msg.from_user.id}'s spoiler")
|
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["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": msg.text, "completed": True}} )
|
col_spoilers.find_one_and_update( {"user": msg.from_user.id, "completed": False}, {"$set": {"text": msg.text, "completed": True}} )
|
||||||
logWrite(f"Adding text '{msg.text}' to {msg.from_user.id}'s spoiler")
|
logWrite(f"Adding text '{msg.text}' to {msg.from_user.id}'s spoiler")
|
||||||
|
@@ -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
|
||||||
)
|
)
|
@@ -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,10 @@ 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"))
|
||||||
|
if configGet("debug") is 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"))
|
||||||
@@ -31,12 +33,14 @@ 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"))
|
||||||
|
if configGet("debug") is 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=10))
|
@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="interval", hours=configGet("interval", "scheduler", "cache_avatars"))
|
||||||
async def cache_avatars():
|
async def cache_avatars():
|
||||||
list_of_users = []
|
list_of_users = []
|
||||||
@@ -76,7 +80,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}'")
|
||||||
@@ -99,7 +103,7 @@ if configGet("enabled", "features", "sponsorships") is True:
|
|||||||
|
|
||||||
|
|
||||||
# Register all bot commands
|
# Register all bot commands
|
||||||
@scheduler.scheduled_job(trigger="date", run_date=datetime.now()+timedelta(seconds=3))
|
@scheduler.scheduled_job(trigger="date", run_date=datetime.now()+timedelta(seconds=10))
|
||||||
async def commands_register():
|
async def commands_register():
|
||||||
|
|
||||||
commands = {
|
commands = {
|
||||||
@@ -108,6 +112,7 @@ async def commands_register():
|
|||||||
"owner": [],
|
"owner": [],
|
||||||
"group_users": [],
|
"group_users": [],
|
||||||
"group_admins": [],
|
"group_admins": [],
|
||||||
|
"group_users_admins": [],
|
||||||
"locales": {}
|
"locales": {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,6 +122,7 @@ async def commands_register():
|
|||||||
"owner": [],
|
"owner": [],
|
||||||
"group_users": [],
|
"group_users": [],
|
||||||
"group_admins": [],
|
"group_admins": [],
|
||||||
|
"group_users_admins": [],
|
||||||
"locales": {}
|
"locales": {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,7 +137,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 +146,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 +163,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 +223,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)
|
@@ -1,10 +1,10 @@
|
|||||||
APScheduler==3.9.1.post1
|
APScheduler==3.9.1.post1
|
||||||
fastapi==0.88.0
|
fastapi~=0.88.0
|
||||||
psutil==5.9.4
|
psutil==5.9.4
|
||||||
pymongo==4.3.3
|
pymongo==4.3.3
|
||||||
Pyrogram~=2.0.93
|
Pyrogram~=2.0.95
|
||||||
requests==2.28.1
|
requests==2.28.1
|
||||||
tgcrypto==1.2.5
|
tgcrypto==1.2.5
|
||||||
python_dateutil==2.8.2
|
python_dateutil==2.8.2
|
||||||
starlette==0.23.0
|
starlette~=0.22.0
|
||||||
ujson==5.6.0
|
ujson~=5.7.0
|
@@ -7,6 +7,7 @@
|
|||||||
"description",
|
"description",
|
||||||
"photo",
|
"photo",
|
||||||
"video",
|
"video",
|
||||||
|
"audio",
|
||||||
"animation",
|
"animation",
|
||||||
"document",
|
"document",
|
||||||
"caption",
|
"caption",
|
||||||
@@ -38,6 +39,10 @@
|
|||||||
"bsonType": ["string", "null"],
|
"bsonType": ["string", "null"],
|
||||||
"description": "Spoilered video"
|
"description": "Spoilered video"
|
||||||
},
|
},
|
||||||
|
"audio": {
|
||||||
|
"bsonType": ["string", "null"],
|
||||||
|
"description": "Spoilered audio"
|
||||||
|
},
|
||||||
"animation": {
|
"animation": {
|
||||||
"bsonType": ["string", "null"],
|
"bsonType": ["string", "null"],
|
||||||
"description": "Spoilered animation/GIF"
|
"description": "Spoilered animation/GIF"
|
||||||
|
Reference in New Issue
Block a user