A tool for measuring the coverage of Bluesky/ATProto relays
1#!/usr/bin/env ruby
2
3require 'bundler/setup'
4require 'sinatra'
5require 'yaml'
6
7require 'thin' if $PROGRAM_NAME == __FILE__
8
9require_relative 'init'
10require_relative 'report'
11
12$config = YAML.load(File.read(SOURCES))
13$owners = ($config['relays'] + $config['jetstreams']).map { |x| x.is_a?(Hash) ? [x['host'], x] : [x, nil] }.then { Hash[it] }
14
15helpers do
16 def format_num(n)
17 n.to_s.reverse.gsub(/(\d\d\d(?!$))/, "\\1,").reverse
18 end
19
20 def owner_link(report)
21 if data = $owners[report.host]
22 if data['owner'] && data['owner_link']
23 %(<a href="#{data['owner_link']}" target="_blank">#{data['owner']}</a>)
24 elsif data['owner'].to_s.start_with?('@')
25 %(<a href="https://bsky.app/profile/#{data['owner'].gsub(/^@/, '')}" target="_blank">#{data['owner']}</a>)
26 elsif data['owner']
27 data['owner']
28 else
29 nil
30 end
31 end
32 end
33end
34
35get '/' do
36 @last_test = Report.maximum(:start_time)
37
38 if @last_test
39 @reports = Report.where(start_time: @last_test).order('users DESC, connected DESC').to_a
40 @max_users = @reports.first.users
41 end
42
43 erb :index
44end