Toot toooooooot (Bluesky-Mastodon cross-poster)
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