-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsetup-legacy.rb
executable file
·88 lines (71 loc) · 1.59 KB
/
setup-legacy.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env ruby
require 'net/http'
class Setup
attr_reader :dir
def initialize(dir)
@dir = Dir.new(dir)
end
def run
dir.each.select {|year| /\d{4}/ =~ year}.map(&:to_i).each do |year|
(1..25).each do |day|
SetupDay.new(dir, year, day, http, headers).run
end
end
end
def headers
@headers ||= {'Cookie' => File.read(File.join(dir, 'cookies')).chomp}
end
def http
@http ||= Net::HTTP.start('adventofcode.com', 443, use_ssl: true)
end
end
module SetupDay
class << self
def new(main_dir, year, day, http, headers)
if year >= 2019
SetupNewDay
else
SetupLegacyDay
end.new(main_dir, year, day, http, headers)
end
end
end
class SetupLegacyDay
attr_reader :dir, :year, :day, :http, :headers
def initialize(main_dir, year, day, http, headers)
@dir = File.join(main_dir, year.to_s, sprintf('day%02d', day))
@day = day
@year = year
@http = http
@headers = headers
end
def run
mkdir
get_input
end
def mkdir
Dir.mkdir(dir)
rescue Errno::EEXIST
end
def needs_input?
return false if Time.new(year, 12, day) > Time.now
!(File.exist?(input_file) || File.exist?(input_file + '.txt'))
end
def get_input
return unless needs_input?
puts "Getting input for day #{day}, in #{year}"
resp = http.get("/#{year}/day/#{day}/input", headers)
File.write(input_file, resp.body)
end
def input_file
File.join(dir, 'input')
end
end
class SetupNewDay < SetupLegacyDay
def input_file
dir + '.input'
end
def mkdir
end
end
Setup.new(__dir__).run