2022-12-10 16:53:57 +01:00

56 lines
2.0 KiB
Python

from pathlib import Path
from mastodon import Mastodon
from mastodon_toot_follower import path_util
class App:
def __init__(self,
name: str = 'MastodonTootFollower',
url: str = 'https://git.privacy1st.de/langfingaz/MastodonTootFollower',
config_dir: Path = None,
):
if len(name) <= 0:
raise ValueError(f'name is too short: {name}')
if config_dir is None:
config_dir = Path.home().joinpath('.' + name)
self.name = name
self.url = url
self.config_dir = config_dir
self.mastodon_dict: dict[str, Mastodon] = dict()
config_dir.mkdir(parents=True, exist_ok=True)
self._credential_dir().mkdir(parents=True, exist_ok=True)
self._toot_cache_dir().mkdir(parents=True, exist_ok=True)
def _get_mastodon(self, mastodon_instance: str) -> Mastodon:
if mastodon_instance not in self.mastodon_dict:
self._create_or_load_credentials(mastodon_instance)
# Create Mastdon API wrapper object.
self.mastodon_dict[mastodon_instance] = Mastodon(client_id=self._credential_file(mastodon_instance))
return self.mastodon_dict[mastodon_instance]
def _create_or_load_credentials(self, mastodon_instance: str) -> None:
cf = self._credential_file(mastodon_instance)
# Create application credentials only once and save them.
if cf.exists():
return
Mastodon.create_app(
client_name=self.name,
website=self.url,
api_base_url=mastodon_instance,
to_file=cf,
scopes=['read']
)
def _credential_file(self, mastodon_instance: str) -> Path:
return self._credential_dir().joinpath(path_util.escape(mastodon_instance))
def _credential_dir(self) -> Path:
return self.config_dir.joinpath('credentials')
def _toot_cache_dir(self) -> Path:
return self.config_dir.joinpath('toots')