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