from __future__ import annotations from dataclasses import dataclass, field from yuxi.channels.adapters.slack.credentials import SlackCredentials from yuxi.channels.adapters.slack.models import ResolvedSlackAccount DEFAULT_ACCOUNT_ID = "default" @dataclass class SlackAccountRegistry: accounts: dict[str, ResolvedSlackAccount] = field(default_factory=dict) default_account_id: str = DEFAULT_ACCOUNT_ID def register( self, account_id: str, credentials: SlackCredentials, **kwargs, ) -> ResolvedSlackAccount: account = ResolvedSlackAccount( account_id=account_id, bot_token=credentials.bot_token, app_token=credentials.app_token, user_token=credentials.user_token, bot_token_source=credentials.bot_token_source, app_token_source=credentials.app_token_source, user_token_source=credentials.user_token_source, signing_secret=credentials.signing_secret, **kwargs, ) self.accounts[account_id] = account return account def get(self, account_id: str | None = None) -> ResolvedSlackAccount | None: target = account_id or self.default_account_id return self.accounts.get(target) def list_account_ids(self) -> list[str]: return sorted(self.accounts.keys()) def remove(self, account_id: str) -> bool: if account_id in self.accounts: del self.accounts[account_id] return True return False @property def count(self) -> int: return len(self.accounts)