Toot toooooooot (Bluesky-Mastodon cross-poster)
at master 2.3 kB view raw
1require 'yaml' 2require_relative 'mastodon_api' 3 4class MastodonAccount 5 APP_NAME = "Tootify" 6 CONFIG_FILE = File.expand_path(File.join(__dir__, '..', 'config', 'mastodon.yml')) 7 8 OAUTH_SCOPES = [ 9 'read:accounts', 10 'read:statuses', 11 'read:search', 12 'write:media', 13 'write:statuses' 14 ].join(' ') 15 16 def initialize 17 @config = File.exist?(CONFIG_FILE) ? YAML.load(File.read(CONFIG_FILE)) : {} 18 end 19 20 def max_alt_length 21 1500 22 end 23 24 def save_config 25 File.write(CONFIG_FILE, YAML.dump(@config)) 26 end 27 28 def oauth_login(handle) 29 instance = handle.split('@').last 30 app_response = register_oauth_app(instance) 31 32 api = MastodonAPI.new(instance) 33 34 login_url = api.generate_oauth_login_url(app_response['client_id'], OAUTH_SCOPES) 35 36 puts "Open this URL in your web browser and authorize the app:" 37 puts 38 puts login_url 39 puts 40 puts "Then, enter the received code here:" 41 puts 42 43 print ">> " 44 code = STDIN.gets.chomp 45 46 json = api.complete_oauth_login(app_response['client_id'], app_response['client_secret'], code) 47 48 api.access_token = json['access_token'] 49 info = api.account_info 50 51 @config['handle'] = handle 52 @config['access_token'] = api.access_token 53 @config['user_id'] = info['id'] 54 save_config 55 end 56 57 def register_oauth_app(instance) 58 api = MastodonAPI.new(instance) 59 api.register_oauth_app(APP_NAME, OAUTH_SCOPES) 60 end 61 62 def instance_info 63 instance = @config['handle'].split('@').last 64 api = MastodonAPI.new(instance, @config['access_token']) 65 api.instance_info 66 end 67 68 def post_status(text, media_ids: nil, parent_id: nil, quoted_status_id: nil) 69 instance = @config['handle'].split('@').last 70 api = MastodonAPI.new(instance, @config['access_token']) 71 api.post_status(text, media_ids: media_ids, parent_id: parent_id, quoted_status_id: quoted_status_id) 72 end 73 74 def upload_media(data, filename, content_type, alt = nil) 75 instance = @config['handle'].split('@').last 76 api = MastodonAPI.new(instance, @config['access_token']) 77 api.upload_media(data, filename, content_type, alt) 78 end 79 80 def search_post_by_url(url) 81 instance = @config['handle'].split('@').last 82 api = MastodonAPI.new(instance, @config['access_token']) 83 api.search_post_by_url(url) 84 end 85end