Merge branch 'master' of https://git.profitroll.eu/profitroll/TelegramPoster
This commit is contained in:
commit
46ea9a2f74
@ -55,6 +55,6 @@ Examples:
|
|||||||
## Localization
|
## Localization
|
||||||
Bot is capable of using custom locales. There are some that are pre-installed (English and Ukrainian), however you can add your own locales too.
|
Bot is capable of using custom locales. There are some that are pre-installed (English and Ukrainian), however you can add your own locales too.
|
||||||
|
|
||||||
All localization files are located in the `locale` folder, otherwise in folder specified in config file. Just copy locale file of your choice, name it in accordance to [IETF language tags](https://en.wikipedia.org/wiki/IETF_language_tag) (if you want your locale to be compatible with Telegram's locales) or define your own name. Save it as json and you're good to go. If you want to change default locale for console output and messages, that cannot determine admin's locale - edit `"locale"` parameter in the `config.json`. If this locale is not available - `"locale_fallback"` will be used instead. If both are not available - error will be shown.
|
All localization files are located in the `locale` folder, otherwise in folder specified in config file. Just copy locale file of your choice, name it in accordance to [IETF language tags](https://en.wikipedia.org/wiki/IETF_language_tag) (if you want your locale to be compatible with Telegram's locales) or define your own name. Save it as json and you're good to go. If you want to change default locale for messages, that cannot determine admin's locale - edit `"locale"` parameter in the `config.json`. If this locale is not available - `"locale_fallback"` will be used instead. If both are not available - error will be shown. For console output and logging locale you should edit `"locale_log"`.
|
||||||
|
|
||||||
We recommend to only make changes to your custom locale. Or at least always have your backup of for example `en.json` as your fallback.
|
We recommend to only make changes to your custom locale. Or at least always have your backup of for example `en.json` as your fallback.
|
@ -53,6 +53,6 @@
|
|||||||
## Локалізація
|
## Локалізація
|
||||||
Бот може використовувати різні мови. Є деякі попередньо встановлені (Англійська та Українська), однак Ви можете додавати свої власні локалізації теж.
|
Бот може використовувати різні мови. Є деякі попередньо встановлені (Англійська та Українська), однак Ви можете додавати свої власні локалізації теж.
|
||||||
|
|
||||||
Всі файли локалізації знаходяться у папці `locale`, якщо в конфігураційному файлі не вказано іншу. Просто скопіюйте цікавлячий Вас файл, назвіть його відповідно до [тегів мови IETF](https://en.wikipedia.org/wiki/IETF_language_tag) (якщо Ви хочете, щоб переклад був сумісним з перекладами Telegram) або просто вкажіть свою власну назву. Збережіть свій переклад як json файл і все готово. Якщо ви хочете змінити мову за замовчуванням для виведення консолі та повідомлень самого бота, які не можуть визначити мову адміністратора, відредагуйте параметр `"locale"` у `config.json`. Якщо ця мова недоступна, замість неї буде використано `"locale_fallback"`. Якщо обидві мови недоступні - буде показано помилку.
|
Всі файли локалізації знаходяться у папці `locale`, якщо в конфігураційному файлі не вказано іншу. Просто скопіюйте цікавлячий Вас файл, назвіть його відповідно до [тегів мови IETF](https://en.wikipedia.org/wiki/IETF_language_tag) (якщо Ви хочете, щоб переклад був сумісним з перекладами Telegram) або просто вкажіть свою власну назву. Збережіть свій переклад як json файл і все готово. Якщо ви хочете змінити мову за замовчуванням для повідомлень самого бота, які не можуть визначити мову адміністратора, відредагуйте параметр `"locale"` у `config.json`. Якщо ця мова недоступна, замість неї буде використано `"locale_fallback"`. Якщо обидві мови недоступні - буде показано помилку. Для зміни мови виведення консолі та логування вам слід відредагувати `"locale_log"`.
|
||||||
|
|
||||||
Ми рекомендуємо вносити будь-які зміни лише до вашої окремої мови. Або, принаймні, завжди мати резервну копію, наприклад, `en.json` як запасний варіант.
|
Ми рекомендуємо вносити будь-які зміни лише до вашої окремої мови. Або, принаймні, завжди мати резервну копію, наприклад, `en.json` як запасний варіант.
|
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"module": null,
|
"module": null,
|
||||||
"locale": "en",
|
"locale": "en",
|
||||||
|
"locale_log": "en",
|
||||||
"locale_fallback": "en",
|
"locale_fallback": "en",
|
||||||
"admin": 0,
|
"admin": 0,
|
||||||
"bot": {
|
"bot": {
|
||||||
|
@ -22,7 +22,8 @@
|
|||||||
"document_too_large": "File you've sent is too large. Please submit files not bigger than {0} MB",
|
"document_too_large": "File you've sent is too large. Please submit files not bigger than {0} MB",
|
||||||
"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 `{exp}`\n\nTraceback:\n```{0}```",
|
"post_exception": "Could not send content due to `{exp}`\n\nTraceback:\n```{0}```",
|
||||||
"post_empty": "Could not send content: `Queue folder is empty or contains only unsupported or already sent files.`"
|
"post_empty": "Could not send content: `Queue folder is empty or contains only unsupported or already sent files.`",
|
||||||
|
"post_low": "Low amount of content: `There are only {0} files left in the queue.`"
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
"sub_yes": "✅ Accept",
|
"sub_yes": "✅ Accept",
|
||||||
@ -30,7 +31,9 @@
|
|||||||
"sub_no": "❌ Deny",
|
"sub_no": "❌ Deny",
|
||||||
"sub_block": "☠️ Block sender",
|
"sub_block": "☠️ Block sender",
|
||||||
"sub_unblock": "🏳️ Unblock sender",
|
"sub_unblock": "🏳️ Unblock sender",
|
||||||
"post_view": "View in channel"
|
"post_view": "View in channel",
|
||||||
|
"accepted": "✅ Accepted",
|
||||||
|
"declined": "❌ Declined"
|
||||||
},
|
},
|
||||||
"callback": {
|
"callback": {
|
||||||
"sub_yes": "✅ Submission approved",
|
"sub_yes": "✅ Submission approved",
|
||||||
@ -38,7 +41,8 @@
|
|||||||
"sub_block": "User {0} has been blocked",
|
"sub_block": "User {0} has been blocked",
|
||||||
"sub_unblock": "User {0} has been unblocked",
|
"sub_unblock": "User {0} has been unblocked",
|
||||||
"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"
|
||||||
},
|
},
|
||||||
"console": {
|
"console": {
|
||||||
"shutdown": "Shutting down bot with pid {0}",
|
"shutdown": "Shutting down bot with pid {0}",
|
||||||
@ -48,6 +52,19 @@
|
|||||||
"post_sent": "Sent {0} of type {1} to {2} with caption {3} and silently {4}",
|
"post_sent": "Sent {0} of type {1} to {2} with caption {3} and silently {4}",
|
||||||
"post_exception": "Could not send content due to {0}. Traceback: {1}",
|
"post_exception": "Could not send content due to {0}. Traceback: {1}",
|
||||||
"post_empty": "Could not send content due to queue folder empty with allowed extensions",
|
"post_empty": "Could not send content due to queue folder empty with allowed extensions",
|
||||||
|
"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_received": "Got submission from {0} with a caption {1}",
|
||||||
|
"sub_cooldown": "Got submission from {0} but user is on a cooldown",
|
||||||
|
"sub_no_id": "from_user in function get_submission does not contain id (maybe user posted in a channel)",
|
||||||
|
"sub_msg_unavail": "Could not download submission {0} from user {1}: message not available",
|
||||||
|
"sub_media_unavail": "Could not download submission {0} from user {1}: media not available",
|
||||||
|
"sub_media_downloading": "Downloading media of submission {0} from user {1}...",
|
||||||
|
"sub_media_downloaded": "Downloaded media of submission {0} from user {1}",
|
||||||
|
"sub_accepted": "Accepted submission {0} from user {1}",
|
||||||
|
"sub_declined": "Declined submission {0} from user {1}",
|
||||||
|
"sub_blocked": "Blocked user {0}",
|
||||||
|
"sub_unblocked": "Unblocked user {0}",
|
||||||
"deps_missing": "Required modules are not installed. Run 'pip3 install -r requirements.txt' and restart the program.",
|
"deps_missing": "Required modules are not installed. Run 'pip3 install -r requirements.txt' and restart the program.",
|
||||||
"passed_norun": "Argument --norun passed, not running the main script",
|
"passed_norun": "Argument --norun passed, not running the main script",
|
||||||
"move_sent_doesnt_exist": "File '{0}' is already moved or does not exist",
|
"move_sent_doesnt_exist": "File '{0}' is already moved or does not exist",
|
||||||
|
@ -14,15 +14,16 @@
|
|||||||
"startup": "Запуск бота з підом `{0}`",
|
"startup": "Запуск бота з підом `{0}`",
|
||||||
"sub_yes": "✅ Подання схвалено та прийнято",
|
"sub_yes": "✅ Подання схвалено та прийнято",
|
||||||
"sub_no": "❌ Подання розглянуто та відхилено",
|
"sub_no": "❌ Подання розглянуто та відхилено",
|
||||||
"sub_blocked": "Вас заблокували, і ви більше не можете надсилати медіафайли.",
|
"sub_blocked": "Вас заблокували, ви більше не можете надсилати медіафайли.",
|
||||||
"sub_unblocked": "Вас розблокували, і тепер ви можете надсилати медіафайли.",
|
"sub_unblocked": "Вас розблокували, тепер ви можете надсилати медіафайли.",
|
||||||
"sub_by": "\n\nПредставлено:",
|
"sub_by": "\n\nПредставлено:",
|
||||||
"sub_sent": "Медіа-файл надіслано.\nСкоро ми повідомимо вас, чи буде його прийнято.",
|
"sub_sent": "Медіа-файл надіслано.\nСкоро ми повідомимо вас, чи буде його прийнято.",
|
||||||
"sub_cooldown": "Ви можете надсилати лише 1 медіафайл на {0} секунд",
|
"sub_cooldown": "Ви можете надсилати лише 1 медіафайл на {0} секунд",
|
||||||
"document_too_large": "Надісланий файл завеликий. Будь ласка, надсилайте файли не більше {0} Мб",
|
"document_too_large": "Надісланий файл завеликий. Будь ласка, надсилайте файли не більше {0} Мб",
|
||||||
"mime_not_allowed": "Тип файлу не дозволений. Розгляньте можливість використання одного з цих: {0}",
|
"mime_not_allowed": "Тип файлу не дозволений. Розгляньте можливість використання одного з цих: {0}",
|
||||||
"post_exception": "Не вдалося надіслати контент через `{exp}`\n\nTraceback:\n```{0}```",
|
"post_exception": "Не вдалося надіслати контент через `{exp}`\n\nTraceback:\n```{0}```",
|
||||||
"post_empty": "Не вдалося надіслати контент: «Папка черги порожня або містить лише непідтримувані або вже надіслані файли»."
|
"post_empty": "Не вдалося надіслати контент: `Папка черги порожня або містить лише непідтримувані або вже надіслані файли`.",
|
||||||
|
"post_low": "Мала кількість контенту: `Залишилось всього {0} файлів в черзі.`"
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
"sub_yes": "✅ Прийняти",
|
"sub_yes": "✅ Прийняти",
|
||||||
@ -30,7 +31,9 @@
|
|||||||
"sub_no": "❌ Відхилити",
|
"sub_no": "❌ Відхилити",
|
||||||
"sub_block": "☠️ Заблокувати відправника",
|
"sub_block": "☠️ Заблокувати відправника",
|
||||||
"sub_unblock": "🏳️ Розблокувати відправника",
|
"sub_unblock": "🏳️ Розблокувати відправника",
|
||||||
"post_view": "Переглянути на каналі"
|
"post_view": "Переглянути на каналі",
|
||||||
|
"accepted": "✅ Прийнято",
|
||||||
|
"declined": "❌ Відхилено"
|
||||||
},
|
},
|
||||||
"callback": {
|
"callback": {
|
||||||
"sub_yes": "✅ Подання схвалено",
|
"sub_yes": "✅ Подання схвалено",
|
||||||
@ -38,7 +41,8 @@
|
|||||||
"sub_block": "Користувача {0} заблоковано",
|
"sub_block": "Користувача {0} заблоковано",
|
||||||
"sub_unblock": "Користувача {0} розблоковано",
|
"sub_unblock": "Користувача {0} розблоковано",
|
||||||
"sub_msg_unavail": "Повідомлення більше не існує",
|
"sub_msg_unavail": "Повідомлення більше не існує",
|
||||||
"sub_media_unavail": "Не вдалося завантажити подання"
|
"sub_media_unavail": "Не вдалося завантажити подання",
|
||||||
|
"sub_done": "Ви вже обрали що зробити з цим поданням"
|
||||||
},
|
},
|
||||||
"console": {
|
"console": {
|
||||||
"shutdown": "Вимкнення бота з підом {0}",
|
"shutdown": "Вимкнення бота з підом {0}",
|
||||||
@ -48,6 +52,19 @@
|
|||||||
"post_sent": "Надіслано {0} типу {1} у {2} з підписом {3} та без звуку {4}",
|
"post_sent": "Надіслано {0} типу {1} у {2} з підписом {3} та без звуку {4}",
|
||||||
"post_exception": "Не вдалося надіслати контент через {0}. Traceback: {1}",
|
"post_exception": "Не вдалося надіслати контент через {0}. Traceback: {1}",
|
||||||
"post_empty": "Не вдалося надіслати контент через порожню папку черги з дозволеними розширеннями",
|
"post_empty": "Не вдалося надіслати контент через порожню папку черги з дозволеними розширеннями",
|
||||||
|
"sub_mime_not_allowed": "Отримано подання від {0} але типу {1} який не є дозволеним",
|
||||||
|
"sub_document_too_large": "Отримано подання від {0} але файл завеликий({1} > {2})",
|
||||||
|
"sub_received": "Отримано подання від {0} з підписом {1}",
|
||||||
|
"sub_cooldown": "Отримано подання від {0} але користувач на тайм-ауті",
|
||||||
|
"sub_no_id": "from_user у функції get_submission не має атрибуту id (можливо, користувач запостив щось у канал)",
|
||||||
|
"sub_msg_unavail": "Не вдалося завантажити подання {0} від користувача {1}: повідомлення більше не існує",
|
||||||
|
"sub_media_unavail": "Не вдалося завантажити подання {0} від користувача {1}: медіафайл більше не існує",
|
||||||
|
"sub_media_downloading": "Завантажуємо медіа з подання {0} від користувача{1}...",
|
||||||
|
"sub_media_downloaded": "Завантажено медіа з подання{0} від користувача{1}",
|
||||||
|
"sub_accepted": "Прийнято подання {0} від користувача {1}",
|
||||||
|
"sub_declined": "Відхилено подання {0} від користувача {1}",
|
||||||
|
"sub_blocked": "Заблоковано користувача {0}",
|
||||||
|
"sub_unblocked": "Розблоковано користувача {0}",
|
||||||
"deps_missing": "Необхідні модулі не встановлені. Запустіть 'pip3 install -r requirements.txt' і перезапустіть програму.",
|
"deps_missing": "Необхідні модулі не встановлені. Запустіть 'pip3 install -r requirements.txt' і перезапустіть програму.",
|
||||||
"passed_norun": "Аргумент --norun надано, основний скрипт не запускається",
|
"passed_norun": "Аргумент --norun надано, основний скрипт не запускається",
|
||||||
"move_sent_doesnt_exist": "Файл '{0}' уже переміщено або він не існує",
|
"move_sent_doesnt_exist": "Файл '{0}' уже переміщено або він не існує",
|
||||||
|
@ -5,11 +5,11 @@ except ModuleNotFoundError:
|
|||||||
from json import JSONDecodeError as JSONDecodeError
|
from json import JSONDecodeError as JSONDecodeError
|
||||||
from json import loads, dumps
|
from json import loads, dumps
|
||||||
|
|
||||||
import os
|
from sys import exit
|
||||||
import sys
|
from os import sep, kill
|
||||||
import traceback
|
from os import name as osname
|
||||||
|
from traceback import print_exc
|
||||||
|
|
||||||
from signal import SIGKILL # type: ignore
|
|
||||||
from modules.logging import logWrite
|
from modules.logging import logWrite
|
||||||
|
|
||||||
def jsonLoad(filename):
|
def jsonLoad(filename):
|
||||||
@ -18,10 +18,10 @@ def jsonLoad(filename):
|
|||||||
try:
|
try:
|
||||||
output = loads(file.read())
|
output = loads(file.read())
|
||||||
except JSONDecodeError:
|
except JSONDecodeError:
|
||||||
logWrite(f"Could not load json file {filename}: file seems to be incorrect!\n{traceback.print_exc()}")
|
logWrite(f"Could not load json file {filename}: file seems to be incorrect!\n{print_exc()}")
|
||||||
raise
|
raise
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
logWrite(f"Could not load json file {filename}: file does not seem to exist!\n{traceback.print_exc()}")
|
logWrite(f"Could not load json file {filename}: file does not seem to exist!\n{print_exc()}")
|
||||||
raise
|
raise
|
||||||
file.close()
|
file.close()
|
||||||
return output
|
return output
|
||||||
@ -33,7 +33,7 @@ def jsonSave(contents, filename):
|
|||||||
file.write(dumps(contents, ensure_ascii=False, indent=4))
|
file.write(dumps(contents, ensure_ascii=False, indent=4))
|
||||||
file.close()
|
file.close()
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not save json file {filename}: {exp}\n{traceback.print_exc()}")
|
logWrite(f"Could not save json file {filename}: {exp}\n{print_exc()}")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
@ -83,13 +83,13 @@ def locale(key: str, *args: str, locale=configGet("locale")):
|
|||||||
locale = configGet("locale")
|
locale = configGet("locale")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
this_dict = jsonLoad(f'{configGet("locale", "locations")}{os.sep}{locale}.json')
|
this_dict = jsonLoad(f'{configGet("locale", "locations")}{sep}{locale}.json')
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
try:
|
try:
|
||||||
this_dict = jsonLoad(f'{configGet("locale", "locations")}{os.sep}{configGet("locale")}.json')
|
this_dict = jsonLoad(f'{configGet("locale", "locations")}{sep}{configGet("locale")}.json')
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
try:
|
try:
|
||||||
this_dict = jsonLoad(f'{configGet("locale_fallback", "locations")}{os.sep}{configGet("locale")}.json')
|
this_dict = jsonLoad(f'{configGet("locale_fallback", "locations")}{sep}{configGet("locale")}.json')
|
||||||
except:
|
except:
|
||||||
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
||||||
|
|
||||||
@ -103,14 +103,15 @@ def locale(key: str, *args: str, locale=configGet("locale")):
|
|||||||
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
return f'⚠️ Locale in config is invalid: could not get "{key}" in {str(args)} from locale "{locale}"'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import psutil
|
from psutil import Process
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
print(locale("deps_missing", "console", locale=configGet("locale")), flush=True)
|
print(locale("deps_missing", "console", locale=configGet("locale")), flush=True)
|
||||||
sys.exit()
|
exit()
|
||||||
|
|
||||||
def killProc(pid):
|
def killProc(pid):
|
||||||
if os.name == "posix":
|
if osname == "posix":
|
||||||
os.kill(pid, SIGKILL)
|
from signal import SIGKILL # type: ignore
|
||||||
|
kill(pid, SIGKILL)
|
||||||
else:
|
else:
|
||||||
p = psutil.Process(pid)
|
p = Process(pid)
|
||||||
p.kill()
|
p.kill()
|
Reference in New Issue
Block a user