65 lines
1.8 KiB
Ruby
Executable file
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
|