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