-
-
Notifications
You must be signed in to change notification settings - Fork 110
/
getPastEvents.ts
121 lines (106 loc) · 3.3 KB
/
getPastEvents.ts
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { stringify } from 'querystring'
import { HLTVConfig } from '../config'
import { HLTVPage, HLTVScraper } from '../scraper'
import { Country } from '../shared/Country'
import { EventType, fromText } from '../shared/EventType'
import { fetchPage, getIdAt, parseNumber, sleep } from '../utils'
export interface PastEventPreview {
id: number
type: EventType
name: string
dateStart: number
dateEnd: number
numberOfTeams: number
prizePool: string
location: Country
}
export interface GetPastEventsArguments {
startDate?: string
endDate?: string
eventType?: EventType
prizePoolMin?: number
prizePoolMax?: number
attendingTeamIds?: number[]
attendingPlayerIds?: number[]
delayBetweenPageRequests?: number
}
export const getPastEvents =
(config: HLTVConfig) =>
async (options: GetPastEventsArguments): Promise<PastEventPreview[]> => {
const query = stringify({
...(options.startDate ? { startDate: options.startDate } : {}),
...(options.endDate ? { endDate: options.endDate } : {}),
...(options.eventType ? { eventType: options.eventType } : {}),
...(options.prizePoolMin ? { prizeMin: options.prizePoolMin } : {}),
...(options.prizePoolMax ? { prizeMax: options.prizePoolMax } : {}),
...(options.attendingTeamIds ? { team: options.attendingTeamIds } : {}),
...(options.attendingPlayerIds
? { player: options.attendingPlayerIds }
: {})
})
let page = 0
let $: HLTVPage
let events: PastEventPreview[] = []
do {
await sleep(options.delayBetweenPageRequests ?? 0)
$ = HLTVScraper(
await fetchPage(
`https://www.hltv.org/events/archive?${query}&offset=${page * 50}`,
config.loadPage
)
)
page++
events.push(
...$('a.small-event')
.toArray()
.map((el) => {
const id = el.attrThen('href', getIdAt(2))!
const name = el
.find('.table tr')
.first()
.find('td')
.first()
.find('.text-ellipsis')
.text()
const type = fromText(
el.find('.table tr').first().find('td').last().text()
)!
const dateStart = el
.find('td span[data-unix]')
.first()
.numFromAttr('data-unix')!
const dateEnd = el
.find('td span[data-unix]')
.last()
.numFromAttr('data-unix')!
const location = {
name: el
.find('.smallCountry .col-desc')
.text()
.replace(' | ', ''),
code: el
.find('.smallCountry img.flag')
.attr('src')
.split('/')
.pop()!
.split('.')[0]
}
const prizePool = el.find('.prizePoolEllipsis').text()
const numberOfTeams = Number(
el.find('.prizePoolEllipsis').prev().text().replace('+', '')
)
return {
id,
name,
type,
dateStart,
dateEnd,
location,
prizePool,
numberOfTeams
}
})
)
} while ($('a.small-event').exists())
return events
}