from ..config import ConfigUnit from typing import Optional, Union from abc import ABC from enum import Enum class TelegramUserListType(Enum): USERS = 'users' NOTIFY = 'notify_users' class TelegramUserIdsConfig(ConfigUnit): NAME = 'telegram_user_ids' @classmethod def schema(cls) -> Optional[dict]: return { 'roottype': 'dict', 'type': 'integer' } _user_ids_config = TelegramUserIdsConfig() def _user_id_mapper(user: Union[str, int]) -> int: if isinstance(user, int): return user return _user_ids_config[user] class TelegramChatsConfig(ConfigUnit): NAME = 'telegram_chats' @classmethod def schema(cls) -> Optional[dict]: return { 'type': 'dict', 'schema': { 'id': {'type': 'string', 'required': True}, 'token': {'type': 'string', 'required': True}, } } class TelegramBotConfig(ConfigUnit, ABC): @classmethod def schema(cls) -> Optional[dict]: return { 'bot': { 'type': 'dict', 'schema': { 'token': {'type': 'string', 'required': True}, TelegramUserListType.USERS.value: {**TelegramBotConfig._userlist_schema(), 'required': True}, TelegramUserListType.NOTIFY.value: TelegramBotConfig._userlist_schema(), } } } @staticmethod def _userlist_schema() -> dict: return {'type': 'list', 'schema': {'type': ['string', 'integer']}} @staticmethod def custom_validator(data): for ult in TelegramUserListType: users = data['bot'][ult.value] for user in users: if isinstance(user, str): if user not in _user_ids_config: raise ValueError(f'user {user} not found in {TelegramUserIdsConfig.NAME}') def get_user_ids(self, ult: TelegramUserListType = TelegramUserListType.USERS) -> list[int]: try: return list(map(_user_id_mapper, self['bot'][ult.value])) except KeyError: return []