Code for the Advent of Code event
aoc advent-of-code
at main 67 lines 1.9 kB view raw
1#!/usr/bin/env ruby 2# frozen_string_literal: true 3 4require 'bundler/setup' 5 6require 'cgi' 7require 'date' 8require 'fileutils' 9require 'net/http' 10require 'optparse' 11 12require 'aoc' 13 14options = {} 15 16begin 17 OptionParser.new do |opts| 18 opts.banner = "Usage: #{__FILE__} [options]" 19 opts.on('-v', '--[no-]verbose', 'Verbose output') 20 opts.on('--[no-]dry-run', 'Perform a dry run') 21 opts.on('-yYEAR', '--year=YEAR', Integer, 'Year') 22 opts.on('-dDAY', '--day=DAY', Integer, 'Day') 23 opts.on('-sSESSION', '--session=SESSION', 'Session ID') 24 end.parse! into: options 25rescue OptionParser::MissingArgument => e 26 abort e.message 27end 28 29now = DateTime.now 30verbose = options[:verbose] 31dry_run = options[:'dry-run'] 32year = options[:year] || now.year 33day = options[:day] || now.day 34session_id = options[:session] || AoC::Config.load('.config/aoc.toml').session 35filename = "data/aoc/#{year}/#{'%02d' % day}/input" 36linkname = "src/y#{year}/d#{'%02d' % day}/input" 37 38AoC::Logging.level = verbose ? AoC::Logger::TRACE : AoC::Logger::INFO 39 40log = AoC::Logging.logger_for 'main' 41 42log.trace(options:) 43 44abort 'Target file already exists' if File.exist? filename 45abort 'Missing session token' unless session_id 46 47log.trace(session_id:) 48 49filedir = File.dirname filename 50unless filedir == '.' || File.directory?(filedir) 51 log.debug "Creating directory for output file (#{filedir})" 52 FileUtils.mkdir_p filedir 53end 54 55linkdir = File.dirname linkname 56unless File.directory?(linkdir) 57 log.debug "Creating directory for link file (#{linkdir})" 58 FileUtils.mkdir_p linkdir 59end 60 61input_content = AoC::API.input(year, day, session_id, dry_run: dry_run) 62log.info('Writing response', filename:) 63open(filename, 'w') { |f| f.write input_content } # rubocop:disable Security/Open 64FileUtils.ln_sr filename, linkname 65log.info('Created link for input file', src: filename, dst: linkname) 66 67puts 'OK' if verbose