Skip to content

jet_monitor_phrases.rb

Example: monitor new posts for mentions of one or more words or phrases (e.g. anyone mentioning your name or the name of your company, project etc.).

This example uses a Jetstream (JSON) websocket.

rb
require 'didkit'
require 'skyfall'

$terms = ARGV.map(&:downcase)

if $terms.empty?
  puts "Usage: #{$PROGRAM_NAME} <word_or_phrase> [<word_or_phrase>...]"
  exit 1
end

# tell Jetstream to send us only post records
sky = Skyfall::Jetstream.new('jetstream2.us-east.bsky.network', {
  wanted_collections: [:bsky_post]
})

sky.on_message do |msg|
  # we're only interested in repo commit messages
  next if msg.type != :commit

  msg.operations.each do |op|
    # ignore any operations other than "create post"
    next unless op.action == :create && op.type == :bsky_post

    text = op.raw_record['text'].to_s.downcase

    if $terms.any? { |x| text.include?(x) }
      owner_handle = DID.new(op.repo).get_verified_handle
      puts "\n#{msg.time.getlocal} @#{owner_handle}: #{op.raw_record['text']}"
    end
  end
end

sky.on_connect { puts "Connected" }
sky.on_disconnect { puts "Disconnected" }
sky.on_reconnect { puts "Reconnecting..." }
sky.on_error { |e| puts "ERROR: #{e}" }

# close the connection cleanly on Ctrl+C
trap("SIGINT") { sky.disconnect }

sky.connect