-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
77 lines (69 loc) · 2.77 KB
/
index.js
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
const puppeteer = require('puppeteer')
const fs = require('fs')
const path = require('path')
const xml2js = require('xml2js')
const [,,inputFilename = 'input.xml', timeout = 1000] = process.argv
const t = ms => (new Promise(r => setTimeout(r, ms)))
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
}
const parseInput = filename => new Promise((resolve, reject) => {
const fileToString = fs.readFileSync(path.resolve(__dirname, filename), {encoding: "latin1"})
xml2js.parseString(fileToString, (err, result) =>{
if (err) {
console.log(err)
reject(err)
return
}
const players = result.LocalPlayers.Player.map(({$}) => $)
return resolve(players)
})
})
const navigateAndGetValue = async (page, dciNumber) => {
console.log(`Fetching points for DCI#${dciNumber}`)
await page.goto(`http://www.wizards.com/Magic/PlaneswalkerPoints/${dciNumber}`, { waitUntil: 'networkidle0' })
await page.evaluate(() => ShowPointHistoryModal('Yearly'))
await t(timeout)
const points = await page.evaluate(() => {
const rows = document.querySelectorAll('.CompetitivePointsRow')
const [seasonRow] = Array.from(rows).map(e => e.children).filter(([season,pts]) => season.innerText === 'May 29, 2017 - May 27, 2018') || []
const [x,pointsElement] = seasonRow
return pointsElement.innerText || 0
})
return points
}
const iterate = async (page, player, stream) => {
const dur = Date.now()
const points = await navigateAndGetValue(page, player.DciNumber)
if (parseInt(points) < 100) {
console.log(`${player.FirstName} ${player.LastName} scored under 100 points, not logging. \n`)
return
}
const line = `${player.FirstName}, ${player.LastName}, ${player.DciNumber}, ${points} \n`
stream.write(line)
console.log(`Fetched ${points} points for ${player.FirstName} ${player.LastName} in ${Date.now() - dur}ms \n`)
return
}
const output = fs.createWriteStream('output.csv', {flags: 'a'});
(async () => {
const players = await parseInput(inputFilename)
console.log(`Checking ${players.length} players' points..`)
const now = new Date()
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.setRequestInterception(true);
page.on('request', (request) => {
if (['image', 'font', 'stylesheet'].includes(request.resourceType())){
request.abort();
} else {
request.continue();
}
});
await asyncForEach(players, n => iterate(page, n, output))
await browser.close()
await output.close()
console.log(`Done in ${Date.now() - now}ms`)
return
})()