Code for the Advent of Code event
aoc
advent-of-code
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