from dataclasses import dataclass from typing import Any, override from cross.service import OutputService from database.connection import DatabasePool from mastodon.info import InstanceInfo, MastodonService, validate_and_transform ALLOWED_POSTING_VISIBILITY: list[str] = ["public", "unlisted", "private"] @dataclass(kw_only=True) class MastodonOutputOptions: token: str instance: str visibility: str = "public" @classmethod def from_dict(cls, data: dict[str, Any]) -> "MastodonOutputOptions": validate_and_transform(data) if "visibility" in data: if data["visibility"] not in ALLOWED_POSTING_VISIBILITY: raise ValueError(f"Invalid visibility option {data['visibility']}!") return MastodonOutputOptions(**data) # TODO class MastodonOutputService(MastodonService, OutputService): def __init__(self, db: DatabasePool, options: MastodonOutputOptions) -> None: super().__init__(options.instance, db) self.options: MastodonOutputOptions = options self.log.info("Verifying %s credentails...", self.url) responce = self.verify_credentials() self.user_id: str = responce["id"] self.log.info("Getting %s configuration...", self.url) responce = self.fetch_instance_info() self.instance_info: InstanceInfo = InstanceInfo.from_api(responce) @override def _get_token(self) -> str: return self.options.token