#!/usr/bin/env python3 from mastodon import Mastodon import json import os import tempfile from subprocess import call from xdg import BaseDirectory # load JSON config file def load_config() -> dict: with open(f"{BaseDirectory.xdg_config_home}/tootgopher/config.json") as f: config_data = json.load(f) return config_data # create Mastodon object using stored API secrets # TODO: load config from $XDG_CONFIG_HOME def gen_masto_obj(config_data: dict) -> Mastodon: m = Mastodon( access_token = config_data['token'], api_base_url = config_data['instance'] ) return m # generate phlog URLs for linking in the post def gen_url(config_data: dict, phlog_file: str) -> dict: base_path = '' if phlog_file == '': base_path = f"{config_data['gopher']}" else: base_path = f"{config_data['gopher']}/{config_data['phlog_format']}/{phlog_file}" gopher_url = f"gopher://{base_path}" proxy_url = f"https://{config_data['proxy']}/{base_path}" urls = {'gopher':gopher_url, 'proxy':proxy_url} return urls # spawn $EDITOR or nano by default to edit the post text def edit_post(post: str) -> str: # Fetch OS editor EDITOR = os.environ.get('EDITOR', 'nano') # Temporary File tf_file = tempfile.NamedTemporaryFile(suffix = '.tmp', delete = False) # Paste in the sample post with links generated with open(tf_file.name, 'w') as tf: tf.write(post) # Spawn subprocess on a temporary file call([EDITOR, tf_file.name]) # Read the file for the final post with open(tf_file.name, 'r') as tf: post = tf.read() tf.close() # Delete the temp file os.unlink(tf_file.name) return post # display post contents and verify with the user def post_check(post: str, cw: str) -> bool: print('You are about to post') # If content warning is given if (cw != ''): print() print(f"CW: \"{cw}\"") print() print(post) print() will_continue = input('Continue? [y/N] ') print() return will_continue.upper() in ['Y', 'YES'] def main(): # load config.json # TODO: handle command line switches to override defaults config_data = load_config() m = gen_masto_obj(config_data) # generate URLs phlog_file = input('Post location (leave blank for root): ') urls = gen_url(config_data, phlog_file) # Read content warning cw = input('Content Warning? (Leave blank for none): ') # Edit post post = f"\n\nGopher: {urls['gopher']}\nHTML Proxy: {urls['proxy']}" post = edit_post(post) print() # Verify the post with the user and post it if post_check(post, cw): # Check if content warning is given if (cw == ''): toot_dict = m.status_post(post, visibility = config_data['visibility']) else: toot_dict = m.status_post(post, visibility = config_data['visibility'], spoiler_text = cw) print(f"Posted at {toot_dict['url']}") else: print('Aborted.') if __name__ == '__main__': main()