WIP: API usage as main

This commit is contained in:
Profitroll 2023-02-15 14:06:06 +01:00
parent 6eaa6019a3
commit 5b1afe2c9e
12 changed files with 211 additions and 110 deletions

View File

@ -0,0 +1,8 @@
from enum import Enum
class SubmissionType(Enum):
DOCUMENT = "document"
VIDEO = "video"
ANIMATION = "animation"
PHOTO = "photo"

View File

@ -46,6 +46,7 @@
"channel": 0, "channel": 0,
"silent": false, "silent": false,
"move_sent": false, "move_sent": false,
"interval": 1,
"extensions": { "extensions": {
"photo": [ "photo": [
"jpg", "jpg",

View File

@ -1 +0,0 @@
[]

View File

@ -1,5 +0,0 @@
{
"last_id": 0,
"sent": [],
"captions": {}
}

View File

@ -1 +0,0 @@
{}

View File

@ -26,10 +26,11 @@
"mime_not_allowed": "File type not allowed. Please, consider using one of these: {0}", "mime_not_allowed": "File type not allowed. Please, consider using one of these: {0}",
"post_exception": "Could not send content due to `{0}`\n\nTraceback:\n```{1}```", "post_exception": "Could not send content due to `{0}`\n\nTraceback:\n```{1}```",
"post_invalid_pic": "__TO_BE_ADDED__", "post_invalid_pic": "__TO_BE_ADDED__",
"api_queue_empty": "Could not send content: `Queue folder is empty or contains only unsupported or already sent files.`", "api_queue_empty": "Could not send content: `Queue is empty or contains only unsupported files.`",
"api_queue_error": "__TO_BE_ADDED__", "api_queue_error": "__TO_BE_ADDED__",
"post_low": "Low amount of content: `There are only {0} files left in the queue.`", "post_low": "Low amount of content: `There are only {0} files left in the queue.`",
"api_creds_invalid": "__TO_BE_ADDED__" "api_creds_invalid": "__TO_BE_ADDED__",
"sub_wip": "Post submission is now WIP. It will be available again in a few days. Thank you for your patience."
}, },
"button": { "button": {
"sub_yes": "✅ Accept", "sub_yes": "✅ Accept",
@ -58,7 +59,7 @@
"post_sent": "Sent {0} to {1} with caption {2} and silently {3}", "post_sent": "Sent {0} to {1} with caption {2} and silently {3}",
"post_exception": "Could not send content due to {0}. Traceback: {1}", "post_exception": "Could not send content due to {0}. Traceback: {1}",
"post_invalid_pic": "__TO_BE_ADDED__", "post_invalid_pic": "__TO_BE_ADDED__",
"post_empty": "Could not send content due to queue folder empty with allowed extensions", "post_empty": "Could not send content due to queue empty or contains only forbidden extensions",
"sub_mime_not_allowed": "Got submission from {0} but type of {1} which is not allowed", "sub_mime_not_allowed": "Got submission from {0} but type of {1} which is not allowed",
"sub_document_too_large": "Got submission from {0} but but file is too large ({1} > {2})", "sub_document_too_large": "Got submission from {0} but but file is too large ({1} > {2})",
"sub_received": "Got submission from {0} with a caption {1}", "sub_received": "Got submission from {0} with a caption {1}",

View File

@ -26,10 +26,11 @@
"mime_not_allowed": "Тип файлу не дозволений. Розгляньте можливість використання одного з цих: {0}", "mime_not_allowed": "Тип файлу не дозволений. Розгляньте можливість використання одного з цих: {0}",
"post_exception": "Не вдалося надіслати контент через `{0}`\n\nTraceback:\n```{1}```", "post_exception": "Не вдалося надіслати контент через `{0}`\n\nTraceback:\n```{1}```",
"post_invalid_pic": "__TO_BE_ADDED__", "post_invalid_pic": "__TO_BE_ADDED__",
"api_queue_empty": "Не вдалося надіслати контент: `Папка черги порожня або містить лише непідтримувані або вже надіслані файли`.", "api_queue_empty": "Не вдалося надіслати контент: `Черга порожня або містить лише непідтримувані файли`.",
"api_queue_error": "__TO_BE_ADDED__", "api_queue_error": "__TO_BE_ADDED__",
"post_low": "Мала кількість контенту: `Залишилось всього {0} файлів в черзі.`", "post_low": "Мала кількість контенту: `Залишилось всього {0} файлів в черзі.`",
"api_creds_invalid": "__TO_BE_ADDED__" "api_creds_invalid": "__TO_BE_ADDED__",
"sub_wip": "Подання постів зараз знаходиться у розробці. Він буде знову доступний через кілька днів. Дякуємо за ваше терпіння."
}, },
"button": { "button": {
"sub_yes": "✅ Прийняти", "sub_yes": "✅ Прийняти",
@ -58,7 +59,7 @@
"post_sent": "Надіслано {0} у {1} з підписом {2} та без звуку {3}", "post_sent": "Надіслано {0} у {1} з підписом {2} та без звуку {3}",
"post_exception": "Не вдалося надіслати контент через {0}. Traceback: {1}", "post_exception": "Не вдалося надіслати контент через {0}. Traceback: {1}",
"post_invalid_pic": "__TO_BE_ADDED__", "post_invalid_pic": "__TO_BE_ADDED__",
"post_empty": "Не вдалося надіслати контент через порожню папку черги з дозволеними розширеннями", "post_empty": "Не вдалося надіслати контент адже черга з дозволеними розширеннями порожня",
"sub_mime_not_allowed": "Отримано подання від {0} але типу {1} який не є дозволеним", "sub_mime_not_allowed": "Отримано подання від {0} але типу {1} який не є дозволеним",
"sub_document_too_large": "Отримано подання від {0} але файл завеликий({1} > {2})", "sub_document_too_large": "Отримано подання від {0} але файл завеликий({1} > {2})",
"sub_received": "Отримано подання від {0} з підписом {1}", "sub_received": "Отримано подання від {0} з підписом {1}",

View File

@ -27,10 +27,11 @@ db = db_client.get_database(name=db_config["name"])
collections = db.list_collection_names() collections = db.list_collection_names()
for collection in ["sent", "banned", "submitted"]: for collection in ["sent", "users", "banned", "submitted"]:
if not collection in collections: if not collection in collections:
db.create_collection(collection) db.create_collection(collection)
col_sent = db.get_collection("sent") col_sent = db.get_collection("sent")
col_users = db.get_collection("users")
col_banned = db.get_collection("banned") col_banned = db.get_collection("banned")
col_submitted = db.get_collection("submitted") col_submitted = db.get_collection("submitted")

View File

@ -1,32 +1,27 @@
from time import time from datetime import datetime, timezone
from modules.utils import jsonLoad, jsonSave, configGet from modules.utils import configGet
from modules.database import col_users, col_banned
from pyrogram.types.user_and_chats import User
def subLimit(user): def subLimit(user: User) -> None:
submit = jsonLoad(configGet("submit", "locations")) if col_users.find_one_and_update({"user": user.id}, {"$set": {"cooldown": datetime.now(tz=timezone.utc)}}) is None:
submit[str(user.id)] = time() col_users.insert_one({"user": user.id, "cooldown": datetime.now(tz=timezone.utc)})
jsonSave(submit, configGet("submit", "locations"))
def subLimited(user): def subLimited(user: User) -> bool:
if user.id == configGet("admin"): if user.id == configGet("admin"):
return False return False
else: else:
submit = jsonLoad(configGet("submit", "locations")) db_record = col_users.find_one({"user": user.id})
if str(user.id) in submit: if db_record is None:
if (time() - submit[str(user.id)]) < configGet("timeout", "submission"):
return True
else:
return False
else:
return False return False
return True if (datetime.now(tz=timezone.utc) - db_record["cooldown"]).total_seconds() < configGet("timeout", "submission") else False
def subBlock(user): def subBlocked(user: User) -> bool:
blocked = jsonLoad(configGet("blocked", "locations")) return False if col_banned.find_one({"user": user.id}) is None else True
if user not in blocked:
blocked.append(user)
jsonSave(blocked, configGet("blocked", "locations"))
def subUnblock(user): def subBlock(user: User) -> None:
blocked = jsonLoad(configGet("blocked", "locations")) if col_banned.find_one({"user": user.id}) is None:
if user in blocked: col_banned.insert_one({"user": user.id, "date": datetime.now(tz=timezone.utc)})
blocked.remove(user)
jsonSave(blocked, configGet("blocked", "locations")) def subUnblock(user: User) -> None:
col_banned.find_one_and_delete({"user": user.id})

View File

@ -1,26 +1,51 @@
from os import sep from os import path, sep
from pathlib import Path from pathlib import Path
from pyrogram import filters from pyrogram import filters
from pyrogram.client import Client from pyrogram.client import Client
from pyrogram.types import (CallbackQuery, InlineKeyboardButton, from pyrogram.types import CallbackQuery
InlineKeyboardMarkup)
from modules.api_client import upload_pic from modules.api_client import upload_pic
from modules.app import app from modules.app import app
from modules.submissions import subBlock, subUnblock from modules.submissions import subBlock, subUnblock
from modules.utils import configGet, jsonLoad, jsonSave, locale from modules.utils import configGet, jsonLoad, jsonSave, locale
from modules.database import col_submitted
from bson import ObjectId
@app.on_callback_query(filters.regex("sub_yes_[\s\S]*_[\s\S]*")) @app.on_callback_query(filters.regex("sub_yes_[\s\S]*"))
async def callback_query_yes(app: Client, clb: CallbackQuery): async def callback_query_yes(app: Client, clb: CallbackQuery):
fullclb = clb.data.split("_") fullclb = clb.data.split("_")
user_locale = clb.from_user.language_code user_locale = clb.from_user.language_code
try:
submission = await app.get_messages(int(fullclb[2]), int(fullclb[3])) # Check if submission is in DB and really exists
except:
# Upload the file to the API server
# Modify submission in DB to state that it's accepted (or so called "done")
# Change keyboard to a completed variant
# Send replies to both user and admin about accepting the application
db_entry = col_submitted.find_one({"_id": ObjectId(fullclb[2])})
if db_entry is None:
await clb.answer(text=locale("sub_msg_unavail", "message", locale=user_locale), show_alert=True) await clb.answer(text=locale("sub_msg_unavail", "message", locale=user_locale), show_alert=True)
return return
else:
if db_entry["tmp"]["uuid"] is not None:
if not path.exists(path.join(configGet("data", "locations"), "submissions", db_entry["tmp"]["uuid"], db_entry["tmp"]["file"])):
await clb.answer(text=locale("sub_msg_unavail", "message", locale=user_locale), show_alert=True)
return
else:
try:
submission = await app.get_messages(db_entry["user"], db_entry["telegram"]["msg_id"])
except:
await clb.answer(text=locale("sub_msg_unavail", "message", locale=user_locale), show_alert=True)
return
try: try:
if configGet("api_based", "mode") is True: if configGet("api_based", "mode") is True:
media = await app.download_media(submission, file_name=configGet("tmp", "locations")+sep) media = await app.download_media(submission, file_name=configGet("tmp", "locations")+sep)
@ -51,7 +76,7 @@ async def callback_query_yes(app: Client, clb: CallbackQuery):
# 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))
@app.on_callback_query(filters.regex("sub_no_[\s\S]*_[\s\S]*")) @app.on_callback_query(filters.regex("sub_no_[\s\S]*"))
async def callback_query_no(app: Client, clb: CallbackQuery): async def callback_query_no(app: Client, clb: CallbackQuery):
fullclb = clb.data.split("_") fullclb = clb.data.split("_")
user_locale = clb.from_user.language_code user_locale = clb.from_user.language_code

View File

@ -3,15 +3,16 @@ from pyrogram.client import Client
from pyrogram.types import Message from pyrogram.types import Message
from modules.app import app from modules.app import app
from modules.submissions import subBlocked
from modules.utils import configGet, jsonLoad, locale from modules.utils import configGet, jsonLoad, locale
@app.on_message(~ filters.scheduled & filters.command(["start"], prefixes="/")) @app.on_message(~ filters.scheduled & filters.command(["start"], prefixes="/"))
async def cmd_start(app: Client, msg: Message): async def cmd_start(app: Client, msg: Message):
if msg.from_user.id not in jsonLoad(configGet("blocked", "locations")): if subBlocked(msg.from_user) is False:
await msg.reply_text(locale("start", "message", locale=msg.from_user.language_code)) await msg.reply_text(locale("start", "message", locale=msg.from_user.language_code))
@app.on_message(~ filters.scheduled & filters.command(["rules", "help"], prefixes="/")) @app.on_message(~ filters.scheduled & filters.command(["rules", "help"], prefixes="/"))
async def cmd_rules(app: Client, msg: Message): async def cmd_rules(app: Client, msg: Message):
if msg.from_user.id not in jsonLoad(configGet("blocked", "locations")): if subBlocked(msg.from_user) is False:
await msg.reply_text(locale("rules", "message", locale=msg.from_user.language_code)) await msg.reply_text(locale("rules", "message", locale=msg.from_user.language_code))

View File

@ -1,87 +1,162 @@
from datetime import datetime, timezone
from os import makedirs, path, sep
from uuid import uuid4
from pyrogram import filters from pyrogram import filters
from pyrogram.client import Client from pyrogram.client import Client
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message
from modules.app import app from modules.app import app
from modules.database import col_banned, col_submitted
from modules.logger import logWrite from modules.logger import logWrite
from modules.submissions import subLimit, subLimited from modules.submissions import subLimit, subLimited
from modules.utils import configGet, jsonLoad, locale from modules.utils import configGet, locale
from modules.database import col_banned from classes.enums.submission_types import SubmissionType
@app.on_message(~ filters.scheduled & filters.photo) # | filters.video | filters.animation | filters.document) @app.on_message(~ filters.scheduled & filters.photo | filters.video | filters.animation | filters.document)
async def get_submission(_: Client, msg: Message): async def get_submission(_: Client, msg: Message):
try: locale("sub_wip", "message", locale=msg.from_user.language_code)
if col_banned.find_one( {"user": msg.from_user.id} ) is not None: # try:
return
user_locale = msg.from_user.language_code # if col_banned.find_one( {"user": msg.from_user.id} ) is not None:
# return
if not subLimited(msg.from_user): # user_locale = msg.from_user.language_code
# save_tmp = True
# contents = None
if msg.document != None: # if subLimited(msg.from_user):
if msg.document.mime_type not in configGet("mime_types", "submission"): # await msg.reply_text(locale("sub_cooldown", "message", locale=user_locale).format(str(configGet("timeout", "submission"))))
await msg.reply_text(locale("mime_not_allowed", "message", locale=user_locale), quote=True) # return
return
if msg.document.file_size > configGet("file_size", "submission"):
await msg.reply_text(locale("document_too_large", "message", locale=user_locale).format(str(configGet("file_size", "submission")/1024/1024)), quote=True)
return
if msg.video != None: # if msg.document is not None:
if msg.video.file_size > configGet("file_size", "submission"): # if msg.document.mime_type not in configGet("mime_types", "submission"):
await msg.reply_text(locale("document_too_large", "message", locale=user_locale).format(str(configGet("file_size", "submission")/1024/1024)), quote=True) # await msg.reply_text(locale("mime_not_allowed", "message", locale=user_locale), quote=True)
return # return
# if msg.document.file_size > configGet("file_size", "submission"):
# await msg.reply_text(locale("document_too_large", "message", locale=user_locale).format(str(configGet("file_size", "submission")/1024/1024)), quote=True)
# return
# if msg.document.file_size > configGet("tmp_size", "submission"):
# save_tmp = False
# contents = msg.document.file_id, SubmissionType.DOCUMENT #, msg.document.file_name
buttons = [ # if msg.video is not None:
[ # if msg.video.file_size > configGet("file_size", "submission"):
InlineKeyboardButton(text=locale("sub_yes", "button", locale=configGet("locale")), callback_data=f"sub_yes_{msg.from_user.id}_{msg.id}") # await msg.reply_text(locale("document_too_large", "message", locale=user_locale).format(str(configGet("file_size", "submission")/1024/1024)), quote=True)
] # return
] # if msg.video.file_size > configGet("tmp_size", "submission"):
# save_tmp = False
# contents = msg.video.file_id, SubmissionType.VIDEO #, msg.video.file_name
if msg.caption != None: # if msg.animation is not None:
caption = str(msg.caption) # if msg.animation.file_size > configGet("file_size", "submission"):
buttons[0].append( # await msg.reply_text(locale("document_too_large", "message", locale=user_locale).format(str(configGet("file_size", "submission")/1024/1024)), quote=True)
InlineKeyboardButton(text=locale("sub_yes_caption", "button", locale=configGet("locale")), callback_data=f"sub_yes_{msg.from_user.id}_{msg.id}_caption") # return
) # if msg.animation.file_size > configGet("tmp_size", "submission"):
buttons[0].append( # save_tmp = False
InlineKeyboardButton(text=locale("sub_no", "button", locale=configGet("locale")), callback_data=f"sub_no_{msg.from_user.id}_{msg.id}") # contents = msg.animation.file_id, SubmissionType.ANIMATION #, msg.animation.file_name
)
else:
caption = ""
buttons[0].append(
InlineKeyboardButton(text=locale("sub_no", "button", locale=configGet("locale")), callback_data=f"sub_no_{msg.from_user.id}_{msg.id}")
)
caption += locale("sub_by", "message", locale=locale(configGet("locale"))) # if msg.photo is not None:
# contents = msg.photo.file_id, SubmissionType.PHOTO #, "please_generate"
if msg.from_user.first_name != None: # if save_tmp is not None:
caption += f" {msg.from_user.first_name}"
if msg.from_user.last_name != None:
caption += f" {msg.from_user.last_name}"
if msg.from_user.username != None:
caption += f" (@{msg.from_user.username})"
if msg.from_user.phone_number != None:
caption += f" ({msg.from_user.phone_number})"
if msg.from_user.id != configGet("admin"): # if contents is None:
buttons += [ # return
[
InlineKeyboardButton(text=locale("sub_block", "button", locale=configGet("locale")), callback_data=f"sub_block_{msg.from_user.id}")
],
[
InlineKeyboardButton(text=locale("sub_unblock", "button", locale=configGet("locale")), callback_data=f"sub_unblock_{msg.from_user.id}")
]
]
await msg.reply_text(locale("sub_sent", "message", locale=user_locale), quote=True) # tmp_id = str(uuid4())
subLimit(msg.from_user) # # filename = tmp_id if contents[1] == "please_generate" else contents[1]
# makedirs(path.join(configGet("data", "locations"), "submissions", tmp_id), exist_ok=True)
# downloaded = await app.download_media(msg, path.join(configGet("data", "locations"), "submissions", tmp_id)+sep)
# inserted = col_submitted.insert_one(
# {
# "user": msg.from_user.id,
# "date": datetime.now(tz=timezone.utc),
# "done": False,
# "type": contents[1].value,
# "temp": {
# "uuid": tmp_id,
# "file": path.basename(str(downloaded))
# },
# "telegram": {
# "msg_id": msg.id,
# "file_id": contents[0]
# },
# "caption": str(msg.caption) if msg.caption is not None else None
# }
# )
# else:
await msg.copy(configGet("admin"), caption=caption, reply_markup=InlineKeyboardMarkup(buttons)) # if contents is None:
# return
else: # inserted = col_submitted.insert_one(
await msg.reply_text(locale("sub_cooldown", "message", locale=user_locale).format(str(configGet("timeout", "submission")))) # {
# "user": msg.from_user.id,
# "date": datetime.now(tz=timezone.utc),
# "done": False,
# "type": contents[1].value,
# "temp": {
# "uuid": None,
# "file": None
# },
# "telegram": {
# "msg_id": msg.id,
# "file_id": contents[0]
# },
# "caption": str(msg.caption) if msg.caption is not None else None
# }
# )
# buttons = [
# [
# InlineKeyboardButton(text=locale("sub_yes", "button", locale=configGet("locale")), callback_data=f"sub_yes_{str(inserted.inserted_id)}")
# ]
# ]
except AttributeError: # if msg.caption is not None:
logWrite(f"from_user in function get_submission does not seem to contain id") # caption = str(msg.caption)
# buttons[0].append(
# InlineKeyboardButton(text=locale("sub_yes_caption", "button", locale=configGet("locale")), callback_data=f"sub_yes_{str(inserted.inserted_id)}_caption")
# )
# buttons[0].append(
# InlineKeyboardButton(text=locale("sub_no", "button", locale=configGet("locale")), callback_data=f"sub_no_{str(inserted.inserted_id)}")
# )
# else:
# caption = ""
# buttons[0].append(
# InlineKeyboardButton(text=locale("sub_no", "button", locale=configGet("locale")), callback_data=f"sub_no_{str(inserted.inserted_id)}")
# )
# caption += locale("sub_by", "message", locale=locale(configGet("locale")))
# if msg.from_user.first_name is not None:
# caption += f" {msg.from_user.first_name}"
# if msg.from_user.last_name is not None:
# caption += f" {msg.from_user.last_name}"
# if msg.from_user.username is not None:
# caption += f" (@{msg.from_user.username})"
# if msg.from_user.phone_number is not None:
# caption += f" ({msg.from_user.phone_number})"
# if msg.from_user.id != configGet("admin"):
# buttons += [
# [
# InlineKeyboardButton(text=locale("sub_block", "button", locale=configGet("locale")), callback_data=f"sub_block_{msg.from_user.id}")
# ]
# # [
# # InlineKeyboardButton(text=locale("sub_unblock", "button", locale=configGet("locale")), callback_data=f"sub_unblock_{msg.from_user.id}")
# # ]
# ]
# await msg.reply_text(locale("sub_sent", "message", locale=user_locale), quote=True)
# subLimit(msg.from_user)
# await msg.copy(configGet("admin"), caption=caption, reply_markup=InlineKeyboardMarkup(buttons))
# except AttributeError:
# logWrite(f"from_user in function get_submission does not seem to contain id")