Improve logging and add rake task for monitoring user follows

- Enhanced logging format in scan_user_follows_job and monitor tasks using format_tags
- Added new rake task 'bluesky:watch_follows' to monitor users that a given user follows
- Improved log formatting consistency across Bluesky monitoring components
This commit is contained in:
Dylan Knutson
2025-08-15 21:55:18 +00:00
parent b6e2e5e502
commit 4d456ee73d
3 changed files with 128 additions and 61 deletions

View File

@@ -2,16 +2,40 @@
# frozen_string_literal: true
T.bind(self, T.all(Rake::DSL, Object))
module BlueskyRakeHelpers
extend T::Sig
sig { params(handle: String).returns(T.nilable(String)) }
def self.resolve_did(handle)
DIDKit::Resolver.new.resolve_handle(handle)&.did
end
sig { params(did: String).returns(T.nilable(String)) }
def self.resolve_handle(did)
DIDKit::Resolver.new.resolve_did(did).get_validated_handle
end
sig { returns(T.nilable(Domain::User::BlueskyUser)) }
def self.user_from_env
if (handle = ENV["handle"])
did = self.resolve_did(handle)
Domain::User::BlueskyUser.find_or_create_by!(did:) do |user|
user.handle = handle
end
elsif (did = ENV["did"])
Domain::User::BlueskyUser.find_or_create_by!(did:) do |user|
user.handle = resolve_handle(did)
end
end
end
end
namespace :bluesky do
desc "Start the Bluesky monitor"
task monitor: :environment do
Tasks::Bluesky::Monitor.new.run
end
def resolve_did(handle)
DIDKit::Resolver.new.resolve_handle(handle)&.did
end
desc "Add a DID or hashtag to the Bluesky monitor"
task add: :environment do
if (hashtag = ENV["hashtag"])
@@ -20,26 +44,10 @@ namespace :bluesky do
Domain::Bluesky::MonitoredObject.create!(value: hashtag, kind: :hashtag)
puts "Added hashtag: ##{hashtag}"
elsif (handle = ENV["handle"])
did = resolve_did(handle)
puts "resolved did: #{did}"
raise "did is required" if did.blank?
user =
Domain::User::BlueskyUser.find_or_create_by!(did:) do |user|
user.handle = handle
end
elsif (user = BlueskyRakeHelpers.user_from_env)
Domain::Bluesky::Job::ScanUserJob.perform_later(user:)
Domain::Bluesky::Job::ScanPostsJob.perform_later(user:)
Domain::Bluesky::MonitoredObject.create!(value: did, kind: :user_did)
elsif (did = ENV["did"])
raise "did is required" if did.blank?
user =
Domain::User::BlueskyUser.find_or_create_by!(did:) do |user|
user.handle = nil
end
Domain::Bluesky::Job::ScanUserJob.perform_later(user:)
Domain::Bluesky::Job::ScanPostsJob.perform_later(user:)
Domain::Bluesky::MonitoredObject.create!(value: did, kind: :user_did)
Domain::Bluesky::MonitoredObject.create!(value: user.did, kind: :user_did)
else
raise "hashtag, handle, or did is required"
end
@@ -57,7 +65,7 @@ namespace :bluesky do
)&.destroy!
puts "Removed hashtag: ##{hashtag}"
elsif (handle = ENV["handle"])
did = resolve_did(handle)
did = BlueskyRakeHelpers.resolve_did(handle)
puts "resolved did: #{did}"
raise "did is required" if did.blank?
@@ -76,4 +84,24 @@ namespace :bluesky do
raise "hashtag, handle, or did is required"
end
end
desc "Watch users that user follows"
task watch_follows: :environment do
user =
BlueskyRakeHelpers.user_from_env ||
raise("user is required, use `handle` or `did`")
Domain::Bluesky::Job::ScanUserFollowsJob.perform_now(user:)
user.reload
user.user_user_follows_from.each do |follow|
to_user = T.cast(follow.to, Domain::User::BlueskyUser)
model =
Domain::Bluesky::MonitoredObject.create(
value: to_user.did!,
kind: :user_did,
)
if model.persisted?
puts "added #{to_user.did} / #{to_user.handle} to monitor"
end
end
end
end