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