dev #19

Merged
profitroll merged 98 commits from dev into master 2023-04-24 13:48:22 +03:00
3 changed files with 79 additions and 20 deletions
Showing only changes of commit 399fc5050d - Show all commits

View File

@ -40,9 +40,21 @@
"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": "Could not authorize API access. Please check whether provided in config file are valid and update them if they're not.", "api_creds_invalid": "Could not authorize API access. Please check whether provided in config file are valid and update them if they're not.",
"sub_wip": "Post submission is now WIP. It will be available again in a few days. Thank you for your patience.", "sub_wip": "Post submission is now WIP. It will be available again in a few days. Thank you for your patience.",
"sub_duplicates_found": "__TO_BE_ADDED__",
"sub_error": "⚠️ Could not upload this image due to bot error. Admins are advised.", "sub_error": "⚠️ Could not upload this image due to bot error. Admins are advised.",
"sub_error_admin": "User {0} could not submit photo without additional confirmation due to:\n```\n{1}\n```" "sub_error_admin": "User {0} could not submit photo without additional confirmation due to:\n```\n{1}\n```",
"import_request": "Alright, please send me a zip archive with your media to be imported. Use /cancel if you want to abort this operation.",
"import_ignored": "No response, aborting import.",
"import_abort": "Import aborted.",
"import_invalid_media": "File to import must be a zip archive. Aborting.",
"import_invalid_mime": "Provided file is not supported. Please send `application/zip`. Aborting.",
"import_too_big": "You archive is `{0} GiB` big, but system has only `{1} GiB` free. Unpacking may take even more space. Aborting.",
"import_downloading": "Downloading archive...",
"import_unpacking": "Unpacking archive...",
"import_unpack_error": "Could not unpack the archive\n\nException: {0}\n\nTraceback:\n```python\n{1}\n```",
"import_uploading": "Uploading archive contents...",
"import_upload_error_duplicate": "Could not upload `{0}` because there're duplicates on server.",
"import_upload_error_other": "Could not upload `{0}`. Probably disallowed filetype.",
"import_finished": "Import finished."
}, },
"button": { "button": {
"sub_yes": "✅ Accept", "sub_yes": "✅ Accept",
@ -62,7 +74,6 @@
"sub_msg_unavail": "Submission message no longer exist", "sub_msg_unavail": "Submission message no longer exist",
"sub_media_unavail": "Could not download submission", "sub_media_unavail": "Could not download submission",
"sub_done": "You've already decided what to do with submission", "sub_done": "You've already decided what to do with submission",
"sub_upload_failed": "__TO_BE_ADDED__",
"sub_duplicates_found": "There're duplicates in bot's database", "sub_duplicates_found": "There're duplicates in bot's database",
"nothing": "🏁 This action is already finished" "nothing": "🏁 This action is already finished"
}, },

View File

