-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreader.mjs
More file actions
103 lines (94 loc) · 2.9 KB
/
reader.mjs
File metadata and controls
103 lines (94 loc) · 2.9 KB
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import fs from 'fs';
import https from 'https';
const INPUTDIR = './inputs';
export default class Reader {
static fetchDayInputFromServer(day) {
return new Promise(async (resolve, reject) => {
if (typeof day !== 'number' || day < 1 || day > 25) {
reject('Invalid day: ' + day);
}
const config = await this.getConfigAsJsonFromFile();
if (!config.sessionId) {
reject('You need a valid session ID for the reader to fetch your input.');
}
https.get({
host: `adventofcode.com`,
path: `/2020/day/${day}/input`,
headers: {'Cookie': 'session=' + config.sessionId},
}, (res) => {
const { statusCode } = res;
if (statusCode !== 200) {
reject('An error occurred when trying to fetch input from the server. Status code: ' + statusCode);
};
res.setEncoding('utf8');
let dataString = '';
res.on('data', (chunk) => { dataString += chunk; });
res.on('end', () => {
resolve(dataString);
});
}).on('error', (netError) => {
reject(netError);
});
});
}
static getConfigAsJsonFromFile() {
return new Promise((resolve, reject) => {
fs.readFile('./config.json', 'utf8', (err, data) => {
if (err) {
reject(err);
}
try {
const json = JSON.parse(data);
resolve(json);
} catch (parseError) {
reject(parseError)
}
});
});
}
static fetchDayInputFromFile(day) {
return new Promise((resolve, reject) => {
if (typeof day !== 'number' || day < 1 || day > 25) {
reject('Invalid day: ' + day);
}
fs.readFile(`${INPUTDIR}/${day < 10 ? '0'+day : day}.txt`, 'utf8', (err, data) => {
if (err) {
reject(err);
}
resolve(data);
});
});
}
static getInputArrayForDay(day) {
return new Promise(async (resolve, reject) => {
if (typeof day !== 'number' || day < 1 || day > 25) {
reject('Invalid day: ' + day);
}
let inputString;
try {
inputString = await Reader.fetchDayInputFromFile(day);
resolve(inputString.split(/\r?\n/g));
} catch (fileError) {
if (fileError.code === 'ENOENT') {
try {
inputString = await Reader.fetchDayInputFromServer(day);
if (!fs.existsSync(INPUTDIR)){
fs.mkdirSync(INPUTDIR);
}
fs.writeFile(`${INPUTDIR}/${day < 10 ? '0'+day : day}.txt`, inputString, 'utf8', (err) => {
if (err) {
console.log('Could not safe input data: ', err);
} else {
console.log('Input data was saved to disk');
}
});
resolve(inputString.split(/\r?\n/g));
} catch (netError) {
reject(netError);
}
}
reject(fileError);
}
});
}
}