Toot toooooooot (Bluesky-Mastodon cross-poster)

logging in to bluesky

+2
Gemfile
··· 1 1 source 'https://rubygems.org' 2 2 3 + gem 'didkit', '~> 0.2' 3 4 gem 'mastodon-api', git: 'https://github.com/mastodon/mastodon-api.git' 5 + gem 'minisky', '~> 0.3' 4 6 5 7 gem 'io-console', '~> 0.5' 6 8 gem 'json', '~> 2.5'
+4
Gemfile.lock
··· 15 15 public_suffix (>= 2.0.2, < 6.0) 16 16 bigdecimal (3.1.7) 17 17 buftok (0.3.0) 18 + didkit (0.2.0) 18 19 domain_name (0.6.20240107) 19 20 ffi (1.16.3) 20 21 ffi-compiler (1.3.2) ··· 32 33 ffi-compiler (>= 1.0, < 2.0) 33 34 io-console (0.7.2) 34 35 json (2.7.1) 36 + minisky (0.3.1) 35 37 net-http (0.4.1) 36 38 uri 37 39 oj (3.16.3) ··· 46 48 ruby 47 49 48 50 DEPENDENCIES 51 + didkit (~> 0.2) 49 52 io-console (~> 0.5) 50 53 json (~> 2.5) 51 54 mastodon-api! 55 + minisky (~> 0.3) 52 56 net-http (~> 0.2) 53 57 uri (~> 0.13) 54 58 yaml (~> 0.1)
+20
app/bluesky_account.rb
··· 1 + require 'didkit' 2 + require_relative 'bluesky_client' 3 + 4 + class BlueskyAccount 5 + def login_with_password(handle, password) 6 + did = DID.resolve_handle(handle) 7 + if did.nil? 8 + puts "Error: couldn't resolve handle #{handle.inspect}" 9 + exit 1 10 + end 11 + 12 + pds = did.get_document.pds_endpoint.gsub('https://', '') 13 + 14 + sky = BlueskyClient.new 15 + sky.host = pds 16 + sky.user.id = handle 17 + sky.user.pass = password 18 + sky.log_in 19 + end 20 + end
+26
app/bluesky_client.rb
··· 1 + require 'minisky' 2 + require 'yaml' 3 + 4 + class BlueskyClient 5 + include Minisky::Requests 6 + 7 + CONFIG_FILE = File.expand_path(File.join(__dir__, '..', 'config', 'bluesky.yml')) 8 + 9 + attr_reader :config 10 + 11 + def initialize 12 + @config = File.exist?(CONFIG_FILE) ? YAML.load(File.read(CONFIG_FILE)) : {} 13 + end 14 + 15 + def host 16 + @config['host'] 17 + end 18 + 19 + def host=(h) 20 + @config['host'] = h 21 + end 22 + 23 + def save_config 24 + File.write(CONFIG_FILE, YAML.dump(@config)) 25 + end 26 + end
+11 -1
app/tootify.rb
··· 1 1 require 'io/console' 2 + 3 + require_relative 'bluesky_account' 2 4 require_relative 'mastodon_account' 3 5 4 6 class Tootify 5 7 def initialize 8 + @bluesky = BlueskyAccount.new 6 9 @mastodon = MastodonAccount.new 7 10 end 8 11 9 - def login_bluesky 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) 10 20 end 11 21 12 22 def login_mastodon(handle)