@ -40,9 +40,21 @@
"post_low": "Мала кількість контенту: `Залишилось всього {0} файлів в черзі.`", "post_low": "Мала кількість контенту: `Залишилось всього {0} файлів в черзі.`",
"api_creds_invalid": "Не вдалося авторизувати запит до API. Будь ласка, перевірте чи дані авторизації в конфігураційному файлі вірні та оновіть їх, якщо це не так.", "api_creds_invalid": "Не вдалося авторизувати запит до API. Будь ласка, перевірте чи дані авторизації в конфігураційному файлі вірні та оновіть їх, якщо це не так.",
"sub_wip": "Подання постів зараз знаходиться у розробці. Він буде знову доступний через кілька днів. Дякуємо за ваше терпіння.", "sub_wip": "Подання постів зараз знаходиться у розробці. Він буде знову доступний через кілька днів. Дякуємо за ваше терпіння.",
"sub_duplicates_found": "__TO_BE_ADDED__",
"sub_error": "⚠️ Не вдалось завантажити фото через помилку бота. Адміністрацію повідомлено.", "sub_error": "⚠️ Не вдалось завантажити фото через помилку бота. Адміністрацію повідомлено.",
"sub_error_admin": "Користувач {0} не зміг надіслати фото без додаткової перевірки через помилку:\n```\n{1}\n```" "sub_error_admin": "Користувач {0} не зміг надіслати фото без додаткової перевірки через помилку:\n```\n{1}\n```",
"import_request": "Гаразд, будь ласка, надішліть zip-архів з медіа для імпортування. Використовуйте /cancel, якщо ви хочете перервати цю операцію.",
"import_ignored": "Немає відповіді, перериваємо імпорт.",
"import_abort": "Імпорт перервано.",
"import_invalid_media": "Файл для імпорту має бути zip-архівом. Перериваємо.",
"import_invalid_mime": "Наданий файл не підтримується. Будь ласка, надішліть `application/zip`. Перервано.",
"import_too_big": "Ваш архів має розмір `{0} GiB`, але система має лише `{1} GiB` вільних. Розпакування може зайняти значно більше місця. Перервано.",
"import_downloading": "Завантажуємо архів...",
"import_unpacking": "Розпаковуємо архів...",
"import_unpack_error": "Не вдалося розпакувати архів\n\nПомилка: {0}\n\nTraceback:\n```python\n{1}\n```",
"import_uploading": "Завантажуємо вміст архіву...",
"import_upload_error_duplicate": "Не вдалося завантажити `{0}`, оскільки на сервері є дублікати.",
"import_upload_error_other": "Не вдалося завантажити `{0}`. Ймовірно, заборонений тип файлу.",
"import_finished": "Імпорт завершено."
}, },
"button": { "button": {
"sub_yes": "✅ Прийняти", "sub_yes": "✅ Прийняти",
@ -62,7 +74,6 @@
"sub_msg_unavail": "Повідомлення більше не існує", "sub_msg_unavail": "Повідомлення більше не існує",
"sub_media_unavail": "Не вдалося завантажити подання", "sub_media_unavail": "Не вдалося завантажити подання",
"sub_done": "Ви вже обрали що зробити з цим поданням", "sub_done": "Ви вже обрали що зробити з цим поданням",
"sub_upload_failed": "__TO_BE_ADDED__",
"sub_duplicates_found": "Знайдено дублікати в базі даних бота", "sub_duplicates_found": "Знайдено дублікати в базі даних бота",
"nothing": "🏁 Цю дію вже було завершено" "nothing": "🏁 Цю дію вже було завершено"
}, },

View File

