2020-05-17 14:14:55 +02:00
|
|
|
import os
|
|
|
|
import sys
|
2023-01-05 00:01:36 +01:00
|
|
|
from datetime import datetime
|
|
|
|
import pytz
|
|
|
|
from mastodon import Mastodon
|
|
|
|
from mastodon.Mastodon import MastodonMalformedEventError, MastodonNetworkError, MastodonReadTimeout, MastodonAPIError, MastodonIllegalArgumentError
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
class Setup():
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
name = 'fediverse setup'
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
def __init__(self, config_file=None, mastodon_hostname=None, peers_api=None, user_agent=None, secrets_filepath=None, mastodon_app_token=None):
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
self.config_file = "config/config.txt"
|
|
|
|
self.mastodon_hostname = self.__get_parameter("mastodon_hostname", self.config_file)
|
|
|
|
self.peers_api = '/api/v1/instance/peers?'
|
|
|
|
self.user_agent = {'User-agent': "fediverse's stats (fediverse@mastodont.cat)"}
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
self.secrets_filepath = 'secrets/secrets.txt'
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
is_setup = self.__check_mastodon_setup(self)
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
if is_setup:
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
self.mastodon_app_token = self.__get_mastodon_parameter("mastodon_app_token", self.secrets_filepath)
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
else:
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
self.mastodon_app_token = self.mastodon_setup(self)
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
@staticmethod
|
|
|
|
def __check_mastodon_setup(self):
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
is_setup = False
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
if not os.path.isfile(self.secrets_filepath):
|
|
|
|
print(f"File {self.secrets_filepath} not found, running setup.")
|
|
|
|
else:
|
|
|
|
is_setup = True
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
return is_setup
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
@staticmethod
|
|
|
|
def mastodon_setup(self):
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
if not os.path.exists('secrets'):
|
|
|
|
os.makedirs('secrets')
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
self.mastodon_user = input("Mastodon user login? ")
|
|
|
|
self.mastodon_password = input("Mastodon user password? ")
|
|
|
|
self.app_name = 'fediverse'
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
self.mastodon_app_token = self.mastodon_log_in()
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
if not os.path.exists(self.secrets_filepath):
|
|
|
|
with open(self.secrets_filepath, 'w'): pass
|
|
|
|
print(f"{self.secrets_filepath} created!")
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
with open(self.secrets_filepath, 'a') as the_file:
|
|
|
|
print("Writing Mastodon parameters to " + self.secrets_filepath)
|
|
|
|
the_file.write(f'mastodon_app_token: {self.mastodon_app_token}')
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
return self.mastodon_app_token
|
2020-05-17 14:14:55 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
def mastodon_log_in(self):
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
token = ''
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
try:
|
2021-10-26 13:38:12 +02:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
response = Mastodon.create_app(
|
|
|
|
self.app_name,
|
|
|
|
scopes=["read","write"],
|
|
|
|
to_file=None,
|
|
|
|
api_base_url=self.mastodon_hostname
|
|
|
|
)
|
|
|
|
client_id = response[0]
|
|
|
|
client_secret = response[1]
|
|
|
|
|
|
|
|
mastodon = Mastodon(client_id = client_id, client_secret = client_secret, api_base_url = self.mastodon_hostname)
|
2023-01-08 18:57:35 +01:00
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
token = mastodon.log_in(
|
|
|
|
self.mastodon_user,
|
|
|
|
self.mastodon_password,
|
|
|
|
scopes = ["read", "write"],
|
|
|
|
to_file = None
|
2021-10-26 13:38:12 +02:00
|
|
|
)
|
|
|
|
|
2023-01-05 00:01:36 +01:00
|
|
|
print('Log in succesful!')
|
|
|
|
|
|
|
|
except MastodonIllegalArgumentError as i_error:
|
|
|
|
|
|
|
|
sys.stdout.write(f'\n{str(i_error)}\n')
|
|
|
|
|
|
|
|
except MastodonNetworkError as n_error:
|
|
|
|
|
|
|
|
sys.stdout.write(f'\n{str(n_error)}\n')
|
|
|
|
|
|
|
|
except MastodonReadTimeout as r_error:
|
|
|
|
|
|
|
|
sys.stdout.write(f'\n{str(r_error)}\n')
|
|
|
|
|
|
|
|
except MastodonAPIError as a_error:
|
|
|
|
|
|
|
|
sys.stdout.write(f'\n{str(a_error)}\n')
|
|
|
|
|
|
|
|
finally:
|
|
|
|
|
|
|
|
return token
|
|
|
|
|
|
|
|
def __get_parameter(self, parameter, config_file):
|
|
|
|
|
|
|
|
if not os.path.isfile(config_file):
|
|
|
|
print(f"File {config_file} not found..")
|
|
|
|
|
|
|
|
self.mastodon_hostname = input("\nMastodon hostname: ")
|
|
|
|
|
|
|
|
self.__create_config(self)
|
|
|
|
self.__write_config(self)
|
|
|
|
|
|
|
|
with open( self.config_file ) as f:
|
|
|
|
for line in f:
|
|
|
|
if line.startswith( parameter ):
|
|
|
|
return line.replace(parameter + ":", "").strip()
|
|
|
|
|
|
|
|
def __get_mastodon_parameter(self, parameter, secrets_filepath):
|
|
|
|
|
|
|
|
if not os.path.isfile(secrets_filepath):
|
|
|
|
print(f"File {secrets_filepath} not found..")
|
|
|
|
|
|
|
|
self.sign_in()
|
|
|
|
|
|
|
|
with open( self.secrets_filepath ) as f:
|
|
|
|
for line in f:
|
|
|
|
if line.startswith( parameter ):
|
|
|
|
return line.replace(parameter + ":", "").strip()
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def __create_config(self):
|
|
|
|
|
|
|
|
if not os.path.exists('config'):
|
|
|
|
|
|
|
|
os.makedirs('config')
|
|
|
|
|
|
|
|
if not os.path.exists(self.config_file):
|
|
|
|
|
|
|
|
print(self.config_file + " created!")
|
|
|
|
with open(self.config_file, 'w'): pass
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def __write_config(self):
|
|
|
|
|
|
|
|
with open(self.config_file, 'a') as the_file:
|
|
|
|
|
|
|
|
the_file.write(f'mastodon_hostname: {self.mastodon_hostname}')
|
|
|
|
print(f"adding parameters to {self.config_file}\n")
|