- 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
108 lines
3.1 KiB
Ruby
108 lines
3.1 KiB
Ruby
# typed: true
|
|
# 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
|
|
|
|
desc "Add a DID or hashtag to the Bluesky monitor"
|
|
task add: :environment do
|
|
if (hashtag = ENV["hashtag"])
|
|
# Remove # if provided
|
|
hashtag = hashtag.gsub(/^#/, "")
|
|
|
|
Domain::Bluesky::MonitoredObject.create!(value: hashtag, kind: :hashtag)
|
|
puts "Added hashtag: ##{hashtag}"
|
|
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: user.did, kind: :user_did)
|
|
else
|
|
raise "hashtag, handle, or did is required"
|
|
end
|
|
end
|
|
|
|
desc "Remove a DID or hashtag from the Bluesky monitor"
|
|
task remove: :environment do
|
|
if (hashtag = ENV["hashtag"])
|
|
# Remove # if provided
|
|
hashtag = hashtag.gsub(/^#/, "")
|
|
|
|
Domain::Bluesky::MonitoredObject.find_by(
|
|
value: hashtag,
|
|
kind: :hashtag,
|
|
)&.destroy!
|
|
puts "Removed hashtag: ##{hashtag}"
|
|
elsif (handle = ENV["handle"])
|
|
did = BlueskyRakeHelpers.resolve_did(handle)
|
|
puts "resolved did: #{did}"
|
|
raise "did is required" if did.blank?
|
|
|
|
Domain::Bluesky::MonitoredObject.find_by(
|
|
value: did,
|
|
kind: :user_did,
|
|
)&.destroy!
|
|
elsif (did = ENV["did"])
|
|
raise "did is required" if did.blank?
|
|
|
|
Domain::Bluesky::MonitoredObject.find_by(
|
|
value: did,
|
|
kind: :user_did,
|
|
)&.destroy!
|
|
else
|
|
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
|