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