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
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