Improved locales, added /language

This commit is contained in:
2023-08-11 15:04:21 +02:00
parent 07963d705c
commit 370bcd0653
17 changed files with 465 additions and 104 deletions

52
classes/callbacks.py Normal file
View File

@@ -0,0 +1,52 @@
from dataclasses import dataclass
from pyrogram.types import CallbackQuery
@dataclass
class CallbackVerify:
user_id: int
@classmethod
def from_callback(cls, callback: CallbackQuery):
action, user_id = str(callback.data).split(";")
if action.lower() != "verify":
raise ValueError("Callback provided is not a verification callback")
return cls(int(user_id))
@dataclass
class CallbackEmoji:
user_id: int
emoji: str
@classmethod
def from_callback(cls, callback: CallbackQuery):
action, user_id, emoji = str(callback.data).split(";")
if action.lower() != "emoji":
raise ValueError("Callback provided is not an emoji button callback")
return cls(int(user_id), emoji)
@dataclass
class CallbackBan:
user_id: int
@classmethod
def from_callback(cls, callback: CallbackQuery):
action, user_id = str(callback.data).split(";")
if action.lower() != "ban":
raise ValueError("Callback provided is not a ban callback")
return cls(int(user_id))
@dataclass
class CallbackLanguage:
language: str
@classmethod
def from_callback(cls, callback: CallbackQuery):
action, language = str(callback.data).split(";")
if action.lower() != "language":
raise ValueError("Callback provided is not a language callback")
return cls(language)

View File

@@ -18,7 +18,7 @@ class PyroClient(PyroClient):
### Returns:
* `PyroUser`: PyroUser object
"""
db_record = col_users.find_one(
db_record = await col_users.find_one(
{"id": user.id if isinstance(user, User) else user, "group": group}
)

72
classes/pyrogroup.py Normal file
View File

@@ -0,0 +1,72 @@
import logging
from dataclasses import dataclass
from typing import Union
from bson import ObjectId
from pyrogram.types import User
from classes.pyroclient import PyroClient
from modules.database import col_groups
logger = logging.getLogger(__name__)
@dataclass
class PyroGroup:
"""Dataclass of DB entry of a group"""
__slots__ = ("_id", "id", "locale", "locale_auto")
_id: ObjectId
id: int
locale: Union[str, None]
locale_auto: bool
@classmethod
async def create_if_not_exists(
cls,
id: int,
locale: Union[str, None] = None,
locale_auto: bool = True,
):
db_entry = await col_groups.find_one(
{
"id": id,
}
)
if db_entry is None:
inserted = await col_groups.insert_one(
{"id": id, "locale": locale, "locale_auto": locale_auto}
)
db_entry = {
"_id": inserted.inserted_id,
"id": id,
"locale": locale,
"locale_auto": locale_auto,
}
return cls(**db_entry)
async def set_locale(self, locale: Union[str, None]) -> None:
logger.debug("Locale of group %s has been set to %s", self.id, locale)
await col_groups.update_one({"_id": self._id}, {"$set": {"locale": locale}})
async def set_locale_auto(self, enabled: bool) -> None:
logger.debug(
"Automatic locale selection of group %s has been set to %s",
self.id,
enabled,
)
await col_groups.update_one(
{"_id": self._id}, {"$set": {"locale_auto": enabled}}
)
# Group settings
# User locale
def select_locale(
self, app: PyroClient, user: Union[User, None] = None, ignore_auto: bool = False
) -> str:
if not ignore_auto and self.locale_auto is True:
if user.language_code is not None:
return user.language_code
return self.locale if self.locale is not None else app.default_locale
return self.locale if self.locale is not None else app.default_locale

View File

@@ -34,7 +34,7 @@ class PyroUser:
mistakes: int
@classmethod
def create_if_not_exists(
async def create_if_not_exists(
cls,
id: int,
group: int,
@@ -44,9 +44,9 @@ class PyroUser:
score: int = 0,
mistakes: int = 0,
):
db_entry = col_users.find_one({"id": id, "group": group})
db_entry = await col_users.find_one({"id": id, "group": group})
if db_entry is None:
inserted = col_users.insert_one(
inserted = await col_users.insert_one(
{
"id": id,
"group": group,
@@ -69,36 +69,36 @@ class PyroUser:
}
return cls(**db_entry)
def set_failed(self, failed: bool = True) -> None:
async def set_failed(self, failed: bool = True) -> None:
logger.debug("%s's failure state has been set to %s", self.id, failed)
col_users.update_one({"_id": self._id}, {"$set": {"failed": failed}})
await col_users.update_one({"_id": self._id}, {"$set": {"failed": failed}})
def set_emojis(self, emojis: List[str]) -> None:
async def set_emojis(self, emojis: List[str]) -> None:
logger.debug("%s's emojis have been set to %s", self.id, emojis)
col_users.update_one({"_id": self._id}, {"$set": {"emojis": emojis}})
await col_users.update_one({"_id": self._id}, {"$set": {"emojis": emojis}})
def set_score(self, score: int = 0) -> None:
async def set_score(self, score: int = 0) -> None:
logger.debug("%s's score has been set to %s", self.id, score)
col_users.update_one({"_id": self._id}, {"$set": {"score": score}})
await col_users.update_one({"_id": self._id}, {"$set": {"score": score}})
def set_mistakes(self, mistakes: int = 0) -> None:
async def set_mistakes(self, mistakes: int = 0) -> None:
logger.debug("%s's mistakes count has been set to %s", self.id, mistakes)
col_users.update_one({"_id": self._id}, {"$set": {"mistakes": mistakes}})
await col_users.update_one({"_id": self._id}, {"$set": {"mistakes": mistakes}})
def update_score(self, points: int = 1) -> None:
async def update_score(self, points: int = 1) -> None:
logger.debug("%s point(s) have been added to %s score", points, self.id)
col_users.update_one(
await col_users.update_one(
{"_id": self._id}, {"$set": {"score": self.score + points}}
)
def update_mistakes(self, points: int = 1) -> None:
async def update_mistakes(self, points: int = 1) -> None:
logger.debug("%s point(s) have been added to %s mistakes", points, self.id)
col_users.update_one(
await col_users.update_one(
{"_id": self._id}, {"$set": {"mistakes": self.mistakes + points}}
)
def update_selected(self, entry: str) -> None:
async def update_selected(self, entry: str) -> None:
logger.debug("Emoji %s has been added to %s's selection list", entry, self.id)
col_users.update_one(
await col_users.update_one(
{"_id": self._id}, {"$set": {"selected": self.selected + [entry]}}
)