social media crossposting tool. 3rd time's the charm
mastodon misskey crossposting bluesky
1from dataclasses import dataclass 2from typing import Any, override 3 4from cross.service import OutputService 5from database.connection import DatabasePool 6from mastodon.info import InstanceInfo, MastodonService, validate_and_transform 7 8ALLOWED_POSTING_VISIBILITY: list[str] = ["public", "unlisted", "private"] 9 10 11@dataclass(kw_only=True) 12class MastodonOutputOptions: 13 token: str 14 instance: str 15 visibility: str = "public" 16 17 @classmethod 18 def from_dict(cls, data: dict[str, Any]) -> "MastodonOutputOptions": 19 validate_and_transform(data) 20 21 if "visibility" in data: 22 if data["visibility"] not in ALLOWED_POSTING_VISIBILITY: 23 raise ValueError(f"Invalid visibility option {data['visibility']}!") 24 25 return MastodonOutputOptions(**data) 26 27 28# TODO 29class MastodonOutputService(MastodonService, OutputService): 30 def __init__(self, db: DatabasePool, options: MastodonOutputOptions) -> None: 31 super().__init__(options.instance, db) 32 self.options: MastodonOutputOptions = options 33 34 self.log.info("Verifying %s credentails...", self.url) 35 responce = self.verify_credentials() 36 self.user_id: str = responce["id"] 37 38 self.log.info("Getting %s configuration...", self.url) 39 responce = self.fetch_instance_info() 40 self.instance_info: InstanceInfo = InstanceInfo.from_api(responce) 41 42 @override 43 def _get_token(self) -> str: 44 return self.options.token