Compare commits

...

41 Commits

Author SHA1 Message Date
5c32c505f4 Merge pull request 'Update dependency uvloop to v0.20.0' (#54) from renovate/uvloop-0.x into dev
Reviewed-on: #54
2024-08-15 23:48:25 +03:00
a5f3c6cd2b Update dependency uvloop to v0.20.0 2024-08-15 23:26:24 +03:00
e2cb0926ae Merge pull request 'Update dependency libbot to v3.2.3' (#53) from renovate/libbot-3.x into dev
Reviewed-on: #53
2024-07-10 08:12:29 +03:00
fa975ddc09 Update dependency libbot to v3.2.3 2024-07-10 00:44:47 +03:00
44b72df169 Merge pull request 'Update dependency Pillow to ~=10.4.0' (#52) from renovate/pillow-10.x into dev
Reviewed-on: #52
2024-07-02 00:55:54 +03:00
b059da9d32 Update dependency Pillow to ~=10.4.0 2024-07-01 13:08:52 +03:00
9e1db9f591 Merge pull request 'Update dependency async_pymongo to v0.1.6' (#51) from renovate/async_pymongo-0.x into dev
Reviewed-on: #51
2024-06-23 14:33:58 +03:00
7689b49e01 Update dependency async_pymongo to v0.1.6 2024-06-23 13:31:11 +03:00
ea021904bd Merge pull request 'Update dependency async_pymongo to v0.1.5' (#50) from renovate/async_pymongo-0.x into dev
Reviewed-on: #50
2024-06-02 12:57:21 +03:00
1c5f46a263 Selected async_pymongo from PyPi 2024-06-02 12:56:13 +03:00
0dc5d668cb Update dependency async_pymongo to v0.1.5 2024-06-01 15:33:13 +03:00
d9b8048cdd Merge pull request 'Update dependency libbot to v3.2.2' (#49) from renovate/libbot-3.x into dev
Reviewed-on: #49
2024-05-26 23:58:28 +03:00
3f3e1a57fe Update dependency libbot to v3.2.2 2024-05-26 23:13:36 +03:00
8bf4770ab9 Merge pull request 'Update dependency libbot to v3.2.1' (#48) from renovate/libbot-3.x into dev
Reviewed-on: #48
2024-05-26 19:41:11 +03:00
4b4c6c095c Update dependency libbot to v3.2.1 2024-05-26 19:02:27 +03:00
a0bee0c53e Merge pull request 'Update dependency libbot to v3.1.0' (#47) from renovate/libbot-3.x into dev
Reviewed-on: #47
2024-05-24 22:46:44 +03:00
3bc6183228 Update dependency libbot to v3.1.0 2024-05-24 22:43:08 +03:00
c8ad0694d1 Update .renovaterc 2024-04-15 19:57:00 +03:00
48c7337297 Merge pull request 'Update dependency Pillow to ~=10.3.0' (#46) from renovate/pillow-10.x into main
Reviewed-on: #46
2024-04-02 15:09:46 +03:00
053e9c4513 Update dependency Pillow to ~=10.3.0 2024-04-01 15:26:29 +03:00
eb80eddb6e Bump libbot to 3.0.0 and huepaper to 0.0.5 2024-01-21 17:40:07 +01:00
98f19e0c23 Merge pull request 'Update dependency pykeyboard to v0.1.7' (#45) from renovate/pykeyboard-0.x into main
Reviewed-on: #45
2024-01-21 18:39:43 +02:00
54005c9d4f Update dependency pykeyboard to v0.1.7 2024-01-04 01:15:39 +02:00
d118db519b Merge pull request 'Update dependency Pillow to ~=10.2.0' (#44) from renovate/pillow-10.x into main
Reviewed-on: #44
2024-01-02 13:12:23 +02:00
8f3ca5a16d Update dependency Pillow to ~=10.2.0 2024-01-02 12:03:35 +02:00
15175a64c8 Merge pull request 'Update dependency libbot to v2.1.0' (#42) from renovate/libbot-2.x into main
Reviewed-on: #42
2023-12-28 13:35:34 +02:00
5088b45753 Update dependency libbot to v2.1.0 2023-12-27 16:07:04 +02:00
a417609464 Merge pull request 'Update dependency uvloop to v0.19.0' (#25) from renovate/uvloop-0.x into main
Reviewed-on: #25
2023-10-29 19:32:26 +02:00
d22b36ef89 Update dependency uvloop to v0.19.0 2023-10-23 02:09:00 +03:00
da028919ed Merge pull request 'Update dependency Pillow to ~=10.1.0' (#20) from renovate/pillow-10.x into main
Reviewed-on: #20
2023-10-15 17:48:50 +03:00
c338e1bf57 Merge pull request 'Update dependency uvloop to v0.18.0' (#18) from renovate/uvloop-0.x into main
Reviewed-on: #18
2023-10-15 17:47:49 +03:00
67eafcf1a4 Update dependency Pillow to ~=10.1.0 2023-10-15 16:09:02 +03:00
783d191f35 Update dependency uvloop to v0.18.0 2023-10-14 00:28:49 +03:00
e61516f51f Fixed permissions check 2023-08-23 11:12:26 +02:00
8eef171391 Fixed sender_chat not being recognized 2023-08-23 10:42:38 +02:00
0e76659511 Fixed circular import 2023-08-23 10:36:45 +02:00
dfd39f47db Fixed locale when sending as a chat 2023-08-23 10:34:45 +02:00
9e00d38877 Implemented find_group and find_user 2023-08-17 16:37:42 +02:00
ab39c111eb Small config reading fix 2023-08-14 15:22:00 +02:00
64e097737a This commit closes #7 2023-08-14 12:53:44 +02:00
e3376e5fe0 set_failed on kick_unstarted and kick_unverified 2023-08-14 12:46:03 +02:00
21 changed files with 137 additions and 116 deletions

View File

@@ -2,5 +2,19 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
],
"baseBranches": [
"dev"
],
"packageRules": [
{
"matchUpdateTypes": [
"minor",
"patch",
"pin",
"digest"
],
"automerge": true
}
]
}

View File

@@ -1,30 +1,37 @@
from typing import Union
from libbot.pyrogram.classes import PyroClient
from libbot.pyrogram.classes import PyroClient as LibPyroClient
from pyrogram.types import User
from classes.pyrogroup import PyroGroup
from classes.pyrouser import PyroUser
from modules.database import col_users
class PyroClient(PyroClient):
async def find_user(self, user: Union[int, User], group: int) -> PyroUser:
"""Find User by it's ID or User object
class PyroClient(LibPyroClient):
async def find_user(self, user: Union[int, User], *args, **kwargs) -> PyroUser:
"""Find User by it's ID or User object.
### Args:
* user (`Union[int, User]`): ID or User object to extract ID from
* group (`int`): ID of the group
### Returns:
* `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:
raise KeyError(
f"User with ID {user.id if isinstance(user, User) else user} was not found in the database"
)
async def find_group(self, id: int, *args, **kwargs) -> PyroGroup:
"""Find Group by it's ID.
return PyroUser(**db_record)
### Args:
* id (`int`): Group ID
### Returns:
* `PyroGroup`: PyroGroup object
"""
return await PyroGroup.find(id, *args, **kwargs)

View File

@@ -4,9 +4,9 @@ from typing import Union
from bson import ObjectId
from libbot import sync
from libbot.pyrogram.classes import PyroClient
from pyrogram.types import User
from classes.pyroclient import PyroClient
from modules.database import col_groups
logger = logging.getLogger(__name__)
@@ -35,9 +35,9 @@ class PyroGroup:
timeout_verify: int
@classmethod
async def create_if_not_exists(
async def find(
cls,
id: int,
id: Union[int, float],
locale: Union[str, None] = sync.config_get("locale", "defaults", "group"),
locale_auto: bool = sync.config_get("locale_auto", "defaults", "group"),
ban_failed: bool = sync.config_get("ban_failed", "defaults", "group"),
@@ -53,7 +53,7 @@ class PyroGroup:
if db_entry is None:
inserted = await col_groups.insert_one(
{
"id": id,
"id": int(id),
"locale": locale,
"locale_auto": locale_auto,
"ban_failed": ban_failed,
@@ -117,6 +117,8 @@ class PyroGroup:
def select_locale(
self, app: PyroClient, user: User, ignore_auto: bool = False
) -> str:
if user is None:
return app.default_locale
if not ignore_auto and self.locale_auto is True:
if user.language_code is not None:
return user.language_code

View File

@@ -1,6 +1,6 @@
import logging
from dataclasses import dataclass
from typing import List
from typing import List, Union
from bson import ObjectId
@@ -34,9 +34,9 @@ class PyroUser:
mistakes: int
@classmethod
async def create_if_not_exists(
async def find(
cls,
id: int,
id: Union[int, float],
group: int,
failed: bool = False,
emojis: List[str] = [],
@@ -49,7 +49,7 @@ class PyroUser:
if db_entry is None:
inserted = await col_users.insert_one(
{
"id": id,
"id": int(id),
"group": group,
"failed": failed,
"emojis": emojis,

View File

@@ -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 :)",
"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.",
"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_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_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_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 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 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.",
"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_set": "Join timeout has been set: {timeout} sec.",
"timeout_verify_invalid": "Wrong usage! Correct example:\n`/timeout_verify SECONDS`",
"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": "Welcome to the chat, {mention}!"
},

View File

@@ -10,9 +10,9 @@
},
"commands": {
"help": "Показати корисну інформацію",
"ban_failed": "Переключити бан при невдалій верифікації",
"ban_failed": "Перемикнути бан при невдалій верифікації",
"language": "Встановити мову бота в цій групі",
"language_auto": "Переключити автоматичний вибір мови",
"language_auto": "Перемикнути автоматичний вибір мови",
"timeout_join": "Встановити таймаут приєднання",
"timeout_verify": "Встановити таймаут перевірки"
},

View File

@@ -1,11 +1,9 @@
"""Module that provides all database columns"""
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 = loads(f.read())["database"]
f.close()
db_config = sync.config_get("database")
if db_config["user"] is not None and db_config["password"] is not None:
con_string = "mongodb://{0}:{1}@{2}:{3}/{4}".format(
@@ -23,12 +21,6 @@ else:
db_client = AsyncClient(con_string)
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_groups = db.get_collection("groups")
col_schedule = db.get_collection("schedule")

View File

@@ -1,14 +1,13 @@
from pyrogram.types import Message
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
async def kick_unstarted(
app: PyroClient, user_id: int, group_id: int, message_id: int
) -> None:
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 group.ban_failed:
@@ -17,6 +16,7 @@ async def kick_unstarted(
if isinstance(banned, Message):
await banned.delete()
await user.set_failed(True)
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
) -> None:
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 group.ban_failed:
@@ -33,4 +33,5 @@ async def kick_unverified(
if isinstance(banned, Message):
await banned.delete()
await user.set_failed(True)
await app.delete_messages(group_id, message_id)

View File

@@ -1,12 +1,16 @@
from io import BytesIO
from pathlib import Path
from random import randint, sample
from typing import List
from typing import List, Union
from huepaper import generate
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.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
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")
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

View File

@@ -1,25 +1,21 @@
import logging
from pyrogram import filters
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import CallbackQuery, Message
from classes.callbacks import CallbackBan
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.utils import is_permitted
logger = logging.getLogger(__name__)
@PyroClient.on_callback_query(filters.regex(r"ban:[\s\S]*")) # type: ignore
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)
if (await app.get_chat_member(group.id, callback.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
if not (await is_permitted(app, group, callback=callback)):
await callback.answer(
app._("wrong_user", "callbacks", locale=locale), show_alert=True
)

View File

@@ -11,7 +11,6 @@ from pyrogram.types import (
from classes.callbacks import CallbackEmoji
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
logger = logging.getLogger(__name__)
@@ -19,7 +18,7 @@ logger = logging.getLogger(__name__)
@PyroClient.on_callback_query(filters.regex(r"emoji:[\s\S]*")) # type: ignore
async def callback_emoji_button(app: PyroClient, callback: CallbackQuery):
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)
if callback.from_user.id != parsed.user_id:

View File

@@ -2,12 +2,11 @@ from pyrogram import filters
from pyrogram.types import CallbackQuery
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
@PyroClient.on_callback_query(filters.regex(r"nothing")) # type: ignore
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)
await callback.answer(app._("nothing", "callbacks", locale=locale))

View File

@@ -9,7 +9,6 @@ from pyrogram.types import CallbackQuery
from classes.callbacks import CallbackVerify
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.database import col_schedule
from modules.kicker import kick_unverified
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
async def callback_verify(app: PyroClient, callback: CallbackQuery):
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)
if callback.from_user.id != parsed.user_id:

View File

@@ -1,11 +1,10 @@
import logging
from pyrogram import filters
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import Message
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.utils import is_permitted
logger = logging.getLogger(__name__)
@@ -16,13 +15,10 @@ logger = logging.getLogger(__name__)
& filters.command(["ban_failed"], prefixes=["/"]) # type: ignore
)
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)
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
if not (await is_permitted(app, group, message=message)):
await message.reply_text(
app._("permission_denied", "messages", locale=locale), quote=True
)

View File

@@ -5,7 +5,7 @@ from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import Message
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.utils import is_permitted
logger = logging.getLogger(__name__)
@@ -16,13 +16,10 @@ logger = logging.getLogger(__name__)
& filters.command(["language_auto"], prefixes=["/"]) # type: ignore
)
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)
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
if not (await is_permitted(app, group, message=message)):
await message.reply_text(
app._("permission_denied", "messages", locale=locale), quote=True
)

View File

@@ -1,11 +1,10 @@
import logging
from pyrogram import filters
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import Message
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.utils import is_permitted
logger = logging.getLogger(__name__)
@@ -16,13 +15,10 @@ logger = logging.getLogger(__name__)
& filters.command(["timeout_join"], prefixes=["/"]) # type: ignore
)
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)
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
if not (await is_permitted(app, group, message=message)):
await message.reply_text(
app._("permission_denied", "messages", locale=locale), quote=True
)

View File

@@ -1,11 +1,10 @@
import logging
from pyrogram import filters
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import Message
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.utils import is_permitted
logger = logging.getLogger(__name__)
@@ -16,13 +15,10 @@ logger = logging.getLogger(__name__)
& filters.command(["timeout_verify"], prefixes=["/"]) # type: ignore
)
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)
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
if not (await is_permitted(app, group, message=message)):
await message.reply_text(
app._("permission_denied", "messages", locale=locale), quote=True
)

View File

@@ -4,7 +4,6 @@ from pyrogram import filters
from pyrogram.types import Message
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
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
async def handler_bot_join(app: PyroClient, message: Message):
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)

View File

@@ -12,8 +12,6 @@ from pyrogram.types import (
)
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from classes.pyrouser import PyroUser
from modules.database import col_schedule
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
)
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)
if (
@@ -64,7 +62,7 @@ async def handler_user_join(app: PyroClient, message: Message):
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:
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),
)
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}
)

View File

@@ -3,12 +3,11 @@ import logging
from pykeyboard import InlineButton, InlineKeyboard
from pyrogram import filters
from pyrogram.client import Client
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import CallbackQuery, Message
from classes.callbacks import CallbackLanguage
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
from modules.utils import is_permitted
logger = logging.getLogger(__name__)
@@ -17,27 +16,21 @@ logger = logging.getLogger(__name__)
~filters.scheduled & filters.group & filters.command(["language"], prefixes=["/"]) # type: ignore
)
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)
if (await app.get_chat_member(group.id, message.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
if not (await is_permitted(app, group, message=message)):
await message.reply_text(
app._("permission_denied", "messages", locale=locale), quote=True
)
return
keyboard = InlineKeyboard(row_width=2)
buttons = []
for language, data in app.in_every_locale("metadata").items():
if data["selectable"]:
buttons.append(
InlineButton(f"{data['flag']} {data['name']}", f"language:{language}")
)
buttons = [
InlineButton(f"{data['flag']} {data['name']}", f"language:{language}")
for language, data in app.in_every_locale("metadata").items()
if data["selectable"]
]
buttons.append(
InlineButton(
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
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)
if (await app.get_chat_member(group.id, callback.from_user.id)).status not in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]:
if not (await is_permitted(app, group, callback=callback)):
await callback.answer(
app._("wrong_user", "callbacks", locale=locale), show_alert=True
)

View File

@@ -1,9 +1,8 @@
black~=23.7.0
Pillow~=10.0.0
pykeyboard==0.1.5
async_pymongo==0.1.6
Pillow~=10.4.0
pykeyboard==0.1.7
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
async_pymongo==0.1.4
huepaper==0.0.4
libbot[speed,pyrogram]==2.0.1
huepaper==0.0.5
libbot[speed,pyrogram]==3.2.3