@ -14,7 +14,7 @@ from classes.poster_client import PosterClient
from modules.api_client import upload_pic from modules.api_client import upload_pic
from modules.app import app, users_with_context from modules.app import app, users_with_context
from modules.logger import logWrite from modules.logger import logWrite
from modules.utils import configGet, extract_and_save from modules.utils import configGet, extract_and_save, locale
@app.on_message(~filters.scheduled & filters.command(["import"], prefixes=["", "/"])) @app.on_message(~filters.scheduled & filters.command(["import"], prefixes=["", "/"]))
@ -26,30 +26,47 @@ async def cmd_import(app: PosterClient, msg: Message):
else: else:
return return
await msg.reply_text( await msg.reply_text(
f"Alright, please send me a zip archive with your media to be imported. Use /cancel if you want to abort this operation." locale("import_request", "message", locale=msg.from_user.language_code)
) )
answer = await listen_message(app, msg.chat.id, timeout=600) answer = await listen_message(app, msg.chat.id, timeout=600)
users_with_context.remove(msg.from_user.id) users_with_context.remove(msg.from_user.id)
if answer is None: if answer is None:
await msg.reply_text("No response, aborting import.", quote=True) await msg.reply_text(
locale("import_ignored", "message", locale=msg.from_user.language_code),
quote=True,
)
return return
if answer.text == "/cancel": if answer.text == "/cancel":
await answer.reply_text("Okay, aborting.") await answer.reply_text(
locale("import_abort", "message", locale=msg.from_user.language_code)
)
return return
if answer.document is None: if answer.document is None:
await answer.reply_text( await answer.reply_text(
"File to import must be a zip archive. Aborting.", quote=True locale(
"import_invalid_media",
"message",
locale=msg.from_user.language_code,
),
quote=True,
) )
return return
if answer.document.mime_type != "application/zip": if answer.document.mime_type != "application/zip":
await answer.reply_text( await answer.reply_text(
"Provided file is not supported. Please send `application/zip`. Aborting.", locale(
"import_invalid_mime", "message", locale=msg.from_user.language_code
),
quote=True, quote=True,
) )
return return
if disk_usage(getcwd())[2] < (answer.document.file_size) * 3: if disk_usage(getcwd())[2] < (answer.document.file_size) * 3:
await msg.reply_text( await msg.reply_text(
f"You archive is `{answer.document.file_size//(2**30)} GiB` big, but system has only `{disk_usage(getcwd())[2]//(2**30)} GiB` free. Unpacking may take even more space. Aborting." locale(
"import_too_big", "message", locale=msg.from_user.language_code
).format(
answer.document.file_size // (2**30),
disk_usage(getcwd())[2] // (2**30),
)
) )
return return
tmp_dir = str(uuid4()) tmp_dir = str(uuid4())
@ -58,9 +75,14 @@ async def cmd_import(app: PosterClient, msg: Message):
) )
makedirs(path.join(configGet("tmp", "locations"), tmp_dir), exist_ok=True) makedirs(path.join(configGet("tmp", "locations"), tmp_dir), exist_ok=True)
tmp_path = path.join(configGet("tmp", "locations"), answer.document.file_id) tmp_path = path.join(configGet("tmp", "locations"), answer.document.file_id)
downloading = await answer.reply_text("Okay, downloading...", quote=True) downloading = await answer.reply_text(
locale("import_downloading", "message", locale=msg.from_user.language_code),
quote=True,
)
await app.download_media(answer, file_name=tmp_path) await app.download_media(answer, file_name=tmp_path)
await downloading.edit("Downloaded, unpacking...") await downloading.edit(
locale("import_unpacking", "message", locale=msg.from_user.language_code)
)
try: try:
with ZipFile(tmp_path, "r") as handle: with ZipFile(tmp_path, "r") as handle:
tasks = [ tasks = [
@ -75,11 +97,15 @@ async def cmd_import(app: PosterClient, msg: Message):
f"Could not import '{answer.document.file_name}' due to {exp}: {format_exc}" f"Could not import '{answer.document.file_name}' due to {exp}: {format_exc}"
) )
await answer.reply_text( await answer.reply_text(
f"Could not unpack the archive\n\nException: {exp}\n\nTraceback:\n```python\n{format_exc}\n```" locale(
"import_unpack_error", "message", locale=msg.from_user.language_code
).format(exp, format_exc())
) )
return return
logWrite(f"Downloaded '{answer.document.file_name}' - awaiting upload") logWrite(f"Downloaded '{answer.document.file_name}' - awaiting upload")
await downloading.edit("Unpacked, uploading...") await downloading.edit(
locale("import_uploading", "message", locale=msg.from_user.language_code)
)
remove(tmp_path) remove(tmp_path)
for filename in iglob( for filename in iglob(
@ -96,12 +122,20 @@ async def cmd_import(app: PosterClient, msg: Message):
) )
if len(uploaded[1]) > 0: if len(uploaded[1]) > 0:
await msg.reply_text( await msg.reply_text(
f"Could not upload `{path.basename(filename)}` because there're duplicates on server.", locale(
"import_upload_error_duplicate",
"message",
locale=msg.from_user.language_code,
).format(path.basename(filename)),
disable_notification=True, disable_notification=True,
) )
else: else:
await msg.reply_text( await msg.reply_text(
f"Could not upload `{path.basename(filename)}`. Probably disallowed filetype", locale(
"import_upload_error_other",
"message",
locale=msg.from_user.language_code,
).format(path.basename(filename)),
disable_notification=True, disable_notification=True,
) )
else: else:
@ -116,7 +150,10 @@ async def cmd_import(app: PosterClient, msg: Message):
debug=True, debug=True,
) )
rmtree(path.join(configGet("tmp", "locations"), tmp_dir), ignore_errors=True) rmtree(path.join(configGet("tmp", "locations"), tmp_dir), ignore_errors=True)
await answer.reply_text("Done.", quote=True) await answer.reply_text(
locale("import_finished", "message", locale=msg.from_user.language_code),
quote=True,
)
return return