Template of a custom feed generator service for the Bluesky network in Ruby
1require 'bundler/setup' 2 3require 'blue_factory/rake' 4require 'sinatra/activerecord' 5require 'sinatra/activerecord/rake' 6 7require_relative 'app/config' 8 9def get_feed 10 if ENV['KEY'].to_s == '' 11 puts "Please specify feed key as KEY=feedname (the part of the feed's at:// URI after the last slash)" 12 exit 1 13 end 14 15 feed_key = ENV['KEY'] 16 feed = BlueFactory.get_feed(feed_key) 17 18 if feed.nil? 19 puts "No feed configured for key '#{feed_key}' - use `BlueFactory.add_feed '#{feed_key}', MyFeed.new`" 20 exit 1 21 end 22 23 feed 24end 25 26task :print_feed do 27 feed = get_feed 28 limit = ENV['N'] ? ENV['N'].to_i : 100 29 30 posts = FeedPost.where(feed_id: feed.feed_id).joins(:post).order('feed_posts.time DESC').limit(limit).map(&:post) 31 32 posts.each do |s| 33 puts "#{s.time} * https://bsky.app/profile/#{s.repo}/post/#{s.rkey}" 34 puts s.text 35 puts 36 end 37end 38 39task :rebuild_feed do 40 feed = get_feed 41 42 puts "Cleaning up feed..." 43 FeedPost.where(feed_id: feed.feed_id).delete_all 44 45 total = Post.count 46 47 puts "Loading posts..." 48 posts = Post.all.to_a 49 50 posts.each_with_index do |post, i| 51 print "Processing posts... [#{i + 1}/#{total}]\r" 52 $stdout.flush 53 54 if feed.post_matches?(post) 55 FeedPost.create!(feed_id: feed.feed_id, post: post, time: post.time) 56 end 57 end 58 59 puts "Processing posts... Done." + " " * 30 60end