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