Toot toooooooot (Bluesky-Mastodon cross-poster)
1require 'mastodon' 2require 'yaml' 3 4require_relative 'mastodon_api' 5 6class MastodonAccount 7 APP_NAME = "tootify" 8 CONFIG_FILE = File.expand_path(File.join(__dir__, '..', 'config', 'mastodon.yml')) 9 OAUTH_SCOPES = 'read:accounts read:statuses write:media write:statuses' 10 11 def initialize 12 @config = File.exist?(CONFIG_FILE) ? YAML.load(File.read(CONFIG_FILE)) : {} 13 end 14 15 def save_config 16 File.write(CONFIG_FILE, YAML.dump(@config)) 17 end 18 19 def oauth_login(handle, email, password) 20 instance = handle.split('@').last 21 app_response = register_oauth_app(instance, OAUTH_SCOPES) 22 23 api = MastodonAPI.new(instance) 24 25 json = api.oauth_login_with_password( 26 app_response.client_id, 27 app_response.client_secret, 28 email, password, OAUTH_SCOPES 29 ) 30 31 api.access_token = json['access_token'] 32 info = api.account_info 33 34 @config['handle'] = handle 35 @config['access_token'] = api.access_token 36 @config['user_id'] = info['id'] 37 save_config 38 end 39 40 def register_oauth_app(instance, scopes) 41 client = Mastodon::REST::Client.new(base_url: "https://#{instance}") 42 client.create_app(APP_NAME, 'urn:ietf:wg:oauth:2.0:oob', scopes) 43 end 44end