Template of a custom feed generator service for the Bluesky network in Ruby

use didkit to convert handle<->DID

+1
Gemfile
··· 2 2 3 3 gem 'blue_factory', '~> 0.1.5' 4 4 gem 'skyfall', '~> 0.5' 5 + gem 'didkit', '~> 0.2' 5 6 6 7 gem 'activerecord', '~> 8.0' 7 8 gem 'sinatra-activerecord', '~> 2.0'
+2
Gemfile.lock
··· 40 40 debug (1.10.0) 41 41 irb (~> 1.10) 42 42 reline (>= 0.3.8) 43 + didkit (0.2.3) 43 44 drb (2.2.1) 44 45 eventmachine (1.2.7) 45 46 faye-websocket (0.11.3) ··· 123 124 blue_factory (~> 0.1.5) 124 125 capistrano (~> 2.0) 125 126 debug 127 + didkit (~> 0.2) 126 128 irb 127 129 ostruct 128 130 rainbow
+3
app/firehose_stream.rb
··· 6 6 require_relative 'models/feed_post' 7 7 require_relative 'models/post' 8 8 require_relative 'models/subscription' 9 + require_relative 'utils' 9 10 10 11 class FirehoseStream 11 12 attr_accessor :start_cursor, :show_progress, :log_status, :log_posts, :save_posts, :replay_events 12 13 13 14 DEFAULT_JETSTREAM = 'jetstream2.us-east.bsky.network' 14 15 POSTS_BATCH_SIZE = 100 16 + 17 + include Utils 15 18 16 19 def initialize(service = nil) 17 20 @env = (ENV['APP_ENV'] || ENV['RACK_ENV'] || :development).to_sym
+3 -8
app/utils.rb
··· 1 - require 'json' 2 - require 'open-uri' 1 + require 'didkit' 3 2 4 3 module Utils 5 4 def handle_from_did(did) 6 - url = "https://plc.directory/#{did}" 7 - json = JSON.parse(URI.open(url).read) 8 - json['alsoKnownAs'][0].gsub('at://', '') 5 + DID.new(did).get_validated_handle 9 6 end 10 7 11 8 def did_from_handle(handle) 12 - url = "https://bsky.social/xrpc/com.atproto.identity.resolveHandle?handle=#{handle}" 13 - json = JSON.parse(URI.open(url).read) 14 - json['did'] 9 + DID.resolve_handle(handle).did 15 10 end 16 11 17 12 extend self