This repository has been archived on 2025-11-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
dashboard/jobs/daily_xkcd.rb
2022-09-20 00:27:25 +01:00

68 lines
1.7 KiB
Ruby

require 'net/http'
require 'json'
require 'date'
XKCD_URI = 'https://xkcd.com'
DATE_FORMAT_STR = '%B %-d, %Y'
$displayed_xkcd = nil
$prev_displayed_xkcd = nil
# Get's the nth xkcd entry, unless
# nil is passed, in which case current
def get_nth_xkcd(n)
uri = URI.join(XKCD_URI, n.to_s + '/', 'info.0.json')
response = Net::HTTP.get(uri)
JSON.parse(response)
end
# Get's the current, featured xkcd entry
def get_current_xkcd
get_nth_xkcd(nil)
end
# Get's a random xkcd
def get_random_xkcd
curr_id = get_current_xkcd['num']
random_id = nil
# 404 is reserved for Not found
while true do
random_id = rand(curr_id)
break if random_id != 404
end
get_nth_xkcd(random_id)
end
# Check if provided xkcd was published yesterday
def published_yesterday_and_unseen(xkcd_date, xkcd)
xkcd_date == Date.today.prev_day and ($prev_displayed_xkcd.nil? or not $prev_displayed_xkcd['num'] == xkcd['num'])
end
# Basic logic:
# - if an xkcd was published today, display it.
# - if an xkcd was published yesterday, and we didn't
# show it yesterday, display it.
# - otherwise, display a random xkcd.
SCHEDULER.every '1d', :first_in => 0 do |job|
$prev_displayed_xkcd = $displayed_xkcd
xkcd = get_current_xkcd
xkcd_date = Date.new(
xkcd['year'].to_i,
xkcd['month'].to_i,
xkcd['day'].to_i
)
if xkcd_date == Date.today or published_yesterday_and_unseen(xkcd_date, xkcd)
$displayed_xkcd = xkcd
else
$displayed_xkcd = get_random_xkcd
xkcd_date = Date.new(
$displayed_xkcd['year'].to_i,
$displayed_xkcd['month'].to_i,
$displayed_xkcd['day'].to_i
)
end
$displayed_xkcd['datestr'] = xkcd_date.strftime(DATE_FORMAT_STR)
send_event('xkcd-of-the-day', $displayed_xkcd)
end