1
0
Fork 0
advent-of-code-2024/download-problems
2024-12-10 19:47:10 -05:00

65 lines
1.8 KiB
Ruby
Executable file

#!/usr/bin/env ruby
require "fileutils"
require "html2markdown"
require "nokogiri"
require "watir"
require "debug"
browser = Watir::Browser.new(:chrome, headless: true)
def login(browser)
browser.goto("https://adventofcode.com/auth/github")
browser.text_field(name: "login").set(ENV.fetch("GITHUB_USERNAME"))
browser.text_field(name: "password").set(ENV.fetch("GITHUB_PASSWORD"))
browser.button(name: "commit").click
code = browser.text.scan(/Enter the digits shown below to verify your identity.\n(\d+)/)
if browser.url.include?("two-factor")
puts "Complete 2FA on phone. Code: #{code}"
Watir::Wait.until(timeout: 120) do
!browser.url.include?("two-factor")
end
end
if browser.button(name: "authorize").exists?
browser.button(name: "authorize").click
end
final_url = browser.url
browser.goto(final_url)
session_cookies = browser.cookies.to_a
File.write("tmp/cookies.json", session_cookies.to_json)
browser.close
end
local = Dir
.entries(".")
.select { File.directory?(_1) && !_1.match?(/^\./) }
browser.goto("https://adventofcode.com/")
cookies = JSON.parse(File.read("tmp/cookies.json"))
cookies.each { browser.cookies.add(_1["name"], _1["value"], domain: _1["domain"]) }
pre_element = browser.element(tag_name: "pre", class: "calendar")
doc = Nokogiri::HTML(pre_element.html)
links = doc.css("a").map { _1["href"] }
available = links.map { _1.scan(/day\/(\d+)/) }.flatten.map { "%02d" % _1 }
missing = available - local
if missing.any?
missing.each do |problem|
Dir.mkdir(problem)
browser.goto("https://adventofcode.com/2024/day/#{problem}/input")
File.write("#{problem}/input", browser.text)
FileUtils.copy("./template.rb", "./#{problem}/main.rb")
end
else
puts "All problems are currently local"
end