Toot toooooooot (Bluesky-Mastodon cross-poster)
1require 'io/console'
2
3require_relative 'bluesky_account'
4require_relative 'mastodon_account'
5
6class Tootify
7 def initialize
8 @bluesky = BlueskyAccount.new
9 @mastodon = MastodonAccount.new
10 end
11
12 def login_bluesky(handle)
13 handle = handle.gsub(/^@/, '')
14
15 print "App password: "
16 password = STDIN.noecho(&:gets).chomp
17 puts
18
19 @bluesky.login_with_password(handle, password)
20 end
21
22 def login_mastodon(handle)
23 print "Email: "
24 email = STDIN.gets.chomp
25
26 print "Password: "
27 password = STDIN.noecho(&:gets).chomp
28 puts
29
30 @mastodon.oauth_login(handle, email, password)
31 end
32
33 def sync
34 likes = @bluesky.fetch_likes
35
36 likes.each do |r|
37 like_uri = r['uri']
38 post_uri = r['value']['subject']['uri']
39 repo, collection, rkey = post_uri.split('/')[2..4]
40
41 next unless repo == @bluesky.did && collection == 'app.bsky.feed.post'
42
43 begin
44 record = @bluesky.fetch_record(repo, collection, rkey)
45 rescue Minisky::ClientErrorResponse => e
46 puts "Record not found: #{post_uri}"
47 @bluesky.delete_record_at(like_uri)
48 next
49 end
50
51 post_to_mastodon(record['value'])
52
53 @bluesky.delete_record_at(like_uri)
54 end
55 end
56
57 def post_to_mastodon(record)
58 p record
59 p @mastodon.post_status(record['text'])
60 end
61end