Template of a custom feed generator service for the Bluesky network in Ruby
at 0.1 1.5 kB view raw
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 26desc "Print posts in the feed, starting from the newest ones (limit = N)" 27task :print_feed do 28 feed = get_feed 29 limit = ENV['N'] ? ENV['N'].to_i : 100 30 31 posts = FeedPost.where(feed_id: feed.feed_id).joins(:post).order('feed_posts.time DESC').limit(limit).map(&:post) 32 33 posts.each do |s| 34 puts "#{s.time} * https://bsky.app/profile/#{s.repo}/post/#{s.rkey}" 35 puts s.text 36 puts 37 end 38end 39 40desc "Rescan all posts and rebuild the feed from scratch" 41task :rebuild_feed do 42 feed = get_feed 43 44 puts "Cleaning up feed..." 45 FeedPost.where(feed_id: feed.feed_id).delete_all 46 47 total = Post.count 48 49 puts "Loading posts..." 50 posts = Post.all.to_a 51 52 posts.each_with_index do |post, i| 53 print "Processing posts... [#{i + 1}/#{total}]\r" 54 $stdout.flush 55 56 if feed.post_matches?(post) 57 FeedPost.create!(feed_id: feed.feed_id, post: post, time: post.time) 58 end 59 end 60 61 puts "Processing posts... Done." + " " * 30 62end