Compare commits
41 Commits
569b0d51e5
...
dev
Author | SHA1 | Date | |
---|---|---|---|
5c32c505f4 | |||
a5f3c6cd2b | |||
e2cb0926ae | |||
fa975ddc09 | |||
44b72df169 | |||
b059da9d32 | |||
9e1db9f591 | |||
7689b49e01 | |||
ea021904bd | |||
1c5f46a263 | |||
0dc5d668cb | |||
d9b8048cdd | |||
3f3e1a57fe | |||
8bf4770ab9 | |||
4b4c6c095c | |||
a0bee0c53e | |||
3bc6183228 | |||
c8ad0694d1 | |||
48c7337297 | |||
053e9c4513 | |||
eb80eddb6e
|
|||
98f19e0c23 | |||
54005c9d4f | |||
d118db519b | |||
8f3ca5a16d | |||
15175a64c8 | |||
5088b45753 | |||
a417609464 | |||
d22b36ef89 | |||
da028919ed | |||
c338e1bf57 | |||
67eafcf1a4 | |||
783d191f35 | |||
e61516f51f
|
|||
8eef171391
|
|||
0e76659511
|
|||
dfd39f47db
|
|||
9e00d38877
|
|||
ab39c111eb
|
|||
64e097737a
|
|||
e3376e5fe0
|
14
.renovaterc
14
.renovaterc
@@ -2,5 +2,19 @@
|
|||||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
"extends": [
|
"extends": [
|
||||||
"config:base"
|
"config:base"
|
||||||
|
],
|
||||||
|
"baseBranches": [
|
||||||
|
"dev"
|
||||||
|
],
|
||||||
|
"packageRules": [
|
||||||
|
{
|
||||||
|
"matchUpdateTypes": [
|
||||||
|
"minor",
|
||||||
|
"patch",
|
||||||
|
"pin",
|
||||||
|
"digest"
|
||||||
|
],
|
||||||
|
"automerge": true
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@@ -1,30 +1,37 @@
|
|||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
from libbot.pyrogram.classes import PyroClient
|
from libbot.pyrogram.classes import PyroClient as LibPyroClient
|
||||||
from pyrogram.types import User
|
from pyrogram.types import User
|
||||||
|
|
||||||
|
from classes.pyrogroup import PyroGroup
|
||||||
from classes.pyrouser import PyroUser
|
from classes.pyrouser import PyroUser
|
||||||
from modules.database import col_users
|
|
||||||
|
|
||||||
|
|
||||||
class PyroClient(PyroClient):
|
class PyroClient(LibPyroClient):
|
||||||
async def find_user(self, user: Union[int, User], group: int) -> PyroUser:
|
async def find_user(self, user: Union[int, User], *args, **kwargs) -> PyroUser:
|
||||||
"""Find User by it's ID or User object
|
"""Find User by it's ID or User object.
|
||||||
|
|
||||||
### Args:
|
### Args:
|
||||||
* user (`Union[int, User]`): ID or User object to extract ID from
|
* user (`Union[int, User]`): ID or User object to extract ID from
|
||||||
* group (`int`): ID of the group
|
|
||||||
|
|
||||||
### Returns:
|
### Returns:
|
||||||
* `PyroUser`: PyroUser object
|
* `PyroUser`: PyroUser object
|
||||||
"""
|
"""
|
||||||
db_record = await col_users.find_one(
|
|
||||||
{"id": user.id if isinstance(user, User) else user, "group": group}
|
return (
|
||||||
|
await PyroUser.find(user, *args, **kwargs)
|
||||||
|
if isinstance(user, int)
|
||||||
|
else await PyroUser.find(user.id, *args, **kwargs)
|
||||||
)
|
)
|
||||||
|
|
||||||
if db_record is None:
|
async def find_group(self, id: int, *args, **kwargs) -> PyroGroup:
|
||||||
raise KeyError(
|
"""Find Group by it's ID.
|
||||||
f"User with ID {user.id if isinstance(user, User) else user} was not found in the database"
|
|
||||||
)
|
|
||||||
|
|
||||||
return PyroUser(**db_record)
|
### Args:
|
||||||
|
* id (`int`): Group ID
|
||||||
|
|
||||||
|
### Returns:
|
||||||
|
* `PyroGroup`: PyroGroup object
|
||||||
|
"""
|
||||||
|
|
||||||
|
return await PyroGroup.find(id, *args, **kwargs)
|
||||||
|
@@ -4,9 +4,9 @@ from typing import Union
|
|||||||
|
|
||||||
from bson import ObjectId
|
from bson import ObjectId
|
||||||
from libbot import sync
|
from libbot import sync
|
||||||
|
from libbot.pyrogram.classes import PyroClient
|
||||||
from pyrogram.types import User
|
from pyrogram.types import User
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
|
||||||
from modules.database import col_groups
|
from modules.database import col_groups
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -35,9 +35,9 @@ class PyroGroup:
|
|||||||
timeout_verify: int
|
timeout_verify: int
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def create_if_not_exists(
|
async def find(
|
||||||
cls,
|
cls,
|
||||||
id: int,
|
id: Union[int, float],
|
||||||
locale: Union[str, None] = sync.config_get("locale", "defaults", "group"),
|
locale: Union[str, None] = sync.config_get("locale", "defaults", "group"),
|
||||||
locale_auto: bool = sync.config_get("locale_auto", "defaults", "group"),
|
locale_auto: bool = sync.config_get("locale_auto", "defaults", "group"),
|
||||||
ban_failed: bool = sync.config_get("ban_failed", "defaults", "group"),
|
ban_failed: bool = sync.config_get("ban_failed", "defaults", "group"),
|
||||||
@@ -53,7 +53,7 @@ class PyroGroup:
|
|||||||
if db_entry is None:
|
if db_entry is None:
|
||||||
inserted = await col_groups.insert_one(
|
inserted = await col_groups.insert_one(
|
||||||
{
|
{
|
||||||
"id": id,
|
"id": int(id),
|
||||||
"locale": locale,
|
"locale": locale,
|
||||||
"locale_auto": locale_auto,
|
"locale_auto": locale_auto,
|
||||||
"ban_failed": ban_failed,
|
"ban_failed": ban_failed,
|
||||||
@@ -117,6 +117,8 @@ class PyroGroup:
|
|||||||
def select_locale(
|
def select_locale(
|
||||||
self, app: PyroClient, user: User, ignore_auto: bool = False
|
self, app: PyroClient, user: User, ignore_auto: bool = False
|
||||||
) -> str:
|
) -> str:
|
||||||
|
if user is None:
|
||||||
|
return app.default_locale
|
||||||
if not ignore_auto and self.locale_auto is True:
|
if not ignore_auto and self.locale_auto is True:
|
||||||
if user.language_code is not None:
|
if user.language_code is not None:
|
||||||
return user.language_code
|
return user.language_code
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import List
|
from typing import List, Union
|
||||||
|
|
||||||
from bson import ObjectId
|
from bson import ObjectId
|
||||||
|
|
||||||
@@ -34,9 +34,9 @@ class PyroUser:
|
|||||||
mistakes: int
|
mistakes: int
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def create_if_not_exists(
|
async def find(
|
||||||
cls,
|
cls,
|
||||||
id: int,
|
id: Union[int, float],
|
||||||
group: int,
|
group: int,
|
||||||
failed: bool = False,
|
failed: bool = False,
|
||||||
emojis: List[str] = [],
|
emojis: List[str] = [],
|
||||||
@@ -49,7 +49,7 @@ class PyroUser:
|
|||||||
if db_entry is None:
|
if db_entry is None:
|
||||||
inserted = await col_users.insert_one(
|
inserted = await col_users.insert_one(
|
||||||
{
|
{
|
||||||
"id": id,
|
"id": int(id),
|
||||||
"group": group,
|
"group": group,
|
||||||
"failed": failed,
|
"failed": failed,
|
||||||
"emojis": emojis,
|
"emojis": emojis,
|
||||||
|
@@ -21,16 +21,16 @@
|
|||||||
"help": "Hi! This bot can help you protect against annoying bots by enforcing emoji captcha on join.\n\nIn order to it, add this bot to your desired group and provide it with **Delete Messages** and **Ban Users** permissions.\n\nAvailable commands:\n• /ban_failed - toggle banning on timeout or captcha fail\n• /language - change bot's language\n• /language_auto - toggle automatic per-user language\n• /timeout_join - set timeout time on join (in seconds)\n• /timeout_verify - set timeout for verification (in seconds)\n\nCommands listed above must be executes in group by its admins or owner.\n\nThis bot is open source, so feel free to host it yourself or modify to your liking: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nIf you want to file an issue or make a suggestion – visit bot's [issues page](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) on bot's git.\n\nHave a nice day :)",
|
"help": "Hi! This bot can help you protect against annoying bots by enforcing emoji captcha on join.\n\nIn order to it, add this bot to your desired group and provide it with **Delete Messages** and **Ban Users** permissions.\n\nAvailable commands:\n• /ban_failed - toggle banning on timeout or captcha fail\n• /language - change bot's language\n• /language_auto - toggle automatic per-user language\n• /timeout_join - set timeout time on join (in seconds)\n• /timeout_verify - set timeout for verification (in seconds)\n\nCommands listed above must be executes in group by its admins or owner.\n\nThis bot is open source, so feel free to host it yourself or modify to your liking: https://git.end-play.xyz/profitroll/EmojiCaptchaBot\n\nIf you want to file an issue or make a suggestion – visit bot's [issues page](https://git.end-play.xyz/profitroll/EmojiCaptchaBot/issues) on bot's git.\n\nHave a nice day :)",
|
||||||
"ban_failed_disabled": "Ban on fail has been **disabled**. If users ignore verification or fail it, they will remain read-only in the group.",
|
"ban_failed_disabled": "Ban on fail has been **disabled**. If users ignore verification or fail it, they will remain read-only in the group.",
|
||||||
"ban_failed_enabled": "Ban on fail has been **enabled**. If users ignore verification or fail it, they will be immediately kicked from the group and banned.",
|
"ban_failed_enabled": "Ban on fail has been **enabled**. If users ignore verification or fail it, they will be immediately kicked from the group and banned.",
|
||||||
"locale_auto_disabled": "Automatic language selection on per-user basis has been **disabled**. Please note that group's language will now be used. You can change it using /language. If \"Default\" language is set – bot's default language ({default_locale}) will be used.",
|
"locale_auto_disabled": "Automatic language selection on a per-user basis has been **disabled**. Please note that the group's language will now be used. You can change it using /language. If \"Default\" language is set, bot's default language ({default_locale}) will be used.",
|
||||||
"locale_auto_enabled": "Automatic language selection on per-user basis has been **enabled**. Please note that if bot does not have a language pack for user – group's or bot's default language will be used. You can change group's language using /language. If \"Default\" language is set – bot's default language ({default_locale}) will be used.",
|
"locale_auto_enabled": "Automatic language selection on a per-user basis has been **enabled**. Please note that if bot does not have a language pack for user – group's or bot's default language will be used. You can change group's language using /language. If \"Default\" language is set, bot's default language ({default_locale}) will be used.",
|
||||||
"locale_choice": "Alright. Please choose the language using keyboard below.\n\nNote, that you can also enable automatic language selection on per-user basis using command /language_auto",
|
"locale_choice": "Alright. Please choose the language using the keyboard below.\n\nNote, that you can also enable automatic language selection on a per-user basis using the command /language_auto",
|
||||||
"permission_denied": "You are not allowed to do so.",
|
"permission_denied": "You are not allowed to do so.",
|
||||||
"timeout_invalid_number": "Timeout must be an integer value in range 10 to 600 (seconds).",
|
"timeout_invalid_number": "Timeout must be an integer value in the range 10 to 600 (seconds).",
|
||||||
"timeout_join_invalid": "Wrong usage! Correct example:\n`/timeout_join SECONDS`",
|
"timeout_join_invalid": "Wrong usage! Correct example:\n`/timeout_join SECONDS`",
|
||||||
"timeout_join_set": "Join timeout has been set: {timeout} sec.",
|
"timeout_join_set": "Join timeout has been set: {timeout} sec.",
|
||||||
"timeout_verify_invalid": "Wrong usage! Correct example:\n`/timeout_verify SECONDS`",
|
"timeout_verify_invalid": "Wrong usage! Correct example:\n`/timeout_verify SECONDS`",
|
||||||
"timeout_verify_set": "Verification timeout has been set: {timeout} sec.",
|
"timeout_verify_set": "Verification timeout has been set: {timeout} sec.",
|
||||||
"verify": "Please, use the buttons below to complete the captcha. Tap on the buttons with emojis you see on this image.",
|
"verify": "Please, use the buttons below to complete the captcha. Tap on the buttons with emojis you see in this image.",
|
||||||
"welcome_verify": "Welcome, {mention}! In order to chat here, we need to verify you're a human. Please, press the button below to start the verification.",
|
"welcome_verify": "Welcome, {mention}! In order to chat here, we need to verify you're a human. Please, press the button below to start the verification.",
|
||||||
"welcome": "Welcome to the chat, {mention}!"
|
"welcome": "Welcome to the chat, {mention}!"
|
||||||
},
|
},
|
||||||
|
@@ -10,9 +10,9 @@
|
|||||||
},
|
},
|
||||||
"commands": {
|
"commands": {
|
||||||
"help": "Показати корисну інформацію",
|
"help": "Показати корисну інформацію",
|
||||||
"ban_failed": "Переключити бан при невдалій верифікації",
|
"ban_failed": "Перемикнути бан при невдалій верифікації",
|
||||||
"language": "Встановити мову бота в цій групі",
|
"language": "Встановити мову бота в цій групі",
|
||||||
"language_auto": "Переключити автоматичний вибір мови",
|
"language_auto": "Перемикнути автоматичний вибір мови",
|
||||||
"timeout_join": "Встановити таймаут приєднання",
|
"timeout_join": "Встановити таймаут приєднання",
|
||||||
"timeout_verify": "Встановити таймаут перевірки"
|
"timeout_verify": "Встановити таймаут перевірки"
|
||||||
},
|
},
|
||||||
|
@@ -1,11 +1,9 @@
|
|||||||
"""Module that provides all database columns"""
|
"""Module that provides all database columns"""
|
||||||
|
|
||||||
from async_pymongo import AsyncClient
|
from async_pymongo import AsyncClient
|
||||||
from ujson import loads
|
from libbot import sync
|
||||||
|
|
||||||
with open("config.json", "r", encoding="utf-8") as f:
|
db_config = sync.config_get("database")
|
||||||
db_config = loads(f.read())["database"]
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
if db_config["user"] is not None and db_config["password"] is not None:
|
if db_config["user"] is not None and db_config["password"] is not None:
|
||||||
con_string = "mongodb://{0}:{1}@{2}:{3}/{4}".format(
|
con_string = "mongodb://{0}:{1}@{2}:{3}/{4}".format(
|
||||||
@@ -23,12 +21,6 @@ else:
|
|||||||
db_client = AsyncClient(con_string)
|
db_client = AsyncClient(con_string)
|
||||||
db = db_client.get_database(name=db_config["name"])
|
db = db_client.get_database(name=db_config["name"])
|
||||||
|
|
||||||
# collections = db.list_collection_names()
|
|
||||||
|
|
||||||
# for collection in ["users", "groups", "schedule"]:
|
|
||||||
# if collection not in collections:
|
|
||||||
# db.create_collection(collection)
|
|
||||||
|
|
||||||
col_users = db.get_collection("users")
|
col_users = db.get_collection("users")
|
||||||
col_groups = db.get_collection("groups")
|
col_groups = db.get_collection("groups")
|
||||||
col_schedule = db.get_collection("schedule")
|
col_schedule = db.get_collection("schedule")
|
||||||
|
@@ -1,14 +1,13 @@
|
|||||||
from pyrogram.types import Message
|
from pyrogram.types import Message
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
|
||||||
|
|
||||||
|
|
||||||
async def kick_unstarted(
|
async def kick_unstarted(
|
||||||
app: PyroClient, user_id: int, group_id: int, message_id: int
|
app: PyroClient, user_id: int, group_id: int, message_id: int
|
||||||
) -> None:
|
) -> None:
|
||||||
user = await app.find_user(user_id, group_id)
|
user = await app.find_user(user_id, group_id)
|
||||||
group = await PyroGroup.create_if_not_exists(group_id)
|
group = await app.find_group(group_id)
|
||||||
|
|
||||||
if user.score == 0 and user.failed == 0:
|
if user.score == 0 and user.failed == 0:
|
||||||
if group.ban_failed:
|
if group.ban_failed:
|
||||||
@@ -17,6 +16,7 @@ async def kick_unstarted(
|
|||||||
if isinstance(banned, Message):
|
if isinstance(banned, Message):
|
||||||
await banned.delete()
|
await banned.delete()
|
||||||
|
|
||||||
|
await user.set_failed(True)
|
||||||
await app.delete_messages(group_id, message_id)
|
await app.delete_messages(group_id, message_id)
|
||||||
|
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ async def kick_unverified(
|
|||||||
app: PyroClient, user_id: int, group_id: int, message_id: int
|
app: PyroClient, user_id: int, group_id: int, message_id: int
|
||||||
) -> None:
|
) -> None:
|
||||||
user = await app.find_user(user_id, group_id)
|
user = await app.find_user(user_id, group_id)
|
||||||
group = await PyroGroup.create_if_not_exists(group_id)
|
group = await app.find_group(group_id)
|
||||||
|
|
||||||
if user.score < 6 or user.failed:
|
if user.score < 6 or user.failed:
|
||||||
if group.ban_failed:
|
if group.ban_failed:
|
||||||
@@ -33,4 +33,5 @@ async def kick_unverified(
|
|||||||
if isinstance(banned, Message):
|
if isinstance(banned, Message):
|
||||||
await banned.delete()
|
await banned.delete()
|
||||||
|
|
||||||
|
await user.set_failed(True)
|
||||||
await app.delete_messages(group_id, message_id)
|
await app.delete_messages(group_id, message_id)
|
||||||
|
@@ -1,12 +1,16 @@
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from random import randint, sample
|
from random import randint, sample
|
||||||
from typing import List
|
from typing import List, Union
|
||||||
|
|
||||||
from huepaper import generate
|
from huepaper import generate
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
||||||
|
from pyrogram.types import CallbackQuery, Message
|
||||||
|
|
||||||
from classes.captcha import Captcha
|
from classes.captcha import Captcha
|
||||||
|
from classes.pyroclient import PyroClient
|
||||||
|
from classes.pyrogroup import PyroGroup
|
||||||
|
|
||||||
|
|
||||||
def get_captcha_image(emojis: List[str]) -> Captcha:
|
def get_captcha_image(emojis: List[str]) -> Captcha:
|
||||||
@@ -49,3 +53,40 @@ def get_captcha_image(emojis: List[str]) -> Captcha:
|
|||||||
base_img.save(output, format="jpeg")
|
base_img.save(output, format="jpeg")
|
||||||
|
|
||||||
return Captcha(output, emojis_all, emojis_correct)
|
return Captcha(output, emojis_all, emojis_correct)
|
||||||
|
|
||||||
|
|
||||||
|
async def is_permitted(
|
||||||
|
app: PyroClient,
|
||||||
|
group: PyroGroup,
|
||||||
|
message: Union[Message, None] = None,
|
||||||
|
callback: Union[CallbackQuery, None] = None,
|
||||||
|
) -> bool:
|
||||||
|
"""Check if User is an admin or a creator of a group. Alternatively, if the User is actually a group itself.
|
||||||
|
|
||||||
|
### Args:
|
||||||
|
* app (`PyroClient`): Pyrogram Client
|
||||||
|
* group (`PyroGroup`): Group
|
||||||
|
* message (`Union[Message, None]`, *optional*): Message if the request originates from a command. Defaults to `None`.
|
||||||
|
* callback (`Union[CallbackQuery, None]`, *optional*): CallbackQuery if the request originates from a callback. Defaults to `None`.
|
||||||
|
|
||||||
|
### Returns:
|
||||||
|
* `bool`: `True` if permitted and `False` if not. Also `False` if no message or callback provided.
|
||||||
|
"""
|
||||||
|
if message is not None:
|
||||||
|
return (
|
||||||
|
message.sender_chat is not None and message.sender_chat.id == group.id
|
||||||
|
) or (
|
||||||
|
message.from_user is not None
|
||||||
|
and (await app.get_chat_member(group.id, message.from_user.id)).status
|
||||||
|
) in [
|
||||||
|
ChatMemberStatus.ADMINISTRATOR,
|
||||||
|
ChatMemberStatus.OWNER,
|
||||||
|
]
|
||||||
|
|
||||||
|
if callback is not None:
|
||||||
|
return (await app.get_chat_member(group.id, callback.from_user.id)).status in [
|
||||||
|
ChatMemberStatus.ADMINISTRATOR,
|
||||||
|
ChatMemberStatus.OWNER,
|
||||||
|
]
|
||||||
|
|
||||||
|
return False
|
||||||
|
@@ -1,25 +1,21 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
|
||||||
from pyrogram.types import CallbackQuery, Message
|
from pyrogram.types import CallbackQuery, Message
|
||||||
|
|
||||||
from classes.callbacks import CallbackBan
|
from classes.callbacks import CallbackBan
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
from modules.utils import is_permitted
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@PyroClient.on_callback_query(filters.regex(r"ban:[\s\S]*")) # type: ignore
|
@PyroClient.on_callback_query(filters.regex(r"ban:[\s\S]*")) # type: ignore
|
||||||
async def callback_ban(app: PyroClient, callback: CallbackQuery):
|
async def callback_ban(app: PyroClient, callback: CallbackQuery):
|
||||||
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
|
group = await app.find_group(callback.message.chat.id)
|
||||||
locale = group.select_locale(app, callback.message.from_user)
|
locale = group.select_locale(app, callback.message.from_user)
|
||||||
|
|
||||||
if (await app.get_chat_member(group.id, callback.from_user.id)).status not in [
|
if not (await is_permitted(app, group, callback=callback)):
|
||||||
ChatMemberStatus.ADMINISTRATOR,
|
|
||||||
ChatMemberStatus.OWNER,
|
|
||||||
]:
|
|
||||||
await callback.answer(
|
await callback.answer(
|
||||||
app._("wrong_user", "callbacks", locale=locale), show_alert=True
|
app._("wrong_user", "callbacks", locale=locale), show_alert=True
|
||||||
)
|
)
|
||||||
|
@@ -11,7 +11,6 @@ from pyrogram.types import (
|
|||||||
|
|
||||||
from classes.callbacks import CallbackEmoji
|
from classes.callbacks import CallbackEmoji
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -19,7 +18,7 @@ logger = logging.getLogger(__name__)
|
|||||||
@PyroClient.on_callback_query(filters.regex(r"emoji:[\s\S]*")) # type: ignore
|
@PyroClient.on_callback_query(filters.regex(r"emoji:[\s\S]*")) # type: ignore
|
||||||
async def callback_emoji_button(app: PyroClient, callback: CallbackQuery):
|
async def callback_emoji_button(app: PyroClient, callback: CallbackQuery):
|
||||||
parsed = CallbackEmoji.from_callback(callback)
|
parsed = CallbackEmoji.from_callback(callback)
|
||||||
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
|
group = await app.find_group(callback.message.chat.id)
|
||||||
locale = group.select_locale(app, callback.message.from_user)
|
locale = group.select_locale(app, callback.message.from_user)
|
||||||
|
|
||||||
if callback.from_user.id != parsed.user_id:
|
if callback.from_user.id != parsed.user_id:
|
||||||
|
@@ -2,12 +2,11 @@ from pyrogram import filters
|
|||||||
from pyrogram.types import CallbackQuery
|
from pyrogram.types import CallbackQuery
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
|
||||||
|
|
||||||
|
|
||||||
@PyroClient.on_callback_query(filters.regex(r"nothing")) # type: ignore
|
@PyroClient.on_callback_query(filters.regex(r"nothing")) # type: ignore
|
||||||
async def callback_nothing(app: PyroClient, callback: CallbackQuery):
|
async def callback_nothing(app: PyroClient, callback: CallbackQuery):
|
||||||
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
|
group = await app.find_group(callback.message.chat.id)
|
||||||
locale = group.select_locale(app, callback.message.from_user)
|
locale = group.select_locale(app, callback.message.from_user)
|
||||||
|
|
||||||
await callback.answer(app._("nothing", "callbacks", locale=locale))
|
await callback.answer(app._("nothing", "callbacks", locale=locale))
|
||||||
|
@@ -9,7 +9,6 @@ from pyrogram.types import CallbackQuery
|
|||||||
|
|
||||||
from classes.callbacks import CallbackVerify
|
from classes.callbacks import CallbackVerify
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
|
||||||
from modules.database import col_schedule
|
from modules.database import col_schedule
|
||||||
from modules.kicker import kick_unverified
|
from modules.kicker import kick_unverified
|
||||||
from modules.utils import get_captcha_image
|
from modules.utils import get_captcha_image
|
||||||
@@ -20,7 +19,7 @@ logger = logging.getLogger(__name__)
|
|||||||
@PyroClient.on_callback_query(filters.regex(r"verify:[\s\S]*")) # type: ignore
|
@PyroClient.on_callback_query(filters.regex(r"verify:[\s\S]*")) # type: ignore
|
||||||
async def callback_verify(app: PyroClient, callback: CallbackQuery):
|
async def callback_verify(app: PyroClient, callback: CallbackQuery):
|
||||||
parsed = CallbackVerify.from_callback(callback)
|
parsed = CallbackVerify.from_callback(callback)
|
||||||
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
|
group = await app.find_group(callback.message.chat.id)
|
||||||
locale = group.select_locale(app, callback.message.from_user)
|
locale = group.select_locale(app, callback.message.from_user)
|
||||||
|
|
||||||
if callback.from_user.id != parsed.user_id:
|
if callback.from_user.id != parsed.user_id:
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
|
||||||
from pyrogram.types import Message
|
from pyrogram.types import Message
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
from modules.utils import is_permitted
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -16,13 +15,10 @@ logger = logging.getLogger(__name__)
|
|||||||
& filters.command(["ban_failed"], prefixes=["/"]) # type: ignore
|
& filters.command(["ban_failed"], prefixes=["/"]) # type: ignore
|
||||||
)
|
)
|
||||||
async def command_ban_failed(app: PyroClient, message: Message):
|
async def command_ban_failed(app: PyroClient, message: Message):
|
||||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
group = await app.find_group(message.chat.id)
|
||||||
locale = group.select_locale(app, message.from_user)
|
locale = group.select_locale(app, message.from_user)
|
||||||
|
|
||||||
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
|
if not (await is_permitted(app, group, message=message)):
|
||||||
ChatMemberStatus.ADMINISTRATOR,
|
|
||||||
ChatMemberStatus.OWNER,
|
|
||||||
]:
|
|
||||||
await message.reply_text(
|
await message.reply_text(
|
||||||
app._("permission_denied", "messages", locale=locale), quote=True
|
app._("permission_denied", "messages", locale=locale), quote=True
|
||||||
)
|
)
|
||||||
|
@@ -5,7 +5,7 @@ from pyrogram.enums.chat_member_status import ChatMemberStatus
|
|||||||
from pyrogram.types import Message
|
from pyrogram.types import Message
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
from modules.utils import is_permitted
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -16,13 +16,10 @@ logger = logging.getLogger(__name__)
|
|||||||
& filters.command(["language_auto"], prefixes=["/"]) # type: ignore
|
& filters.command(["language_auto"], prefixes=["/"]) # type: ignore
|
||||||
)
|
)
|
||||||
async def command_language_auto(app: PyroClient, message: Message):
|
async def command_language_auto(app: PyroClient, message: Message):
|
||||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
group = await app.find_group(message.chat.id)
|
||||||
locale = group.select_locale(app, message.from_user)
|
locale = group.select_locale(app, message.from_user)
|
||||||
|
|
||||||
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
|
if not (await is_permitted(app, group, message=message)):
|
||||||
ChatMemberStatus.ADMINISTRATOR,
|
|
||||||
ChatMemberStatus.OWNER,
|
|
||||||
]:
|
|
||||||
await message.reply_text(
|
await message.reply_text(
|
||||||
app._("permission_denied", "messages", locale=locale), quote=True
|
app._("permission_denied", "messages", locale=locale), quote=True
|
||||||
)
|
)
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
|
||||||
from pyrogram.types import Message
|
from pyrogram.types import Message
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
from modules.utils import is_permitted
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -16,13 +15,10 @@ logger = logging.getLogger(__name__)
|
|||||||
& filters.command(["timeout_join"], prefixes=["/"]) # type: ignore
|
& filters.command(["timeout_join"], prefixes=["/"]) # type: ignore
|
||||||
)
|
)
|
||||||
async def command_timeout_join(app: PyroClient, message: Message):
|
async def command_timeout_join(app: PyroClient, message: Message):
|
||||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
group = await app.find_group(message.chat.id)
|
||||||
locale = group.select_locale(app, message.from_user)
|
locale = group.select_locale(app, message.from_user)
|
||||||
|
|
||||||
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
|
if not (await is_permitted(app, group, message=message)):
|
||||||
ChatMemberStatus.ADMINISTRATOR,
|
|
||||||
ChatMemberStatus.OWNER,
|
|
||||||
]:
|
|
||||||
await message.reply_text(
|
await message.reply_text(
|
||||||
app._("permission_denied", "messages", locale=locale), quote=True
|
app._("permission_denied", "messages", locale=locale), quote=True
|
||||||
)
|
)
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
|
||||||
from pyrogram.types import Message
|
from pyrogram.types import Message
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
from modules.utils import is_permitted
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -16,13 +15,10 @@ logger = logging.getLogger(__name__)
|
|||||||
& filters.command(["timeout_verify"], prefixes=["/"]) # type: ignore
|
& filters.command(["timeout_verify"], prefixes=["/"]) # type: ignore
|
||||||
)
|
)
|
||||||
async def command_timeout_verify(app: PyroClient, message: Message):
|
async def command_timeout_verify(app: PyroClient, message: Message):
|
||||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
group = await app.find_group(message.chat.id)
|
||||||
locale = group.select_locale(app, message.from_user)
|
locale = group.select_locale(app, message.from_user)
|
||||||
|
|
||||||
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
|
if not (await is_permitted(app, group, message=message)):
|
||||||
ChatMemberStatus.ADMINISTRATOR,
|
|
||||||
ChatMemberStatus.OWNER,
|
|
||||||
]:
|
|
||||||
await message.reply_text(
|
await message.reply_text(
|
||||||
app._("permission_denied", "messages", locale=locale), quote=True
|
app._("permission_denied", "messages", locale=locale), quote=True
|
||||||
)
|
)
|
||||||
|
@@ -4,7 +4,6 @@ from pyrogram import filters
|
|||||||
from pyrogram.types import Message
|
from pyrogram.types import Message
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -12,4 +11,4 @@ logger = logging.getLogger(__name__)
|
|||||||
@PyroClient.on_message(filters.new_chat_members & filters.group & filters.me) # type: ignore
|
@PyroClient.on_message(filters.new_chat_members & filters.group & filters.me) # type: ignore
|
||||||
async def handler_bot_join(app: PyroClient, message: Message):
|
async def handler_bot_join(app: PyroClient, message: Message):
|
||||||
logger.info("Bot has joined the group %s")
|
logger.info("Bot has joined the group %s")
|
||||||
await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
await app.find_group(message.chat.id)
|
||||||
|
@@ -12,8 +12,6 @@ from pyrogram.types import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
|
||||||
from classes.pyrouser import PyroUser
|
|
||||||
from modules.database import col_schedule
|
from modules.database import col_schedule
|
||||||
from modules.kicker import kick_unstarted
|
from modules.kicker import kick_unstarted
|
||||||
|
|
||||||
@@ -24,7 +22,7 @@ logger = logging.getLogger(__name__)
|
|||||||
filters.new_chat_members & filters.group & ~filters.me & ~filters.bot # type: ignore
|
filters.new_chat_members & filters.group & ~filters.me & ~filters.bot # type: ignore
|
||||||
)
|
)
|
||||||
async def handler_user_join(app: PyroClient, message: Message):
|
async def handler_user_join(app: PyroClient, message: Message):
|
||||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
group = await app.find_group(message.chat.id)
|
||||||
locale = group.select_locale(app, message.from_user)
|
locale = group.select_locale(app, message.from_user)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -64,7 +62,7 @@ async def handler_user_join(app: PyroClient, message: Message):
|
|||||||
permissions=ChatPermissions(can_send_messages=False),
|
permissions=ChatPermissions(can_send_messages=False),
|
||||||
)
|
)
|
||||||
|
|
||||||
user = await PyroUser.create_if_not_exists(message.from_user.id, group.id)
|
user = await app.find_user(message.from_user, group=group.id)
|
||||||
|
|
||||||
if user.mistakes > 0 or user.score > 0:
|
if user.mistakes > 0 or user.score > 0:
|
||||||
await user.set_score(0)
|
await user.set_score(0)
|
||||||
@@ -105,5 +103,5 @@ async def handler_user_join(app: PyroClient, message: Message):
|
|||||||
run_date=datetime.now() + timedelta(seconds=group.timeout_join),
|
run_date=datetime.now() + timedelta(seconds=group.timeout_join),
|
||||||
)
|
)
|
||||||
await col_schedule.insert_one(
|
await col_schedule.insert_one(
|
||||||
{"user": user.id, "group": group.id, "job_id": job.id}
|
{"user": int(user.id), "group": int(group.id), "job_id": job.id}
|
||||||
)
|
)
|
||||||
|
@@ -3,12 +3,11 @@ import logging
|
|||||||
from pykeyboard import InlineButton, InlineKeyboard
|
from pykeyboard import InlineButton, InlineKeyboard
|
||||||
from pyrogram import filters
|
from pyrogram import filters
|
||||||
from pyrogram.client import Client
|
from pyrogram.client import Client
|
||||||
from pyrogram.enums.chat_member_status import ChatMemberStatus
|
|
||||||
from pyrogram.types import CallbackQuery, Message
|
from pyrogram.types import CallbackQuery, Message
|
||||||
|
|
||||||
from classes.callbacks import CallbackLanguage
|
from classes.callbacks import CallbackLanguage
|
||||||
from classes.pyroclient import PyroClient
|
from classes.pyroclient import PyroClient
|
||||||
from classes.pyrogroup import PyroGroup
|
from modules.utils import is_permitted
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -17,27 +16,21 @@ logger = logging.getLogger(__name__)
|
|||||||
~filters.scheduled & filters.group & filters.command(["language"], prefixes=["/"]) # type: ignore
|
~filters.scheduled & filters.group & filters.command(["language"], prefixes=["/"]) # type: ignore
|
||||||
)
|
)
|
||||||
async def command_language(app: PyroClient, message: Message):
|
async def command_language(app: PyroClient, message: Message):
|
||||||
group = await PyroGroup.create_if_not_exists(message.chat.id, None, True)
|
group = await app.find_group(message.chat.id)
|
||||||
locale = group.select_locale(app, message.from_user)
|
locale = group.select_locale(app, message.from_user)
|
||||||
|
|
||||||
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
|
if not (await is_permitted(app, group, message=message)):
|
||||||
ChatMemberStatus.ADMINISTRATOR,
|
|
||||||
ChatMemberStatus.OWNER,
|
|
||||||
]:
|
|
||||||
await message.reply_text(
|
await message.reply_text(
|
||||||
app._("permission_denied", "messages", locale=locale), quote=True
|
app._("permission_denied", "messages", locale=locale), quote=True
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
keyboard = InlineKeyboard(row_width=2)
|
keyboard = InlineKeyboard(row_width=2)
|
||||||
buttons = []
|
buttons = [
|
||||||
|
InlineButton(f"{data['flag']} {data['name']}", f"language:{language}")
|
||||||
for language, data in app.in_every_locale("metadata").items():
|
for language, data in app.in_every_locale("metadata").items()
|
||||||
if data["selectable"]:
|
if data["selectable"]
|
||||||
buttons.append(
|
]
|
||||||
InlineButton(f"{data['flag']} {data['name']}", f"language:{language}")
|
|
||||||
)
|
|
||||||
|
|
||||||
buttons.append(
|
buttons.append(
|
||||||
InlineButton(
|
InlineButton(
|
||||||
f"🤖 {app._('locale_default', 'buttons', locale=locale)}", "language:default"
|
f"🤖 {app._('locale_default', 'buttons', locale=locale)}", "language:default"
|
||||||
@@ -54,13 +47,10 @@ async def command_language(app: PyroClient, message: Message):
|
|||||||
|
|
||||||
@Client.on_callback_query(filters.regex(r"language:[\s\S]*")) # type: ignore
|
@Client.on_callback_query(filters.regex(r"language:[\s\S]*")) # type: ignore
|
||||||
async def callback_language(app: PyroClient, callback: CallbackQuery):
|
async def callback_language(app: PyroClient, callback: CallbackQuery):
|
||||||
group = await PyroGroup.create_if_not_exists(callback.message.chat.id, None, True)
|
group = await app.find_group(callback.message.chat.id)
|
||||||
locale = group.select_locale(app, callback.message.from_user)
|
locale = group.select_locale(app, callback.message.from_user)
|
||||||
|
|
||||||
if (await app.get_chat_member(group.id, callback.from_user.id)).status not in [
|
if not (await is_permitted(app, group, callback=callback)):
|
||||||
ChatMemberStatus.ADMINISTRATOR,
|
|
||||||
ChatMemberStatus.OWNER,
|
|
||||||
]:
|
|
||||||
await callback.answer(
|
await callback.answer(
|
||||||
app._("wrong_user", "callbacks", locale=locale), show_alert=True
|
app._("wrong_user", "callbacks", locale=locale), show_alert=True
|
||||||
)
|
)
|
||||||
|
@@ -1,9 +1,8 @@
|
|||||||
black~=23.7.0
|
async_pymongo==0.1.6
|
||||||
Pillow~=10.0.0
|
Pillow~=10.4.0
|
||||||
pykeyboard==0.1.5
|
pykeyboard==0.1.7
|
||||||
tgcrypto==1.2.5
|
tgcrypto==1.2.5
|
||||||
uvloop==0.17.0
|
uvloop==0.20.0
|
||||||
--extra-index-url https://git.end-play.xyz/api/packages/profitroll/pypi/simple
|
--extra-index-url https://git.end-play.xyz/api/packages/profitroll/pypi/simple
|
||||||
async_pymongo==0.1.4
|
huepaper==0.0.5
|
||||||
huepaper==0.0.4
|
libbot[speed,pyrogram]==3.2.3
|
||||||
libbot[speed,pyrogram]==2.0.1
|
|
Reference in New Issue
Block a user