Compare commits
7 Commits
ee738d00b5
...
v.1.2
Author | SHA1 | Date | |
---|---|---|---|
95be1e72d3 | |||
234b73add0 | |||
f4fb85f7a4 | |||
4fba305b05 | |||
68c7cc0ada | |||
79304816b0 | |||
2cfa5a8f8d |
22
README.md
22
README.md
@@ -33,9 +33,7 @@ You can see config file with all the comments below:
|
|||||||
"debug": false,
|
"debug": false,
|
||||||
"owner": 0,
|
"owner": 0,
|
||||||
"age_allowed": 0,
|
"age_allowed": 0,
|
||||||
"age_maximum": 70,
|
|
||||||
"api": "http://example.com",
|
"api": "http://example.com",
|
||||||
"issues": "https://github.com/example/test/issues/new",
|
|
||||||
"inline_preview_count": 7,
|
"inline_preview_count": 7,
|
||||||
"remove_application_time": -1,
|
"remove_application_time": -1,
|
||||||
"search_radius": 50,
|
"search_radius": 50,
|
||||||
@@ -83,8 +81,7 @@ You can see config file with all the comments below:
|
|||||||
"enabled": false
|
"enabled": false
|
||||||
},
|
},
|
||||||
"spoilers": {
|
"spoilers": {
|
||||||
"enabled": true,
|
"enabled": true
|
||||||
"allow_external": true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scheduler": {
|
"scheduler": {
|
||||||
@@ -107,11 +104,6 @@ You can see config file with all the comments below:
|
|||||||
"cache_admins": {
|
"cache_admins": {
|
||||||
"interval": 120,
|
"interval": 120,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
|
||||||
"channels_monitor": {
|
|
||||||
"interval": 5,
|
|
||||||
"enabled": true,
|
|
||||||
"channels": []
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"locations": {
|
"locations": {
|
||||||
@@ -152,6 +144,7 @@ You can see config file with all the comments below:
|
|||||||
"permissions": [
|
"permissions": [
|
||||||
"users",
|
"users",
|
||||||
"admins",
|
"admins",
|
||||||
|
"group_users",
|
||||||
"group_admins"
|
"group_admins"
|
||||||
],
|
],
|
||||||
"modules": [
|
"modules": [
|
||||||
@@ -160,7 +153,7 @@ You can see config file with all the comments below:
|
|||||||
},
|
},
|
||||||
"warn": {
|
"warn": {
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"group_users_admins"
|
"group_users"
|
||||||
],
|
],
|
||||||
"modules": [
|
"modules": [
|
||||||
"warnings"
|
"warnings"
|
||||||
@@ -220,15 +213,6 @@ You can see config file with all the comments below:
|
|||||||
"sponsorships"
|
"sponsorships"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"issue": {
|
|
||||||
"permissions": [
|
|
||||||
"users",
|
|
||||||
"admins"
|
|
||||||
],
|
|
||||||
"modules": [
|
|
||||||
"general"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"application": {
|
"application": {
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"admins",
|
"admins",
|
||||||
|
@@ -330,7 +330,7 @@ class HoloUser():
|
|||||||
await msg.reply_text(locale(f"question2_invalid", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage}", "force_reply", locale=self.locale))))
|
await msg.reply_text(locale(f"question2_invalid", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale(f"question{stage}", "force_reply", locale=self.locale))))
|
||||||
return
|
return
|
||||||
|
|
||||||
if (datetime.now() <= input_dt) or ((datetime.now() - input_dt).days) > ((datetime.now() - datetime.now().replace(year=datetime.now().year - configGet("age_maximum"))).days):
|
if datetime.now() <= input_dt:
|
||||||
logWrite(f"User {msg.from_user.id} failed stage {stage} due to joking")
|
logWrite(f"User {msg.from_user.id} failed stage {stage} due to joking")
|
||||||
await msg.reply_text(locale("question2_joke", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale("question2", "force_reply", locale=self.locale))))
|
await msg.reply_text(locale("question2_joke", "message", locale=self.locale), reply_markup=ForceReply(placeholder=str(locale("question2", "force_reply", locale=self.locale))))
|
||||||
return
|
return
|
||||||
|
@@ -3,9 +3,7 @@
|
|||||||
"debug": false,
|
"debug": false,
|
||||||
"owner": 0,
|
"owner": 0,
|
||||||
"age_allowed": 0,
|
"age_allowed": 0,
|
||||||
"age_maximum": 70,
|
|
||||||
"api": "http://example.com",
|
"api": "http://example.com",
|
||||||
"issues": "https://github.com/example/test/issues/new",
|
|
||||||
"inline_preview_count": 7,
|
"inline_preview_count": 7,
|
||||||
"remove_application_time": -1,
|
"remove_application_time": -1,
|
||||||
"search_radius": 50,
|
"search_radius": 50,
|
||||||
@@ -53,8 +51,7 @@
|
|||||||
"enabled": false
|
"enabled": false
|
||||||
},
|
},
|
||||||
"spoilers": {
|
"spoilers": {
|
||||||
"enabled": true,
|
"enabled": true
|
||||||
"allow_external": true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scheduler": {
|
"scheduler": {
|
||||||
@@ -77,11 +74,6 @@
|
|||||||
"cache_admins": {
|
"cache_admins": {
|
||||||
"interval": 120,
|
"interval": 120,
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
|
||||||
"channels_monitor": {
|
|
||||||
"interval": 5,
|
|
||||||
"enabled": true,
|
|
||||||
"channels": []
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"locations": {
|
"locations": {
|
||||||
@@ -190,15 +182,6 @@
|
|||||||
"sponsorships"
|
"sponsorships"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"issue": {
|
|
||||||
"permissions": [
|
|
||||||
"users",
|
|
||||||
"admins"
|
|
||||||
],
|
|
||||||
"modules": [
|
|
||||||
"general"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"application": {
|
"application": {
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"admins",
|
"admins",
|
||||||
|
@@ -15,7 +15,6 @@ from modules.commands.application import *
|
|||||||
from modules.commands.applications import *
|
from modules.commands.applications import *
|
||||||
from modules.commands.cancel import *
|
from modules.commands.cancel import *
|
||||||
from modules.commands.identify import *
|
from modules.commands.identify import *
|
||||||
from modules.commands.issue import *
|
|
||||||
from modules.commands.label import *
|
from modules.commands.label import *
|
||||||
from modules.commands.message import *
|
from modules.commands.message import *
|
||||||
from modules.commands.nearby import *
|
from modules.commands.nearby import *
|
||||||
@@ -32,7 +31,7 @@ from modules.commands.warnings import *
|
|||||||
from modules.callbacks.nothing import *
|
from modules.callbacks.nothing import *
|
||||||
from modules.callbacks.reapply import *
|
from modules.callbacks.reapply import *
|
||||||
from modules.callbacks.rules import *
|
from modules.callbacks.rules import *
|
||||||
from modules.callbacks.spoiler import *
|
from modules.callbacks.sid import *
|
||||||
from modules.callbacks.sponsorship import *
|
from modules.callbacks.sponsorship import *
|
||||||
from modules.callbacks.sub import *
|
from modules.callbacks.sub import *
|
||||||
from modules.callbacks.sus import *
|
from modules.callbacks.sus import *
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
"question4": "When did you first learn about Hololive?",
|
"question4": "When did you first learn about Hololive?",
|
||||||
"question5": "What made you interested in Hololive?",
|
"question5": "What made you interested in Hololive?",
|
||||||
"question6": "Which girl's content do you like the most?",
|
"question6": "Which girl's content do you like the most?",
|
||||||
"question7": "Name the content of at least five **JAPANESE** girls you like the most.",
|
"question7": "Name the content of at least five Japanese girls you like the most.",
|
||||||
"question8": "Do you watch streams of Hololive girls?",
|
"question8": "Do you watch streams of Hololive girls?",
|
||||||
"question9": "Whose songs from Hololive do you like the most?",
|
"question9": "Whose songs from Hololive do you like the most?",
|
||||||
"question10": "And finally, tell us a little about yourself. About hobbies, what you like to do. In one message, please.",
|
"question10": "And finally, tell us a little about yourself. About hobbies, what you like to do. In one message, please.",
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
"approved_joined": "Congratulations! Your application has been reviewed and confirmed as correct. Thank you for your time and have a nice day!",
|
"approved_joined": "Congratulations! Your application has been reviewed and confirmed as correct. Thank you for your time and have a nice day!",
|
||||||
"read_rules": "Please read these rules before clicking the button and joining the chat.",
|
"read_rules": "Please read these rules before clicking the button and joining the chat.",
|
||||||
"rejected.": "Oh dear! Your application has been reviewed but not confirmed as eligible to join the community. Better luck next time!\n\nYou can try to reapply with the /reapply command.",
|
"rejected.": "Oh dear! Your application has been reviewed but not confirmed as eligible to join the community. Better luck next time!\n\nYou can try to reapply with the /reapply command.",
|
||||||
|
"rejected_aggressive": "Oh dear! Your application has been reviewed, but not confirmed as eligible to join the community.",
|
||||||
"rejected_russian": "Russian warship, go fuck yourself!",
|
"rejected_russian": "Russian warship, go fuck yourself!",
|
||||||
"approved_by": "✅ **Application approved**\nAdmin **{0}** has reviewed and approved application `{1}`.",
|
"approved_by": "✅ **Application approved**\nAdmin **{0}** has reviewed and approved application `{1}`.",
|
||||||
"rejected_by": "❌ **Form rejected**\nAdmin **{0}** has reviewed and rejected form `{1}`.",
|
"rejected_by": "❌ **Form rejected**\nAdmin **{0}** has reviewed and rejected form `{1}`.",
|
||||||
@@ -121,6 +122,7 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"sub_yes": "✅ Accept",
|
"sub_yes": "✅ Accept",
|
||||||
"sub_no": "❌ Reject",
|
"sub_no": "❌ Reject",
|
||||||
|
"sub_aggressive": "🤡 Reject (Toxic)",
|
||||||
"sub_russian": "🇷🇺 Reject (Russian)",
|
"sub_russian": "🇷🇺 Reject (Russian)",
|
||||||
"accepted": "✅ Accepted",
|
"accepted": "✅ Accepted",
|
||||||
"declined": "❌ Rejected",
|
"declined": "❌ Rejected",
|
||||||
@@ -143,6 +145,7 @@
|
|||||||
"callback": {
|
"callback": {
|
||||||
"sub_accepted": "✅ Application {0} has been approved",
|
"sub_accepted": "✅ Application {0} has been approved",
|
||||||
"sub_rejected": "❌ Application {0} rejected",
|
"sub_rejected": "❌ Application {0} rejected",
|
||||||
|
"sub_aggressive": "🤡 Application {0} rejected",
|
||||||
"sub_russian": "🇷🇺 Application {0} rejected",
|
"sub_russian": "🇷🇺 Application {0} rejected",
|
||||||
"sus_allowed": "✅ Access {0} allowed",
|
"sus_allowed": "✅ Access {0} allowed",
|
||||||
"sus_rejected": "❌ Access {0} denied",
|
"sus_rejected": "❌ Access {0} denied",
|
||||||
|
@@ -4,12 +4,12 @@
|
|||||||
"goodbye": "Добре, дякуємо за чесність! Вибачте, але за таких умов ми не будемо тебе додавати до спільноти. Якщо передумаєш та захочеш приєднатись - просто натисни на кнопку.",
|
"goodbye": "Добре, дякуємо за чесність! Вибачте, але за таких умов ми не будемо тебе додавати до спільноти. Якщо передумаєш та захочеш приєднатись - просто натисни на кнопку.",
|
||||||
"privacy_notice": "Раді це чути!\n\nДля продовження треба буде заповнити невеличку анкетку. Будь ласка, віднесись до цього серйозно. Ми відповідально ставимось до персональних даних, тому ця анкета не буде передана третім особам, а буде використана лише для проходження до спільноти.",
|
"privacy_notice": "Раді це чути!\n\nДля продовження треба буде заповнити невеличку анкетку. Будь ласка, віднесись до цього серйозно. Ми відповідально ставимось до персональних даних, тому ця анкета не буде передана третім особам, а буде використана лише для проходження до спільноти.",
|
||||||
"question1": "Як до тебе можна звертатись?",
|
"question1": "Як до тебе можна звертатись?",
|
||||||
"question2": "Коли в тебе день народження?\n\nБудь ласка, у форматі ДД.ММ.РРРР",
|
"question2": "Коли в тебе день народження?",
|
||||||
"question3": "З якого ти міста або де проживаєш зараз?\n\n⚠️ Будь ласка, не вказуйте точних адрес! \"Київ\" або \"Київська Область\" є достатньою конкретизацією.\n\nПриклади:\n• Київ\n• Одеська область\n• Макіївка (Луганська область)",
|
"question3": "З якого ти міста або де проживаєш зараз?\n\n⚠️ Будь ласка, не вказуйте точних адрес! \"Київ\" або \"Київська Область\" є достатньою конкретизацією.\n\nПриклади:\n• Київ\n• Одеська область\n• Макіївка (Луганська область)",
|
||||||
"question4": "Коли вперше довелось дізнатись про Хололайв?",
|
"question4": "Коли вперше довелось дізнатись про Хололайв?",
|
||||||
"question5": "Чим тебе зацікавив Хололайв?",
|
"question5": "Чим тебе зацікавив Хололайв?",
|
||||||
"question6": "Контент якої дівчини тобі подобається найбільше?",
|
"question6": "Контент якої дівчини тобі подобається найбільше?",
|
||||||
"question7": "Назви контент хоча б п'яти **ЯПОНСЬКИХ** холодівчат, які тобі подобаються найбільше.",
|
"question7": "Назви контент хоча б п'яти японських холодівчат, які тобі подобаються найбільше.",
|
||||||
"question8": "Чи дивишся ти стріми дівчат Хололайву?",
|
"question8": "Чи дивишся ти стріми дівчат Хололайву?",
|
||||||
"question9": "Чиї пісні з Хололайву тобі подобаються найбільше?",
|
"question9": "Чиї пісні з Хололайву тобі подобаються найбільше?",
|
||||||
"question10": "Ну і нарешті, розкажи трохи про себе. Про хобі, чим тобі подобається займатись. Одним повідомленням, будь ласка.",
|
"question10": "Ну і нарешті, розкажи трохи про себе. Про хобі, чим тобі подобається займатись. Одним повідомленням, будь ласка.",
|
||||||
@@ -48,6 +48,7 @@
|
|||||||
"approved_joined": "Вітаємо! Твою анкету переглянули та підтвердили її правильність. Дякуємо за витрачений на заповнення час та гарного дня!",
|
"approved_joined": "Вітаємо! Твою анкету переглянули та підтвердили її правильність. Дякуємо за витрачений на заповнення час та гарного дня!",
|
||||||
"read_rules": "Будь ласка, прочитай ці правила перш ніж натискати на кнопку та приєднуватись до чату.",
|
"read_rules": "Будь ласка, прочитай ці правила перш ніж натискати на кнопку та приєднуватись до чату.",
|
||||||
"rejected": "Ой лишенько! Твою анкету переглянули, однак не підтвердили право на вступ до спільноти. Better luck next time!\n\nТи можеш спробувати повторно заповнити анкету командою /reapply",
|
"rejected": "Ой лишенько! Твою анкету переглянули, однак не підтвердили право на вступ до спільноти. Better luck next time!\n\nТи можеш спробувати повторно заповнити анкету командою /reapply",
|
||||||
|
"rejected_aggressive": "Ой лишенько! Твою анкету переглянули, однак не підтвердили право на вступ до спільноти.",
|
||||||
"rejected_russian": "русский военньій корабль, иди нахуй!",
|
"rejected_russian": "русский военньій корабль, иди нахуй!",
|
||||||
"approved_by": "✅ **Анкету схвалено**\nАдмін **{0}** переглянув та схвалив анкету `{1}`.",
|
"approved_by": "✅ **Анкету схвалено**\nАдмін **{0}** переглянув та схвалив анкету `{1}`.",
|
||||||
"rejected_by": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`.",
|
"rejected_by": "❌ **Анкету відхилено**\nАдмін **{0}** переглянув та відхилив анкету `{1}`.",
|
||||||
@@ -91,7 +92,6 @@
|
|||||||
"no_user_application": "Не знайдено користувачів за запитом **{0}**",
|
"no_user_application": "Не знайдено користувачів за запитом **{0}**",
|
||||||
"user_invalid": "Надісланий користувач не має завершеної анкети.",
|
"user_invalid": "Надісланий користувач не має завершеної анкети.",
|
||||||
"joined_false_link": "Користувач **{0}** (`{1}`) приєднався до групи не за своїм посиланням",
|
"joined_false_link": "Користувач **{0}** (`{1}`) приєднався до групи не за своїм посиланням",
|
||||||
"joined_application": "{0} (@{1})\n\n**Дані анкети:**\n{2}",
|
|
||||||
"sponsorships_expires": "⚠️ **Нагадування**\nНадана платна підписка припинить діяти **за {0} д**. Будь ласка, оновіть дані про неї командою /sponsorship інакше роль буде втрачено!",
|
"sponsorships_expires": "⚠️ **Нагадування**\nНадана платна підписка припинить діяти **за {0} д**. Будь ласка, оновіть дані про неї командою /sponsorship інакше роль буде втрачено!",
|
||||||
"sponsorships_expired": "⚠️ **Нагадування**\nТермін дії вказаної підписки сплив. Для повторного отримання ролі користуйся командою /sponsorship.",
|
"sponsorships_expired": "⚠️ **Нагадування**\nТермін дії вказаної підписки сплив. Для повторного отримання ролі користуйся командою /sponsorship.",
|
||||||
"label_too_long": "Довжина назви ролі не повинна перевищувати 16 символів",
|
"label_too_long": "Довжина назви ролі не повинна перевищувати 16 символів",
|
||||||
@@ -102,7 +102,6 @@
|
|||||||
"nearby_result": "Результати пошуку:\n\n{0}",
|
"nearby_result": "Результати пошуку:\n\n{0}",
|
||||||
"nearby_empty": "Здається, нікого поблизу немає.",
|
"nearby_empty": "Здається, нікого поблизу немає.",
|
||||||
"cancel": "Всі поточні операції скасовано.",
|
"cancel": "Всі поточні операції скасовано.",
|
||||||
"cancel_reapply": "Всі поточні операції скасовано.\nЩоб знову заповнити анкету користуйся /reapply",
|
|
||||||
"identify_invalid_syntax": "Неправильний синтаксис!\nТреба: `/identify ID/NAME/USERNAME`",
|
"identify_invalid_syntax": "Неправильний синтаксис!\nТреба: `/identify ID/NAME/USERNAME`",
|
||||||
"identify_not_found": "Не знайдено користувачів за запитом **{0}**",
|
"identify_not_found": "Не знайдено користувачів за запитом **{0}**",
|
||||||
"identify_success": "Користувач `{0}`\n\nІм'я: {1}\nЮзернейм: {2}\nЄ в чаті: {3}\nЄ адміном: {4}\nРоль: {5}\nНаявна анкета: {6}\nНаявне спонсорство: {7}",
|
"identify_success": "Користувач `{0}`\n\nІм'я: {1}\nЮзернейм: {2}\nЄ в чаті: {3}\nЄ адміном: {4}\nРоль: {5}\nНаявна анкета: {6}\nНаявне спонсорство: {7}",
|
||||||
@@ -110,9 +109,7 @@
|
|||||||
"spoiler_unfinished": "У вас ще є незавершений спойлер. Надішліть /cancel щоб зупинити його створення",
|
"spoiler_unfinished": "У вас ще є незавершений спойлер. Надішліть /cancel щоб зупинити його створення",
|
||||||
"spoiler_cancel": "Створення спойлера було припинено",
|
"spoiler_cancel": "Створення спойлера було припинено",
|
||||||
"spoiler_empty": "Спойлер категорії \"{0}\" без опису",
|
"spoiler_empty": "Спойлер категорії \"{0}\" без опису",
|
||||||
"spoiler_empty_named": "Спойлер категорії \"{0}\" без опису від **{1}**",
|
|
||||||
"spoiler_described": "Спойлер категорії \"{0}\": {1}",
|
"spoiler_described": "Спойлер категорії \"{0}\": {1}",
|
||||||
"spoiler_described_named": "Спойлер категорії \"{0}\" від **{1}**: {2}",
|
|
||||||
"spoiler_description_enter": "Добре, введіть бажаний опис спойлера",
|
"spoiler_description_enter": "Добре, введіть бажаний опис спойлера",
|
||||||
"spoiler_description_too_long": "Текст занадто довгий. Будь ласка, умісти опис у 1024 символи.",
|
"spoiler_description_too_long": "Текст занадто довгий. Будь ласка, умісти опис у 1024 символи.",
|
||||||
"spoiler_using_description": "Встановлено опис спойлера: {0}\n\nЗалишилось додати вміст самого спойлера. Бот приймає текстове повідомлення, фото, відео, файл а також гіф зображення (1 шт.)",
|
"spoiler_using_description": "Встановлено опис спойлера: {0}\n\nЗалишилось додати вміст самого спойлера. Бот приймає текстове повідомлення, фото, відео, файл а також гіф зображення (1 шт.)",
|
||||||
@@ -121,9 +118,6 @@
|
|||||||
"spoiler_incorrect_content": "Бот не підтримує такий контент. Будь ласка, надішли текст, фото, відео, файл або анімацію (гіф).",
|
"spoiler_incorrect_content": "Бот не підтримує такий контент. Будь ласка, надішли текст, фото, відео, файл або анімацію (гіф).",
|
||||||
"spoiler_incorrect_category": "Вказана категорія не є дійсною. Будь ласка, користуйся клавіатурою бота (кнопка біля 📎) для вибору категорії.",
|
"spoiler_incorrect_category": "Вказана категорія не є дійсною. Будь ласка, користуйся клавіатурою бота (кнопка біля 📎) для вибору категорії.",
|
||||||
"spoiler_in_progress": "❌ **Дія неможлива**\nПерш ніж починати нову дію, треба завершити створення спойлера або перервати його командою /cancel.",
|
"spoiler_in_progress": "❌ **Дія неможлива**\nПерш ніж починати нову дію, треба завершити створення спойлера або перервати його командою /cancel.",
|
||||||
"youtube_video": "На каналі [{0}]({1}) нове відео!\n\n**[{2}]({3})**",
|
|
||||||
"not_member": "❌ **Дія неможлива**\nУ тебе немає заповненої та схваленої анкети. Заповни таку за допомогою /reapply та спробуй ще раз після її підтвердження.",
|
|
||||||
"issue": "**Допоможіть боту**\nЗнайшли баг або помилку? Маєте файну ідею для нової функції? Повідомте нас, створивши нову задачу на гіті.\n\nЗа можливості, опишіть свій запит максимально детально. Якщо є змога, також додайте скріншоти або додаткову відому інформацію.",
|
|
||||||
"yes": "Так",
|
"yes": "Так",
|
||||||
"no": "Ні",
|
"no": "Ні",
|
||||||
"voice_message": [
|
"voice_message": [
|
||||||
@@ -209,6 +203,7 @@
|
|||||||
"button": {
|
"button": {
|
||||||
"sub_yes": "✅ Прийняти",
|
"sub_yes": "✅ Прийняти",
|
||||||
"sub_no": "❌ Відхилити",
|
"sub_no": "❌ Відхилити",
|
||||||
|
"sub_aggressive": "🤡 Відхилити (Токс)",
|
||||||
"sub_russian": "🇷🇺 Відхилити (Русак)",
|
"sub_russian": "🇷🇺 Відхилити (Русак)",
|
||||||
"sponsor_yes": "✅ Прийняти",
|
"sponsor_yes": "✅ Прийняти",
|
||||||
"sponsor_no": "❌ Відхилити",
|
"sponsor_no": "❌ Відхилити",
|
||||||
@@ -231,15 +226,13 @@
|
|||||||
"done": "✅ Готово",
|
"done": "✅ Готово",
|
||||||
"sponsor_apply": "Заповнити форму",
|
"sponsor_apply": "Заповнити форму",
|
||||||
"sponsor_started": "Форму розпочато",
|
"sponsor_started": "Форму розпочато",
|
||||||
"spoiler_view": "Переглянути",
|
"spoiler_send": "Надіслати",
|
||||||
"spoiler_preview": "Попередній перегляд",
|
"spoiler_view": "Переглянути"
|
||||||
"spoiler_send_chat": "Надіслати в холо-чат",
|
|
||||||
"spoiler_send_other": "Надіслати в інший чат",
|
|
||||||
"issue": "🪄 Створити задачу"
|
|
||||||
},
|
},
|
||||||
"callback": {
|
"callback": {
|
||||||
"sub_accepted": "✅ Анкету {0} схвалено",
|
"sub_accepted": "✅ Анкету {0} схвалено",
|
||||||
"sub_rejected": "❌ Анкету {0} відхилено",
|
"sub_rejected": "❌ Анкету {0} відхилено",
|
||||||
|
"sub_aggressive": "🤡 Анкету {0} відхилено",
|
||||||
"sub_russian": "🇷🇺 Анкету {0} відхилено",
|
"sub_russian": "🇷🇺 Анкету {0} відхилено",
|
||||||
"sus_allowed": "✅ Доступ {0} дозволено",
|
"sus_allowed": "✅ Доступ {0} дозволено",
|
||||||
"sus_rejected": "❌ Доступ {0} заборонено",
|
"sus_rejected": "❌ Доступ {0} заборонено",
|
||||||
@@ -250,8 +243,7 @@
|
|||||||
"reapply_stopped": "ℹ️ Перервано заповнення анкети",
|
"reapply_stopped": "ℹ️ Перервано заповнення анкети",
|
||||||
"sponsor_started": "ℹ️ Заповнення форми розпочато",
|
"sponsor_started": "ℹ️ Заповнення форми розпочато",
|
||||||
"sponsor_accepted": "✅ Форму {0} схвалено",
|
"sponsor_accepted": "✅ Форму {0} схвалено",
|
||||||
"sponsor_rejected": "❌ Форму {0} відхилено",
|
"sponsor_rejected": "❌ Форму {0} відхилено"
|
||||||
"spoiler_sent": "✅ Повідомлення надіслано в холо-чат"
|
|
||||||
},
|
},
|
||||||
"inline": {
|
"inline": {
|
||||||
"forbidden": {
|
"forbidden": {
|
||||||
@@ -274,7 +266,7 @@
|
|||||||
"description": "Надіслати цей спойлер до чату"
|
"description": "Надіслати цей спойлер до чату"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rules_msg": "📢Правила можуть доповнюватись та змінюватись, залежно від потреби. У такому разі, порушення, які були вчинені до введення (змінення) правила, порушеннями вважатися не будуть. Про всі зміни в правилах, ви будете проінформовані за допомогою закріплених повідомлень. Але вони не будуть закріплені на постійній основі, тому, час від часу, перевіряйте актуальність правил у боті.\n\n🔔Якщо ви бачите, як хтось із учасників порушив правила, тегніть одного із адмінів, у відповідь на повідомлення, яке, на вашу думку, є порушенням. У дописі до тегу, вкажіть, по якому пункту ви побачили порушення. Або перешліть повідомлення до будь кого із адміністраторів у особисті повідомлення, та коротко опишіть ситуацію.\nСписок адміністраторів: @Chirkopol @Za_NerZula @Denialvapr\nЗ питань функціонування бота звертайтесь до @Profitroll2281337\n\n❗️Будь-який заборонений контент, може бути відправлений за допомогою команди /spoiler у бота - з повним описом контенту, що міститься під спойлером. За неправильний або некоректний опис, може бути видане попередження.\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Заборонено поширення шок-контенту з великою наявністю крові та/або фізичних пошкоджень.",
|
||||||
@@ -292,7 +284,6 @@
|
|||||||
"applications": "Отримати всі анкети як JSON",
|
"applications": "Отримати всі анкети як JSON",
|
||||||
"cancel": "Відмінити актуальну дію",
|
"cancel": "Відмінити актуальну дію",
|
||||||
"identify": "Дізнатись дані про користувача за айді",
|
"identify": "Дізнатись дані про користувача за айді",
|
||||||
"issue": "Задачі для покращення бота",
|
|
||||||
"label": "Встановити нікнейм користувачу",
|
"label": "Встановити нікнейм користувачу",
|
||||||
"message": "Надіслати користувачу повідомлення",
|
"message": "Надіслати користувачу повідомлення",
|
||||||
"nearby": "Показати користувачів поблизу",
|
"nearby": "Показати користувачів поблизу",
|
||||||
|
@@ -83,30 +83,13 @@ async def callback_query_reapply_reject(app: Client, clb: CallbackQuery):
|
|||||||
# Use old application when user reapplies after leaving the chat
|
# Use old application when user reapplies after leaving the chat
|
||||||
@app.on_callback_query(filters.regex("reapply_old_[\s\S]*"))
|
@app.on_callback_query(filters.regex("reapply_old_[\s\S]*"))
|
||||||
async def callback_query_reapply_old(app: Client, clb: CallbackQuery):
|
async def callback_query_reapply_old(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
fullclb = clb.data.split("_")
|
fullclb = clb.data.split("_")
|
||||||
holo_user = HoloUser(clb.from_user)
|
|
||||||
|
|
||||||
if holo_user.sponsorship_state()[0] == "fill":
|
if HoloUser(clb.from_user).sponsorship_state()[0] == "fill":
|
||||||
await clb.message.reply_text(locale("finish_sponsorship", "message"), quote=False)
|
await clb.message.reply_text(locale("finish_sponsorship", "message"), quote=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
message = await app.get_messages(clb.from_user.id, int(fullclb[2]))
|
||||||
|
|
||||||
if col_tmp.find_one({"user": holo_user.id, "type": "application"}) is None and col_applications.find_one({"user": holo_user.id}) is not None:
|
|
||||||
col_tmp.insert_one(
|
|
||||||
{
|
|
||||||
"user": holo_user.id,
|
|
||||||
"type": "application",
|
|
||||||
"complete": True,
|
|
||||||
"sent": False,
|
|
||||||
"state": "fill",
|
|
||||||
"reapply": True,
|
|
||||||
"stage": 10,
|
|
||||||
"application": col_applications.find_one({"user": holo_user.id})["application"]
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
await confirm_yes(app, message, kind="application")
|
await confirm_yes(app, message, kind="application")
|
||||||
await clb.message.edit(clb.message.text, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("done", "button", locale=clb.from_user), "nothing")]]))
|
await clb.message.edit(clb.message.text, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("done", "button", locale=clb.from_user), "nothing")]]))
|
||||||
|
|
||||||
|
10
modules/callbacks/sid.py
Normal file
10
modules/callbacks/sid.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from app import app
|
||||||
|
from pyrogram.types import CallbackQuery
|
||||||
|
from pyrogram.client import Client
|
||||||
|
from pyrogram import filters
|
||||||
|
|
||||||
|
# Callback rule ================================================================================================================
|
||||||
|
@app.on_callback_query(filters.regex("sid_[\s\S]*"))
|
||||||
|
async def callback_query_rule(app: Client, clb: CallbackQuery):
|
||||||
|
await clb.answer(url=f'https://t.me/{(await app.get_me()).username}?start={clb.data.split("_")[1]}')
|
||||||
|
# ==============================================================================================================================
|
@@ -1,31 +0,0 @@
|
|||||||
from app import app
|
|
||||||
from pyrogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
|
|
||||||
from pyrogram.client import Client
|
|
||||||
from pyrogram import filters
|
|
||||||
from modules.database import col_spoilers
|
|
||||||
from bson.objectid import ObjectId
|
|
||||||
|
|
||||||
from modules.utils import configGet, locale
|
|
||||||
|
|
||||||
# Callback sid =================================================================================================================
|
|
||||||
@app.on_callback_query(filters.regex("sid_[\s\S]*"))
|
|
||||||
async def callback_query_sid(app: Client, clb: CallbackQuery):
|
|
||||||
await clb.answer(url=f'https://t.me/{(await app.get_me()).username}?start={clb.data.split("_")[1]}')
|
|
||||||
# ==============================================================================================================================
|
|
||||||
|
|
||||||
# Callback shc =================================================================================================================
|
|
||||||
@app.on_callback_query(filters.regex("shc_[\s\S]*"))
|
|
||||||
async def callback_query_shc(app: Client, clb: CallbackQuery):
|
|
||||||
|
|
||||||
spoil = col_spoilers.find_one( {"_id": ObjectId(clb.data.split("_")[1])} )
|
|
||||||
|
|
||||||
if spoil["description"] == "":
|
|
||||||
desc = locale("spoiler_empty_named", "message", locale=clb.from_user).format(locale(spoil["category"], "message", "spoiler_categories"), clb.from_user.first_name)
|
|
||||||
else:
|
|
||||||
desc = locale("spoiler_described_named", "message", locale=clb.from_user).format(locale(spoil["category"], "message", "spoiler_categories"), clb.from_user.first_name, spoil["description"])
|
|
||||||
|
|
||||||
await app.send_message(configGet("users", "groups"), desc, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_view", "button", locale=clb.from_user), callback_data=f'sid_{clb.data.split("_")[1]}')]]))
|
|
||||||
await app.send_message(configGet("admin", "groups"), desc, reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_view", "button", locale=clb.from_user), callback_data=f'sid_{clb.data.split("_")[1]}')]]))
|
|
||||||
|
|
||||||
await clb.answer(locale("spoiler_sent", "callback", locale=clb.from_user), show_alert=True)
|
|
||||||
# ==============================================================================================================================
|
|
@@ -68,6 +68,23 @@ async def callback_query_reject(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))
|
||||||
await clb.answer(text=locale("sub_rejected", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
await clb.answer(text=locale("sub_rejected", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
||||||
|
|
||||||
|
@app.on_callback_query(filters.regex("sub_aggressive_[\s\S]*"))
|
||||||
|
async def callback_query_reject_aggressive(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
|
fullclb = clb.data.split("_")
|
||||||
|
holo_user = HoloUser(int(fullclb[2]))
|
||||||
|
|
||||||
|
await app.send_message(configGet("admin", "groups"), locale("rejected_by_agr", "message").format(clb.from_user.first_name, holo_user.id), disable_notification=True)
|
||||||
|
await app.send_message(holo_user.id, locale("rejected_aggressive", "message", locale=holo_user))
|
||||||
|
logWrite(f"User {holo_user.id} got rejected by {clb.from_user.id} due to being aggressive")
|
||||||
|
|
||||||
|
col_tmp.update_one({"user": {"$eq": holo_user.id}, "type": {"$eq": "application"}}, {"$set": {"state": "rejected", "sent": False}})
|
||||||
|
|
||||||
|
edited_markup = [[InlineKeyboardButton(text=str(locale("declined", "button")), callback_data="nothing")]]
|
||||||
|
|
||||||
|
await clb.message.edit(text=clb.message.text, reply_markup=InlineKeyboardMarkup(edited_markup))
|
||||||
|
await clb.answer(text=locale("sub_aggressive", "callback", locale=clb.from_user).format(holo_user.id), show_alert=True)
|
||||||
|
|
||||||
@app.on_callback_query(filters.regex("sub_russian_[\s\S]*"))
|
@app.on_callback_query(filters.regex("sub_russian_[\s\S]*"))
|
||||||
async def callback_query_reject_russian(app: Client, clb: CallbackQuery):
|
async def callback_query_reject_russian(app: Client, clb: CallbackQuery):
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ from pyrogram import filters
|
|||||||
from pyrogram.types import Message, ReplyKeyboardRemove
|
from pyrogram.types import Message, ReplyKeyboardRemove
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from modules.utils import should_quote, logWrite, locale
|
from modules.utils import should_quote, logWrite, locale
|
||||||
from modules.database import col_tmp, col_spoilers, col_applications
|
from modules.database import col_tmp, col_spoilers
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Cancel command ===============================================================================================================
|
# Cancel command ===============================================================================================================
|
||||||
@@ -11,9 +11,6 @@ from modules import custom_filters
|
|||||||
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, "sent": False} )
|
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} )
|
||||||
if col_applications.find_one( {"user": msg.from_user.id} ) is None:
|
await msg.reply_text(locale("cancel", "message", locale=msg.from_user), quote=should_quote(msg), reply_markup=ReplyKeyboardRemove())
|
||||||
await msg.reply_text(locale("cancel_reapply", "message", locale=msg.from_user), quote=should_quote(msg), reply_markup=ReplyKeyboardRemove())
|
|
||||||
else:
|
|
||||||
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}")
|
||||||
# ==============================================================================================================================
|
# ==============================================================================================================================
|
@@ -51,7 +51,7 @@ async def cmd_identify(app: Client, msg: Message):
|
|||||||
if user.photo is not None:
|
if user.photo is not None:
|
||||||
await app.send_chat_action(msg.chat.id, action=ChatAction.UPLOAD_PHOTO)
|
await app.send_chat_action(msg.chat.id, action=ChatAction.UPLOAD_PHOTO)
|
||||||
await msg.reply_photo(
|
await msg.reply_photo(
|
||||||
create_tmp((await download_tmp(app, user.photo.big_file_id))[1], kind="image"),
|
create_tmp(await download_tmp(app, user.photo.big_file_id), kind="image"),
|
||||||
quote=should_quote(msg),
|
quote=should_quote(msg),
|
||||||
caption=output
|
caption=output
|
||||||
)
|
)
|
||||||
|
@@ -1,21 +0,0 @@
|
|||||||
from typing import Union
|
|
||||||
from app import app
|
|
||||||
from pyrogram import filters
|
|
||||||
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, User, Message
|
|
||||||
from pyrogram.client import Client
|
|
||||||
from modules.utils import configGet, locale
|
|
||||||
from modules import custom_filters
|
|
||||||
from classes.holo_user import HoloUser
|
|
||||||
|
|
||||||
|
|
||||||
# Issue command ================================================================================================================
|
|
||||||
@app.on_message(custom_filters.enabled_general & ~filters.scheduled & filters.private & filters.command(["issue"], prefixes=["/"]))
|
|
||||||
async def cmd_issue(app: Client, msg: Message):
|
|
||||||
await msg.reply_text(locale("issue", "message", locale=msg.from_user), disable_web_page_preview=True, reply_markup=InlineKeyboardMarkup(
|
|
||||||
[
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(locale("issue", "button", locale=msg.from_user), url=configGet("issues"))
|
|
||||||
]
|
|
||||||
]
|
|
||||||
))
|
|
||||||
# ==============================================================================================================================
|
|
@@ -6,7 +6,7 @@ from classes.holo_user import HoloUser
|
|||||||
from modules.logging import logWrite
|
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, col_applications
|
from modules.database import col_tmp
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Reapply command ==============================================================================================================
|
# Reapply command ==============================================================================================================
|
||||||
@@ -27,20 +27,16 @@ async def cmd_reapply(app: Client, msg: Message):
|
|||||||
if member.user.id == msg.from_user.id:
|
if member.user.id == msg.from_user.id:
|
||||||
left_chat = False
|
left_chat = False
|
||||||
|
|
||||||
if left_chat is True:
|
if not left_chat:
|
||||||
|
if holo_user.sponsorship_state()[0] == "fill":
|
||||||
|
await msg.reply_text(locale("finish_sponsorship", "message"), quote=should_quote(msg))
|
||||||
|
return
|
||||||
|
holo_user.application_restart(reapply=True)
|
||||||
|
await welcome_pass(app, msg, once_again=True)
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
if (holo_user.application_state()[1] is True and holo_user.application_state()[0] not in ["fill", "rejected"]):
|
if holo_user.application_state()[1] is True and holo_user.application_state()[0] != "fill":
|
||||||
|
|
||||||
await msg.reply_text(locale("reapply_left_chat", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup([
|
|
||||||
[
|
|
||||||
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}")
|
|
||||||
]
|
|
||||||
]))
|
|
||||||
|
|
||||||
elif col_tmp.find_one({"user": holo_user.id, "type": "application"}) is None and col_applications.find_one({"user": holo_user.id}) is not None:
|
|
||||||
|
|
||||||
await msg.reply_text(locale("reapply_left_chat", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup([
|
await msg.reply_text(locale("reapply_left_chat", "message", locale=holo_user), reply_markup=InlineKeyboardMarkup([
|
||||||
[
|
[
|
||||||
@@ -56,15 +52,6 @@ async def cmd_reapply(app: Client, msg: Message):
|
|||||||
holo_user.application_restart(reapply=True)
|
holo_user.application_restart(reapply=True)
|
||||||
await welcome_pass(app, msg, once_again=True)
|
await welcome_pass(app, msg, once_again=True)
|
||||||
|
|
||||||
else:
|
|
||||||
|
|
||||||
if holo_user.sponsorship_state()[0] == "fill":
|
|
||||||
await msg.reply_text(locale("finish_sponsorship", "message"), quote=should_quote(msg))
|
|
||||||
return
|
|
||||||
|
|
||||||
holo_user.application_restart(reapply=True)
|
|
||||||
await welcome_pass(app, msg, once_again=True)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
await msg.reply_text(locale("reapply_in_progress", "message", locale=holo_user).format(locale("confirm", "keyboard", locale=holo_user)[1][0]), reply_markup=InlineKeyboardMarkup([
|
await msg.reply_text(locale("reapply_in_progress", "message", locale=holo_user).format(locale("confirm", "keyboard", locale=holo_user)[1][0]), reply_markup=InlineKeyboardMarkup([
|
||||||
|
@@ -6,11 +6,11 @@ from classes.errors.holo_user import UserNotFoundError, UserInvalidError
|
|||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from modules.logging import logWrite
|
from modules.logging import logWrite
|
||||||
from modules.utils import locale
|
from modules.utils import locale
|
||||||
from modules.database import col_spoilers, col_applications
|
from modules.database import col_spoilers
|
||||||
from modules import custom_filters
|
from modules import custom_filters
|
||||||
|
|
||||||
# Spoiler command ==============================================================================================================
|
# Spoiler command ==============================================================================================================
|
||||||
@app.on_message(custom_filters.enabled_spoilers & ~filters.scheduled & filters.private & filters.command(["spoiler"], prefixes=["/"]))
|
@app.on_message(custom_filters.member & ~filters.scheduled & filters.private & filters.command(["spoiler"], prefixes=["/"]))
|
||||||
async def cmd_spoiler(app: Client, msg: Message):
|
async def cmd_spoiler(app: Client, msg: Message):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -18,18 +18,13 @@ async def cmd_spoiler(app: Client, msg: Message):
|
|||||||
except (UserInvalidError, UserNotFoundError):
|
except (UserInvalidError, UserNotFoundError):
|
||||||
return
|
return
|
||||||
|
|
||||||
if col_applications.find_one( {"user": holo_user.id} ) is None:
|
|
||||||
|
|
||||||
await msg.reply_text(locale("not_member", "message", locale=msg.from_user))
|
|
||||||
return
|
|
||||||
|
|
||||||
if holo_user.application_state()[0] != "fill" and holo_user.sponsorship_state()[0] != "fill":
|
if holo_user.application_state()[0] != "fill" and holo_user.sponsorship_state()[0] != "fill":
|
||||||
|
|
||||||
if col_spoilers.find_one( {"user": holo_user.id, "completed": False} ) is None:
|
if col_spoilers.find_one( {"user": msg.from_user.id, "completed": False} ) is None:
|
||||||
|
|
||||||
col_spoilers.insert_one(
|
col_spoilers.insert_one(
|
||||||
{
|
{
|
||||||
"user": holo_user.id,
|
"user": msg.from_user.id,
|
||||||
"completed": False,
|
"completed": False,
|
||||||
"category": None,
|
"category": None,
|
||||||
"description": None,
|
"description": None,
|
||||||
|
@@ -39,9 +39,6 @@ async def enabled_invites_check_func(_, __, msg: Message):
|
|||||||
async def enabled_dinovoice_func(_, __, msg: Message):
|
async def enabled_dinovoice_func(_, __, msg: Message):
|
||||||
return configGet("enabled", "features", "dinovoice")
|
return configGet("enabled", "features", "dinovoice")
|
||||||
|
|
||||||
async def enabled_spoilers_func(_, __, msg: Message):
|
|
||||||
return configGet("enabled", "features", "spoilers")
|
|
||||||
|
|
||||||
async def filling_sponsorship_func(_, __, msg: Message):
|
async def filling_sponsorship_func(_, __, msg: Message):
|
||||||
return True if col_tmp.find_one({"user": msg.from_user.id, "type": "sponsorship"}) is not None else False
|
return True if col_tmp.find_one({"user": msg.from_user.id, "type": "sponsorship"}) is not None else False
|
||||||
|
|
||||||
@@ -55,6 +52,5 @@ enabled_sponsorships = filters.create(enabled_sponsorships_func)
|
|||||||
enabled_warnings = filters.create(enabled_warnings_func)
|
enabled_warnings = filters.create(enabled_warnings_func)
|
||||||
enabled_invites_check = filters.create(enabled_invites_check_func)
|
enabled_invites_check = filters.create(enabled_invites_check_func)
|
||||||
enabled_dinovoice = filters.create(enabled_dinovoice_func)
|
enabled_dinovoice = filters.create(enabled_dinovoice_func)
|
||||||
enabled_spoilers = filters.create(enabled_spoilers_func)
|
|
||||||
|
|
||||||
filling_sponsorship = filters.create(filling_sponsorship_func)
|
filling_sponsorship = filters.create(filling_sponsorship_func)
|
@@ -28,14 +28,13 @@ db = db_client.get_database(name=db_config["name"])
|
|||||||
|
|
||||||
collections = db.list_collection_names()
|
collections = db.list_collection_names()
|
||||||
|
|
||||||
for collection in ["tmp", "users", "context", "youtube", "spoilers", "messages", "warnings", "applications", "sponsorships"]:
|
for collection in ["tmp", "users", "context", "spoilers", "messages", "warnings", "applications", "sponsorships"]:
|
||||||
if not collection in collections:
|
if not collection in collections:
|
||||||
db.create_collection(collection)
|
db.create_collection(collection)
|
||||||
|
|
||||||
col_tmp = db.get_collection("tmp")
|
col_tmp = db.get_collection("tmp")
|
||||||
col_users = db.get_collection("users")
|
col_users = db.get_collection("users")
|
||||||
col_context = db.get_collection("context")
|
col_context = db.get_collection("context")
|
||||||
col_youtube = db.get_collection("youtube")
|
|
||||||
col_spoilers = db.get_collection("spoilers")
|
col_spoilers = db.get_collection("spoilers")
|
||||||
col_messages = db.get_collection("messages")
|
col_messages = db.get_collection("messages")
|
||||||
col_warnings = db.get_collection("warnings")
|
col_warnings = db.get_collection("warnings")
|
||||||
|
@@ -83,6 +83,9 @@ async def confirm_yes(app: Client, msg: Message, kind: Literal["application", "s
|
|||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sub_no", "button")), callback_data=f"sub_no_{holo_user.id}")
|
InlineKeyboardButton(text=str(locale("sub_no", "button")), callback_data=f"sub_no_{holo_user.id}")
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(text=str(locale("sub_aggressive", "button")), callback_data=f"sub_aggressive_{holo_user.id}")
|
||||||
|
],
|
||||||
[
|
[
|
||||||
InlineKeyboardButton(text=str(locale("sub_russian", "button")), callback_data=f"sub_russian_{holo_user.id}")
|
InlineKeyboardButton(text=str(locale("sub_russian", "button")), callback_data=f"sub_russian_{holo_user.id}")
|
||||||
]
|
]
|
||||||
|
@@ -22,7 +22,7 @@ async def message_context(msg: Message) -> tuple:
|
|||||||
return 0, 0
|
return 0, 0
|
||||||
|
|
||||||
# Any other input ==============================================================================================================
|
# Any other input ==============================================================================================================
|
||||||
@app.on_message(~ filters.scheduled & (filters.private | filters.chat(configGet("admin", "groups"))))
|
@app.on_message(~ filters.scheduled & filters.private)
|
||||||
async def any_stage(app: Client, msg: Message):
|
async def any_stage(app: Client, msg: Message):
|
||||||
|
|
||||||
if msg.via_bot is None:
|
if msg.via_bot is None:
|
||||||
@@ -52,9 +52,6 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if msg.chat.id == configGet("admin", "groups"):
|
|
||||||
return
|
|
||||||
|
|
||||||
if msg.text is not None:
|
if msg.text is not None:
|
||||||
|
|
||||||
if configGet("enabled", "features", "applications") is True:
|
if configGet("enabled", "features", "applications") is True:
|
||||||
@@ -69,9 +66,6 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
|
|
||||||
if holo_user.application_state()[0] != "fill" and holo_user.sponsorship_state()[0] != "fill":
|
if holo_user.application_state()[0] != "fill" and holo_user.sponsorship_state()[0] != "fill":
|
||||||
|
|
||||||
if configGet("enabled", "features", "spoilers") is False:
|
|
||||||
return
|
|
||||||
|
|
||||||
spoiler = col_spoilers.find_one( {"user": msg.from_user.id, "completed": False} )
|
spoiler = col_spoilers.find_one( {"user": msg.from_user.id, "completed": False} )
|
||||||
|
|
||||||
if spoiler is None:
|
if spoiler is None:
|
||||||
@@ -152,37 +146,7 @@ async def any_stage(app: Client, msg: Message):
|
|||||||
ready = True
|
ready = True
|
||||||
|
|
||||||
if ready is True:
|
if ready is True:
|
||||||
if configGet("allow_external", "features", "spoilers") is True:
|
await msg.reply_text(locale("spoiler_ready", "message", locale=msg.from_user), reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_send", "button", locale=msg.from_user), switch_inline_query=f"spoiler:{spoiler['_id'].__str__()}")]]))
|
||||||
await msg.reply_text(
|
|
||||||
locale("spoiler_ready", "message", locale=msg.from_user),
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(locale("spoiler_preview", "button", locale=msg.from_user), callback_data=f"sid_{spoiler['_id'].__str__()}")
|
|
||||||
],
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(locale("spoiler_send_chat", "button", locale=msg.from_user), callback_data=f"shc_{spoiler['_id'].__str__()}")
|
|
||||||
],
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(locale("spoiler_send_other", "button", locale=msg.from_user), switch_inline_query=f"spoiler:{spoiler['_id'].__str__()}")
|
|
||||||
]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
await msg.reply_text(
|
|
||||||
locale("spoiler_ready", "message", locale=msg.from_user),
|
|
||||||
reply_markup=InlineKeyboardMarkup(
|
|
||||||
[
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(locale("spoiler_preview", "button", locale=msg.from_user), callback_data=f"sid_{spoiler['_id'].__str__()}")
|
|
||||||
],
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(locale("spoiler_send_chat", "button", locale=msg.from_user), callback_data=f"shc_{spoiler['_id'].__str__()}")
|
|
||||||
]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
await msg.reply_text(locale("spoiler_incorrect_content", "message", locale=msg.from_user))
|
await msg.reply_text(locale("spoiler_incorrect_content", "message", locale=msg.from_user))
|
||||||
|
|
||||||
|
@@ -1,13 +1,10 @@
|
|||||||
from datetime import datetime
|
|
||||||
from app import app, isAnAdmin
|
from app import app, isAnAdmin
|
||||||
from pyrogram.types import ChatPermissions, InlineKeyboardMarkup, InlineKeyboardButton, ChatMemberUpdated
|
from pyrogram.types import ChatPermissions, InlineKeyboardMarkup, InlineKeyboardButton, ChatMemberUpdated
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from modules.utils import configGet, locale
|
from modules.utils import configGet, locale
|
||||||
from modules import custom_filters
|
|
||||||
from modules.logging import logWrite
|
from modules.logging import logWrite
|
||||||
from modules.database import col_applications
|
|
||||||
from classes.holo_user import HoloUser
|
from classes.holo_user import HoloUser
|
||||||
from dateutil.relativedelta import relativedelta
|
from modules import custom_filters
|
||||||
|
|
||||||
# Filter users on join =========================================================================================================
|
# Filter users on join =========================================================================================================
|
||||||
@app.on_chat_member_updated(custom_filters.enabled_invites_check, group=configGet("users", "groups"))
|
@app.on_chat_member_updated(custom_filters.enabled_invites_check, group=configGet("users", "groups"))
|
||||||
@@ -19,61 +16,11 @@ async def filter_join(app: Client, member: ChatMemberUpdated):
|
|||||||
holo_user = HoloUser(member.from_user)
|
holo_user = HoloUser(member.from_user)
|
||||||
|
|
||||||
if (holo_user.link is not None) and (holo_user.link == member.invite_link.invite_link):
|
if (holo_user.link is not None) and (holo_user.link == member.invite_link.invite_link):
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} joined destination group with correct link {holo_user.link}")
|
logWrite(f"User {holo_user.id} joined destination group with correct link {holo_user.link}")
|
||||||
|
|
||||||
application = col_applications.find_one({"user": holo_user.id})
|
|
||||||
application_content = []
|
|
||||||
i = 1
|
|
||||||
|
|
||||||
for question in application['application']:
|
|
||||||
|
|
||||||
if i == 2:
|
|
||||||
age = relativedelta(datetime.now(), application['application']['2'])
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
|
||||||
elif i == 3:
|
|
||||||
if application['application']['3']['countryCode'] == "UA":
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']}")
|
|
||||||
else:
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})")
|
|
||||||
else:
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application'][question]}")
|
|
||||||
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
await app.send_message(configGet("users", "groups"), locale("joined_application", "messages").format(member.from_user.first_name, member.from_user.username, "\n".join(application_content)))
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if await isAnAdmin(member.invite_link.creator.id):
|
if await isAnAdmin(member.invite_link.creator.id):
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} joined destination group with link {holo_user.link} of an admin {member.invite_link.creator.id}")
|
logWrite(f"User {holo_user.id} joined destination group with link {holo_user.link} of an admin {member.invite_link.creator.id}")
|
||||||
|
|
||||||
application = col_applications.find_one({"user": holo_user.id})
|
|
||||||
|
|
||||||
if application is None:
|
|
||||||
return
|
|
||||||
|
|
||||||
application_content = []
|
|
||||||
i = 1
|
|
||||||
|
|
||||||
for question in application['application']:
|
|
||||||
|
|
||||||
if i == 2:
|
|
||||||
age = relativedelta(datetime.now(), application['application']['2'])
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['2'].strftime('%d.%m.%Y')} ({age.years} р.)")
|
|
||||||
elif i == 3:
|
|
||||||
if application['application']['3']['countryCode'] == "UA":
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']}")
|
|
||||||
else:
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application']['3']['name']} ({application['application']['3']['adminName1']}, {application['application']['3']['countryName']})")
|
|
||||||
else:
|
|
||||||
application_content.append(f"{locale(f'question{i}', 'message', 'question_titles')} {application['application'][question]}")
|
|
||||||
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
await app.send_message(configGet("users", "groups"), locale("joined_application", "messages").format(member.from_user.first_name, member.from_user.username, "\n".join(application_content)))
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
logWrite(f"User {holo_user.id} joined destination group with stolen/unapproved link {holo_user.link}")
|
logWrite(f"User {holo_user.id} joined destination group with stolen/unapproved link {holo_user.link}")
|
||||||
|
@@ -30,10 +30,7 @@ async def welcome_pass(app: Client, msg: Message, once_again: bool = False) -> N
|
|||||||
if once_again is False:
|
if once_again is False:
|
||||||
holo_user.application_restart()
|
holo_user.application_restart()
|
||||||
|
|
||||||
if once_again is True:
|
logWrite(f"User {msg.from_user.id} confirmed starting the application")
|
||||||
logWrite(f"User {msg.from_user.id} confirmed starting the application")
|
|
||||||
else:
|
|
||||||
logWrite(f"User {msg.from_user.id} confirmed starting the application once again")
|
|
||||||
await msg.reply_text(locale("question1", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("question1", "force_reply", locale=msg.from_user)))
|
await msg.reply_text(locale("question1", "message", locale=msg.from_user), reply_markup=ForceReply(placeholder=locale("question1", "force_reply", locale=msg.from_user)))
|
||||||
|
|
||||||
welcome_2 = []
|
welcome_2 = []
|
||||||
|
@@ -22,36 +22,34 @@ async def inline_answer(client: Client, inline_query: InlineQuery):
|
|||||||
|
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
if configGet("allow_external", "features", "spoilers") is True:
|
if inline_query.query.startswith("spoiler:"):
|
||||||
|
|
||||||
if inline_query.query.startswith("spoiler:"):
|
try:
|
||||||
|
|
||||||
try:
|
|
||||||
|
|
||||||
spoil = col_spoilers.find_one( {"_id": ObjectId(inline_query.query.removeprefix("spoiler:"))} )
|
spoil = col_spoilers.find_one( {"_id": ObjectId(inline_query.query.removeprefix("spoiler:"))} )
|
||||||
|
|
||||||
if spoil is not None:
|
if spoil is not None:
|
||||||
|
|
||||||
desc = locale("spoiler_empty", "message", locale=inline_query.from_user).format(locale(spoil["category"], "message", "spoiler_categories")) if spoil["description"] == "" else locale("spoiler_described", "message", locale=inline_query.from_user).format(locale(spoil["category"], "message", "spoiler_categories"), spoil["description"])
|
desc = locale("spoiler_empty", "message", locale=inline_query.from_user).format(locale(spoil["category"], "message", "spoiler_categories")) if spoil["description"] == "" else locale("spoiler_described", "message", locale=inline_query.from_user).format(locale(spoil["category"], "message", "spoiler_categories"), spoil["description"])
|
||||||
|
|
||||||
results = [
|
results = [
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
title=locale("title", "inline", "spoiler", locale=inline_query.from_user),
|
title=locale("title", "inline", "spoiler", locale=inline_query.from_user),
|
||||||
description=locale("description", "inline", "spoiler", locale=inline_query.from_user),
|
description=locale("description", "inline", "spoiler", locale=inline_query.from_user),
|
||||||
input_message_content=InputTextMessageContent(desc, disable_web_page_preview=True),
|
input_message_content=InputTextMessageContent(desc, disable_web_page_preview=True),
|
||||||
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_view", "button", locale=inline_query.from_user), callback_data=f'sid_{inline_query.query.removeprefix("spoiler:")}')]])
|
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton(locale("spoiler_view", "button", locale=inline_query.from_user), callback_data=f'sid_{inline_query.query.removeprefix("spoiler:")}')]])
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
except InvalidId:
|
except InvalidId:
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
|
|
||||||
await inline_query.answer(
|
await inline_query.answer(
|
||||||
results=results
|
results=results
|
||||||
)
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if inline_query.chat_type in [ChatType.CHANNEL]:
|
if inline_query.chat_type in [ChatType.CHANNEL]:
|
||||||
await inline_query.answer(
|
await inline_query.answer(
|
||||||
|
@@ -1,9 +1,7 @@
|
|||||||
"""Automatically register commands and execute
|
"""Automatically register commands and execute
|
||||||
some scheduled tasks is the main idea of this module"""
|
some scheduled tasks is the main idea of this module"""
|
||||||
|
|
||||||
from asyncio import sleep
|
|
||||||
from os import listdir, makedirs, path, sep
|
from os import listdir, makedirs, path, sep
|
||||||
from traceback import format_exc
|
|
||||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from ujson import dumps
|
from ujson import dumps
|
||||||
@@ -12,11 +10,9 @@ from pyrogram.types import BotCommand, BotCommandScopeChat, BotCommandScopeChatA
|
|||||||
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
|
||||||
from modules.utils import configGet, jsonLoad, jsonSave, locale, logWrite
|
from modules.utils import configGet, jsonSave, locale, logWrite
|
||||||
from dateutil.relativedelta import relativedelta
|
from dateutil.relativedelta import relativedelta
|
||||||
from modules.database import col_applications, col_sponsorships, col_youtube
|
from modules.database import col_applications, col_sponsorships
|
||||||
from xmltodict import parse
|
|
||||||
from requests import get
|
|
||||||
|
|
||||||
scheduler = AsyncIOScheduler()
|
scheduler = AsyncIOScheduler()
|
||||||
|
|
||||||
@@ -66,8 +62,6 @@ if configGet("enabled", "features", "applications") is True:
|
|||||||
for entry in col_applications.find():
|
for entry in col_applications.find():
|
||||||
if entry["application"]["2"].strftime("%d.%m") == datetime.now().strftime("%d.%m"):
|
if entry["application"]["2"].strftime("%d.%m") == datetime.now().strftime("%d.%m"):
|
||||||
try:
|
try:
|
||||||
if entry["user"] not in jsonLoad(path.join(configGet("cache", "locations"), "group_members")):
|
|
||||||
continue
|
|
||||||
tg_user = await app.get_users(entry["user"])
|
tg_user = await app.get_users(entry["user"])
|
||||||
await app.send_message( configGet("admin", "groups"), locale("birthday", "message").format(str(tg_user.first_name), str(tg_user.username), str(relativedelta(datetime.now(), entry["application"]["2"], '%d.%m.%Y').years)) ) # type: ignore
|
await app.send_message( configGet("admin", "groups"), locale("birthday", "message").format(str(tg_user.first_name), str(tg_user.username), str(relativedelta(datetime.now(), entry["application"]["2"], '%d.%m.%Y').years)) ) # type: ignore
|
||||||
logWrite(f"Notified admins about {entry['user']}'s birthday")
|
logWrite(f"Notified admins about {entry['user']}'s birthday")
|
||||||
@@ -84,26 +78,22 @@ if configGet("enabled", "features", "sponsorships") is True:
|
|||||||
async def check_sponsors():
|
async def check_sponsors():
|
||||||
for entry in col_sponsorships.find({"sponsorship.expires": {"$lt": datetime.now()+timedelta(days=2)}}):
|
for entry in col_sponsorships.find({"sponsorship.expires": {"$lt": datetime.now()+timedelta(days=2)}}):
|
||||||
try:
|
try:
|
||||||
if entry["user"] not in jsonLoad(path.join(configGet("cache", "locations"), "group_members")):
|
|
||||||
continue
|
|
||||||
tg_user = await app.get_users(entry["user"])
|
tg_user = await app.get_users(entry["user"])
|
||||||
until_expiry = abs(relativedelta(datetime.now(), entry["sponsorship"]["expires"]).days)+1
|
until_expiry = relativedelta(datetime.now(), entry["sponsorship"]["expires"]).days
|
||||||
await app.send_message( tg_user.id, 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 {entry['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}'")
|
||||||
continue
|
continue
|
||||||
for entry in col_sponsorships.find({"sponsorship.expires": {"$lt": datetime.now()-timedelta(days=1)}}):
|
for entry in col_sponsorships.find({"sponsorship.expires": {"$lt": datetime.now()}}):
|
||||||
try:
|
try:
|
||||||
holo_user = HoloUser(entry["user"])
|
holo_user = HoloUser(entry["user"])
|
||||||
col_sponsorships.find_one_and_delete({"user": holo_user.id})
|
|
||||||
if entry["user"] not in jsonLoad(path.join(configGet("cache", "locations"), "group_members")):
|
|
||||||
continue
|
|
||||||
await app.send_message( entry["user"], locale("sponsorships_expired", "message") ) # type: ignore
|
await app.send_message( entry["user"], locale("sponsorships_expired", "message") ) # type: ignore
|
||||||
await holo_user.label_reset(configGet("users", "groups"))
|
await holo_user.label_reset(configGet("users", "groups"))
|
||||||
|
col_sponsorships.find_one_and_delete({"user": holo_user.id})
|
||||||
try:
|
try:
|
||||||
tg_user = await app.get_users(entry["user"])
|
tg_user = await app.get_users(entry["user"])
|
||||||
logWrite(f"Notified user {entry['user']} that sponsorship expired")
|
logWrite(f"Notified user that sponsorship expired")
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
logWrite(f"Could not find user {entry['user']} notify about sponsorship expired due to '{exp}'")
|
logWrite(f"Could not find user {entry['user']} notify about sponsorship expired due to '{exp}'")
|
||||||
except Exception as exp:
|
except Exception as exp:
|
||||||
@@ -243,30 +233,4 @@ async def commands_register():
|
|||||||
|
|
||||||
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)}", debug=True)
|
logWrite(f"Complete commands registration:\n{dumps(commands_raw, indent=4, ensure_ascii=False, encode_html_chars=False)}", debug=True)
|
||||||
|
|
||||||
|
|
||||||
if configGet("enabled", "scheduler", "channels_monitor"):
|
|
||||||
@scheduler.scheduled_job(trigger="interval", minutes=configGet("interval", "scheduler", "channels_monitor"))
|
|
||||||
async def channels_monitor():
|
|
||||||
for channel in configGet("channels", "scheduler", "channels_monitor"):
|
|
||||||
if configGet("debug") is True:
|
|
||||||
logWrite(f'Processing videos of {channel["name"]} ({channel["id"]})', debug=True)
|
|
||||||
try:
|
|
||||||
req = get(f'https://www.youtube.com/feeds/videos.xml?channel_id={channel["id"]}')
|
|
||||||
parsed = parse(req.content)
|
|
||||||
if "feed" not in parsed:
|
|
||||||
continue
|
|
||||||
if "entry" not in parsed["feed"]:
|
|
||||||
continue
|
|
||||||
for entry in parsed["feed"]["entry"]:
|
|
||||||
if "yt:videoId" not in entry:
|
|
||||||
continue
|
|
||||||
if col_youtube.find_one( {"channel": channel["id"], "video": entry["yt:videoId"]} ) is None:
|
|
||||||
col_youtube.insert_one( {"channel": channel["id"], "video": entry["yt:videoId"], "date": datetime.fromisoformat(entry["published"])} )
|
|
||||||
await app.send_message(configGet("users", "groups"), locale("youtube_video", "message").format(channel["name"], channel["link"], entry["title"], entry["link"]["@href"]), disable_web_page_preview=False)
|
|
||||||
await sleep(2)
|
|
||||||
except Exception as exp:
|
|
||||||
logWrite(f'Could not get last videos of {channel["name"]} ({channel["id"]}) due to {exp}: {format_exc()}')
|
|
||||||
if configGet("debug") is True:
|
|
||||||
logWrite("Admin group caching performed", debug=True)
|
|
@@ -1,4 +1,4 @@
|
|||||||
from typing import Any, Literal, Tuple, Union
|
from typing import Any, Literal, Union
|
||||||
from uuid import uuid1
|
from uuid import uuid1
|
||||||
from requests import get
|
from requests import get
|
||||||
from pyrogram.enums.chat_type import ChatType
|
from pyrogram.enums.chat_type import ChatType
|
||||||
@@ -212,7 +212,7 @@ def create_tmp(bytedata: Union[bytes, bytearray], kind: Union[Literal["image", "
|
|||||||
file.write(bytedata)
|
file.write(bytedata)
|
||||||
return path.join("tmp", filename)
|
return path.join("tmp", filename)
|
||||||
|
|
||||||
async def download_tmp(app: Client, file_id: str) -> Tuple[str, bytes]:
|
async def download_tmp(app: Client, file_id: str) -> bytes:
|
||||||
"""Download file by its ID and return its bytes
|
"""Download file by its ID and return its bytes
|
||||||
|
|
||||||
### Args:
|
### Args:
|
||||||
@@ -220,14 +220,14 @@ async def download_tmp(app: Client, file_id: str) -> Tuple[str, bytes]:
|
|||||||
* file_id (`str`): File's unique id
|
* file_id (`str`): File's unique id
|
||||||
|
|
||||||
### Returns:
|
### Returns:
|
||||||
* `Tuple[str, bytes]`: First is a filepath and the second is file's bytes
|
* `bytes`: Bytes of downloaded file
|
||||||
"""
|
"""
|
||||||
filename = str(uuid1())
|
filename = str(uuid1())
|
||||||
makedirs("tmp", exist_ok=True)
|
makedirs("tmp", exist_ok=True)
|
||||||
await app.download_media(file_id, path.join("tmp", filename))
|
await app.download_media(file_id, path.join("tmp", filename))
|
||||||
with open(path.join("tmp", filename), "rb") as f:
|
with open(path.join("tmp", filename), "rb") as f:
|
||||||
bytedata = f.read()
|
bytedata = f.read()
|
||||||
return path.join("tmp", filename), bytedata
|
return bytedata
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from psutil import Process
|
from psutil import Process
|
||||||
|
@@ -2,11 +2,10 @@ 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.97
|
Pyrogram~=2.0.96
|
||||||
requests==2.28.2
|
requests==2.28.1
|
||||||
tgcrypto==1.2.5
|
tgcrypto==1.2.5
|
||||||
python_dateutil==2.8.2
|
python_dateutil==2.8.2
|
||||||
starlette~=0.22.0
|
starlette~=0.22.0
|
||||||
ujson~=5.7.0
|
ujson~=5.7.0
|
||||||
ftfy~=6.1.1
|
ftfy~=6.1.1
|
||||||
xmltodict~=0.13.0
|
|
Reference in New Issue
Block a user