2 Commits

Author SHA1 Message Date
32e6c4e96f Updated to 0.3 2023-07-06 15:24:46 +03:00
8c27fb7c37 Small fixes (#32)
* `bot.max_concurrent_transmissions` reduced to only 1
* Fixed using UnauthorizedClient when not needed

Co-authored-by: profitroll <vozhd.kk@gmail.com>
Reviewed-on: #32
2023-07-06 15:21:21 +03:00
14 changed files with 86 additions and 101 deletions

View File

@@ -104,8 +104,8 @@ class PyroClient(PyroClient):
logger.warning( logger.warning(
"Could not send startup message to bot owner. Perhaps user has not started the bot yet." "Could not send startup message to bot owner. Perhaps user has not started the bot yet."
) )
except Exception as exc: except Exception as exp:
logger.exception("Update check failed due to %s: %s", exc, format_exc()) logger.exception("Update check failed due to %s: %s", exp, format_exc())
if self.config["mode"]["post"]: if self.config["mode"]["post"]:
if self.config["posting"]["use_interval"]: if self.config["posting"]["use_interval"]:
@@ -141,7 +141,7 @@ class PyroClient(PyroClient):
async def submit_media( async def submit_media(
self, id: str self, id: str
) -> Tuple[Union[Message, None], Union[str, None]]: ) -> Tuple[Union[Message, None], Union[str, None]]:
db_entry = await col_submitted.find_one({"_id": ObjectId(id)}) db_entry = col_submitted.find_one({"_id": ObjectId(id)})
submission = None submission = None
if db_entry is None: if db_entry is None:
@@ -155,8 +155,8 @@ class PyroClient(PyroClient):
filepath = await self.download_media( filepath = await self.download_media(
submission, file_name=self.config["locations"]["tmp"] + sep submission, file_name=self.config["locations"]["tmp"] + sep
) )
except Exception as exc: except Exception as exp:
raise SubmissionUnavailableError() from exc raise SubmissionUnavailableError() from exp
elif not Path( elif not Path(
f"{self.config['locations']['data']}/submissions/{db_entry['temp']['uuid']}/{db_entry['temp']['file']}", f"{self.config['locations']['data']}/submissions/{db_entry['temp']['uuid']}/{db_entry['temp']['file']}",
@@ -204,8 +204,8 @@ class PyroClient(PyroClient):
# ), # ),
# caption="queue", # caption="queue",
# ) # )
except UnexpectedStatus as exc: except UnexpectedStatus as exp:
raise SubmissionUnsupportedError(str(filepath)) from exc raise SubmissionUnsupportedError(str(filepath)) from exp
response_dict = ( response_dict = (
{} {}
@@ -226,7 +226,7 @@ class PyroClient(PyroClient):
) )
raise SubmissionDuplicatesError(str(filepath), duplicates) raise SubmissionDuplicatesError(str(filepath), duplicates)
await col_submitted.find_one_and_update( col_submitted.find_one_and_update(
{"_id": ObjectId(id)}, {"$set": {"done": True}} {"_id": ObjectId(id)}, {"$set": {"done": True}}
) )
@@ -258,12 +258,12 @@ class PyroClient(PyroClient):
* `PyroUser`: PyroUser object * `PyroUser`: PyroUser object
""" """
if ( if (
await col_users.find_one( col_users.find_one(
{"id": user.id if isinstance(user, User) else user} {"id": user.id if isinstance(user, User) else user}
) # type: ignore ) # type: ignore
is None is None
): ):
await col_users.insert_one( col_users.insert_one(
{ {
"id": user.id if isinstance(user, User) else user, "id": user.id if isinstance(user, User) else user,
"locale": user.language_code if isinstance(user, User) else None, "locale": user.language_code if isinstance(user, User) else None,
@@ -273,7 +273,7 @@ class PyroClient(PyroClient):
} }
) # type: ignore ) # type: ignore
db_record = await col_users.find_one( db_record = col_users.find_one(
{"id": user.id if isinstance(user, User) else user} {"id": user.id if isinstance(user, User) else user}
) # type: ignore ) # type: ignore

View File

@@ -20,19 +20,19 @@ class PyroUser:
cooldown: datetime cooldown: datetime
subscription: dict subscription: dict
async def update_locale(self, locale: str) -> None: async def update_locale(self, locale: str):
await col_users.update_one({"_id": self._id}, {"$set": {"locale": locale}}) col_users.update_one({"_id": self._id}, {"$set": {"locale": locale}})
async def update_cooldown(self, time: datetime = datetime.now()) -> None: async def update_cooldown(self, time: datetime = datetime.now()):
await col_users.update_one({"_id": self._id}, {"$set": {"cooldown": time}}) col_users.update_one({"_id": self._id}, {"$set": {"cooldown": time}})
async def block(self) -> None: async def block(self) -> None:
"""Ban user from using command and submitting content.""" """Ban user from using command and submitting content."""
await col_users.update_one({"_id": self._id}, {"$set": {"banned": True}}) col_users.update_one({"_id": self._id}, {"$set": {"banned": True}})
async def unblock(self) -> None: async def unblock(self) -> None:
"""Allow user to use command and submit posts again.""" """Allow user to use command and submit posts again."""
await col_users.update_one({"_id": self._id}, {"$set": {"banned": False}}) col_users.update_one({"_id": self._id}, {"$set": {"banned": False}})
async def is_limited(self, app: Union[PyroClient, None] = None) -> bool: async def is_limited(self, app: Union[PyroClient, None] = None) -> bool:
"""Check if user is on a cooldown after submitting something. """Check if user is on a cooldown after submitting something.
@@ -41,9 +41,11 @@ class PyroUser:
`bool`: Must be `True` if on the cooldown and `False` if not `bool`: Must be `True` if on the cooldown and `False` if not
""" """
admins = ( admins = (
await config_get("admins", "bot") + [await config_get("owner", "bot")] app.admins
if app is None if app is not None
else app.admins else (
await config_get("admins", "bot") + [await config_get("owner", "bot")]
)
) )
return (datetime.now() - self.cooldown).total_seconds() < ( return (datetime.now() - self.cooldown).total_seconds() < (

View File

@@ -83,8 +83,7 @@
"address_external": "https://photos.domain.com", "address_external": "https://photos.domain.com",
"username": "", "username": "",
"password": "", "password": "",
"album": "", "album": ""
"timeout": 15.0
} }
}, },
"caption": { "caption": {

View File

@@ -118,7 +118,7 @@ async def authorize(custom_session: Union[ClientSession, None] = None) -> str:
unauthorized_client = Client( unauthorized_client = Client(
base_url=sync.config_get("address", "posting", "api"), base_url=sync.config_get("address", "posting", "api"),
timeout=sync.config_get("timeout", "posting", "api"), timeout=5.0,
verify_ssl=True, verify_ssl=True,
raise_on_unexpected_status=True, raise_on_unexpected_status=True,
follow_redirects=False, follow_redirects=False,
@@ -142,7 +142,7 @@ if not isinstance(login_token, Token):
client = AuthenticatedClient( client = AuthenticatedClient(
base_url=sync.config_get("address", "posting", "api"), base_url=sync.config_get("address", "posting", "api"),
timeout=sync.config_get("timeout", "posting", "api"), timeout=5.0,
verify_ssl=True, verify_ssl=True,
raise_on_unexpected_status=True, raise_on_unexpected_status=True,
token=login_token.access_token, token=login_token.access_token,

View File

@@ -58,8 +58,8 @@ async def cli_create_user() -> None:
none = input( none = input(
"Alright. If you have email confirmation enabled - please confirm registration by using the link in your email. After that press Enter. Otherwise just press Enter." "Alright. If you have email confirmation enabled - please confirm registration by using the link in your email. After that press Enter. Otherwise just press Enter."
) )
except Exception as exc: except Exception as exp:
print(f"Could not create a user due to {exc}", flush=True) print(f"Could not create a user due to {exp}", flush=True)
print_exc() print_exc()
exit() exit()
if not args.create_album: if not args.create_album:
@@ -97,8 +97,8 @@ async def cli_create_album() -> None:
result_2 = await album_create(client=client, name=name, title=title) result_2 = await album_create(client=client, name=name, title=title)
# asyncio.run(create_album(name, title)) # asyncio.run(create_album(name, title))
await config_set("album", name, "posting", "api") await config_set("album", name, "posting", "api")
except Exception as exc: except Exception as exp:
print(f"Could not create an album due to {exc}", flush=True) print(f"Could not create an album due to {exp}", flush=True)
print_exc() print_exc()
exit() exit()
print("You're done!", flush=True) print("You're done!", flush=True)

View File

@@ -1,18 +0,0 @@
"""Custom message filters"""
from pyrogram import filters
from pyrogram.types import Message
from classes.pyroclient import PyroClient
async def _mode_post_func(_, __: PyroClient, message: Message):
return __.config["mode"]["post"]
async def _mode_submit_func(_, __: PyroClient, message: Message):
return __.config["mode"]["submit"]
mode_post = filters.create(_mode_post_func)
mode_submit = filters.create(_mode_submit_func)

View File

@@ -1,9 +1,11 @@
"""Module that provides all database columns""" """Module that provides all database columns"""
from async_pymongo import AsyncClient from pymongo import MongoClient
from libbot import sync from ujson import loads
db_config = sync.config_get("database") with open("config.json", "r", encoding="utf-8") as f:
db_config = loads(f.read())["database"]
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(
@@ -18,9 +20,15 @@ else:
db_config["host"], db_config["port"], db_config["name"] db_config["host"], db_config["port"], db_config["name"]
) )
db_client = AsyncClient(con_string) db_client = MongoClient(con_string)
db = db_client.get_database(name=db_config["name"]) db = db_client.get_database(name=db_config["name"])
collections = db.list_collection_names()
for collection in ["sent", "users", "submitted"]:
if collection not in collections:
db.create_collection(collection)
col_sent = db.get_collection("sent") col_sent = db.get_collection("sent")
col_users = db.get_collection("users") col_users = db.get_collection("users")
col_submitted = db.get_collection("submitted") col_submitted = db.get_collection("submitted")

View File

@@ -77,12 +77,12 @@ async def send_content(app: PyroClient, http_session: ClientSession) -> None:
try: try:
response: File = await func_iter[1](id=media.id, client=client) response: File = await func_iter[1](id=media.id, client=client)
except Exception as exc: except Exception as exp:
print_exc() print_exc()
logger.error("Media is invalid: %s", exc) logger.error("Media is invalid: %s", exp)
if app.config["reports"]["error"]: if app.config["reports"]["error"]:
await app.send_message( await app.send_message(
app.owner, f"Media is invalid: {exc}" app.owner, f"Media is invalid: {exp}"
) )
return return
@@ -103,11 +103,11 @@ async def send_content(app: PyroClient, http_session: ClientSession) -> None:
).results[0] ).results[0]
try: try:
response: File = await func[1](id=media.id, client=client) response: File = await func[1](id=media.id, client=client)
except Exception as exc: except Exception as exp:
print_exc() print_exc()
logger.error("Media is invalid: %s", exc) logger.error("Media is invalid: %s", exp)
if app.config["reports"]["error"]: if app.config["reports"]["error"]:
await app.send_message(app.owner, f"Media is invalid: {exc}") await app.send_message(app.owner, f"Media is invalid: {exp}")
return return
except (KeyError, AttributeError, TypeError, IndexError): except (KeyError, AttributeError, TypeError, IndexError):
@@ -179,7 +179,7 @@ async def send_content(app: PyroClient, http_session: ClientSession) -> None:
del response del response
submitted = await col_submitted.find_one({"temp.file": media.filename}) submitted = col_submitted.find_one({"temp.file": media.filename})
if submitted is not None and submitted["caption"] is not None: if submitted is not None and submitted["caption"] is not None:
caption = submitted["caption"].strip() caption = submitted["caption"].strip()
@@ -217,19 +217,19 @@ async def send_content(app: PyroClient, http_session: ClientSession) -> None:
caption=caption, caption=caption,
disable_notification=app.config["posting"]["silent"], disable_notification=app.config["posting"]["silent"],
) )
except Exception as exc: except Exception as exp:
logger.error( logger.error(
"Could not send media %s (%s) due to %s", media.filename, media.id, exc "Could not send media %s (%s) due to %s", media.filename, media.id, exp
) )
if app.config["reports"]["error"]: if app.config["reports"]["error"]:
await app.send_message( await app.send_message(
app.owner, app.owner,
app._("post_exception", "message").format(exc, format_exc()), app._("post_exception", "message").format(exp, format_exc()),
) )
# rmtree(path.join(app.config['locations']['tmp'], tmp_dir), ignore_errors=True) # rmtree(path.join(app.config['locations']['tmp'], tmp_dir), ignore_errors=True)
return return
await col_sent.insert_one( col_sent.insert_one(
{ {
"date": datetime.now(), "date": datetime.now(),
"image": media.id, "image": media.id,
@@ -253,14 +253,14 @@ async def send_content(app: PyroClient, http_session: ClientSession) -> None:
str(app.config["posting"]["silent"]), str(app.config["posting"]["silent"]),
) )
except Exception as exc: except Exception as exp:
logger.error( logger.error(
"Could not send content due to %s. Traceback: %s", exc, format_exc() "Could not send content due to %s. Traceback: %s", exp, format_exc()
) )
if app.config["reports"]["error"]: if app.config["reports"]["error"]:
await app.send_message( await app.send_message(
app.owner, app.owner,
app._("post_exception", "message").format(exc, format_exc()), app._("post_exception", "message").format(exp, format_exc()),
) )
try: try:
rmtree( rmtree(

View File

@@ -25,7 +25,7 @@ async def callback_query_yes(app: PyroClient, clb: CallbackQuery):
user = await app.find_user(clb.from_user) user = await app.find_user(clb.from_user)
fullclb = str(clb.data).split("_") fullclb = str(clb.data).split("_")
db_entry = await col_submitted.find_one({"_id": ObjectId(fullclb[2])}) db_entry = col_submitted.find_one({"_id": ObjectId(fullclb[2])})
try: try:
submission = await app.submit_media(fullclb[2]) submission = await app.submit_media(fullclb[2])
@@ -43,21 +43,21 @@ async def callback_query_yes(app: PyroClient, clb: CallbackQuery):
show_alert=True, show_alert=True,
) )
return return
except SubmissionDuplicatesError as exc: except SubmissionDuplicatesError as exp:
await clb.answer( await clb.answer(
text=app._("sub_duplicates_found", "callback", locale=user.locale), text=app._("sub_duplicates_found", "callback", locale=user.locale),
show_alert=True, show_alert=True,
) )
await clb.message.reply_text( await clb.message.reply_text(
app._("sub_media_duplicates_list", "message", locale=user.locale).format( app._("sub_media_duplicates_list", "message", locale=user.locale).format(
"\n".join(exc.duplicates) "\n".join(exp.duplicates)
), ),
quote=True, quote=True,
) )
logger.info( logger.info(
"Submission with ID '%s' could not be accepted because of the duplicates: %s", "Submission with ID '%s' could not be accepted because of the duplicates: %s",
fullclb[2], fullclb[2],
str(exc.duplicates), str(exp.duplicates),
) )
return return
@@ -127,7 +127,7 @@ async def callback_query_no(app: PyroClient, clb: CallbackQuery):
user = await app.find_user(clb.from_user) user = await app.find_user(clb.from_user)
fullclb = str(clb.data).split("_") fullclb = str(clb.data).split("_")
db_entry = await col_submitted.find_one_and_delete({"_id": ObjectId(fullclb[2])}) db_entry = col_submitted.find_one_and_delete({"_id": ObjectId(fullclb[2])})
if ( if (
db_entry["temp"]["uuid"] is not None db_entry["temp"]["uuid"] is not None
@@ -146,7 +146,7 @@ async def callback_query_no(app: PyroClient, clb: CallbackQuery):
submission = await app.get_messages( submission = await app.get_messages(
db_entry["user"], db_entry["telegram"]["msg_id"] db_entry["user"], db_entry["telegram"]["msg_id"]
) )
except Exception as exc: except Exception as exp:
await clb.answer( await clb.answer(
text=app._("sub_msg_unavail", "message", locale=user.locale), text=app._("sub_msg_unavail", "message", locale=user.locale),
show_alert=True, show_alert=True,

View File

@@ -3,14 +3,9 @@ from pyrogram.client import Client
from pyrogram.types import Message from pyrogram.types import Message
from classes.pyroclient import PyroClient from classes.pyroclient import PyroClient
from modules import custom_filters
@Client.on_message( @Client.on_message(~filters.scheduled & filters.command(["start"], prefixes="/"))
custom_filters.mode_submit
& ~filters.scheduled
& filters.command(["start"], prefixes="/")
)
async def cmd_start(app: PyroClient, msg: Message): async def cmd_start(app: PyroClient, msg: Message):
user = await app.find_user(msg.from_user) user = await app.find_user(msg.from_user)
@@ -21,9 +16,7 @@ async def cmd_start(app: PyroClient, msg: Message):
@Client.on_message( @Client.on_message(
custom_filters.mode_submit ~filters.scheduled & filters.command(["rules", "help"], prefixes="/")
& ~filters.scheduled
& filters.command(["rules", "help"], prefixes="/")
) )
async def cmd_rules(app: PyroClient, msg: Message): async def cmd_rules(app: PyroClient, msg: Message):
user = await app.find_user(msg.from_user) user = await app.find_user(msg.from_user)

View File

@@ -123,16 +123,16 @@ async def cmd_import(app: PyroClient, msg: Message):
for name in handle.namelist() for name in handle.namelist()
] ]
_ = await asyncio.gather(*tasks) _ = await asyncio.gather(*tasks)
except Exception as exc: except Exception as exp:
logger.error( logger.error(
"Could not import '%s' due to %s: %s", "Could not import '%s' due to %s: %s",
answer.document.file_name, answer.document.file_name,
exc, exp,
format_exc(), format_exc(),
) )
await answer.reply_text( await answer.reply_text(
app._("import_unpack_error", "message", locale=user.locale).format( app._("import_unpack_error", "message", locale=user.locale).format(
exc, format_exc() exp, format_exc()
) )
) )
return return
@@ -165,12 +165,12 @@ async def cmd_import(app: PyroClient, msg: Message):
compress=False, compress=False,
caption="queue", caption="queue",
) )
except UnexpectedStatus as exc: except UnexpectedStatus as exp:
logger.error( logger.error(
"Could not upload '%s' from '%s': %s", "Could not upload '%s' from '%s': %s",
filename, filename,
Path(f"{app.config['locations']['tmp']}/{tmp_dir}"), Path(f"{app.config['locations']['tmp']}/{tmp_dir}"),
exc, exp,
) )
await msg.reply_text( await msg.reply_text(
app._( app._(

View File

@@ -4,12 +4,10 @@ from pyrogram.client import Client
from pyrogram.types import Message, User from pyrogram.types import Message, User
from classes.pyroclient import PyroClient from classes.pyroclient import PyroClient
from modules import custom_filters
@Client.on_message( @Client.on_message(
custom_filters.mode_post ~filters.scheduled
& ~filters.scheduled
& filters.chat(sync.config_get("comments", "posting")) & filters.chat(sync.config_get("comments", "posting"))
& filters.reply & filters.reply
& filters.command(["report"], prefixes=["", "/"]) & filters.command(["report"], prefixes=["", "/"])

View File

@@ -13,7 +13,6 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message
from classes.enums.submission_types import SubmissionType from classes.enums.submission_types import SubmissionType
from classes.exceptions import SubmissionDuplicatesError, SubmissionUnsupportedError from classes.exceptions import SubmissionDuplicatesError, SubmissionUnsupportedError
from classes.pyroclient import PyroClient from classes.pyroclient import PyroClient
from modules import custom_filters
from modules.database import col_submitted from modules.database import col_submitted
from modules.utils import USERS_WITH_CONTEXT from modules.utils import USERS_WITH_CONTEXT
@@ -21,7 +20,7 @@ logger = logging.getLogger(__name__)
@Client.on_message( @Client.on_message(
custom_filters.mode_submit & ~filters.scheduled & filters.private & filters.photo ~filters.scheduled & filters.private & filters.photo
| filters.video | filters.video
# | filters.animation # | filters.animation
| filters.document | filters.document
@@ -153,7 +152,7 @@ async def get_submission(app: PyroClient, msg: Message):
+ sep, + sep,
) )
inserted = await col_submitted.insert_one( inserted = col_submitted.insert_one(
{ {
"user": msg.from_user.id, "user": msg.from_user.id,
"date": datetime.now(), "date": datetime.now(),
@@ -166,7 +165,7 @@ async def get_submission(app: PyroClient, msg: Message):
) )
else: else:
inserted = await col_submitted.insert_one( inserted = col_submitted.insert_one(
{ {
"user": msg.from_user.id, "user": msg.from_user.id,
"date": datetime.now(), "date": datetime.now(),
@@ -238,16 +237,16 @@ async def get_submission(app: PyroClient, msg: Message):
quote=True, quote=True,
) )
return return
except SubmissionDuplicatesError as exc: except SubmissionDuplicatesError as exp:
await msg.reply_text( await msg.reply_text(
app._( app._(
"sub_media_duplicates_list", "message", locale=user.locale "sub_media_duplicates_list", "message", locale=user.locale
).format("\n".join(exc.duplicates)), ).format("\n".join(exp.duplicates)),
quote=True, quote=True,
) )
return return
except Exception as exc: except Exception as exp:
await msg.reply_text(exc, quote=True) await msg.reply_text(format_exc(), quote=True)
return return
elif ( elif (
msg.from_user.id not in app.admins msg.from_user.id not in app.admins
@@ -271,12 +270,12 @@ async def get_submission(app: PyroClient, msg: Message):
) )
) )
return return
except SubmissionDuplicatesError as exc: except SubmissionDuplicatesError as exp:
await msg.reply_text( await msg.reply_text(
app._("sub_dup", "message", locale=user.locale), quote=True app._("sub_dup", "message", locale=user.locale), quote=True
) )
return return
except Exception as exc: except Exception as exp:
await app.send_message( await app.send_message(
app.owner, app.owner,
app._( app._(

View File

@@ -1,11 +1,15 @@
aiohttp~=3.8.4 aiohttp~=3.8.4
black~=23.3.0
convopyro==0.5 convopyro==0.5
pillow~=10.1.0 pillow~=10.0.0
psutil~=5.9.4
pykeyboard==0.1.5 pykeyboard==0.1.5
pymongo~=4.4.0
pyrogram==2.0.106
python_dateutil==2.8.2
pytimeparse~=1.1.8 pytimeparse~=1.1.8
tgcrypto==1.2.5 tgcrypto==1.2.5
uvloop==0.18.0 uvloop==0.17.0
--extra-index-url https://git.end-play.xyz/api/packages/profitroll/pypi/simple --extra-index-url https://git.end-play.xyz/api/packages/profitroll/pypi/simple
async_pymongo==0.1.4 libbot[speed,pyrogram]==1.8
libbot[speed,pyrogram]==2.0.1
photosapi_client==0.5.0 photosapi_client==0.5.0