-
Notifications
You must be signed in to change notification settings - Fork 0
/
CurseForge Transactions Export.user.js
150 lines (142 loc) · 4.29 KB
/
CurseForge Transactions Export.user.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
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// ==UserScript==
// @name Cursed Transactions Export
// @namespace http://tampermonkey.net/
// @version 0.3
// @description try to take over the world!
// @author Snownee
// @match https://authors.curseforge.com/store/transactions*
// @connect cdn.jsdelivr.net
// @connect authors.curseforge.com
// @require https://cdn.jsdelivr.net/npm/jquery@3.4.0/dist/jquery.min.js
// @grant GM.registerMenuCommand
// @grant GM_xmlhttpRequest
// @homepage https://github.com/Snownee/CursedTransactionsExport
// ==/UserScript==
var days = 300;
var transactionsPerRequest = 50;
(function() {
GM.registerMenuCommand('Export Transactions', exportData)
})();
function makeGetRequest(url) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(response) {
resolve(response.responseText);
},
onerror: function(error) {
reject(error);
}
});
});
}
async function exportData(){
let curDate = new Date()
let destDate = new Date(curDate.getTime() - (days * 24 * 60 * 60 * 1000))
let award
let sheet = []
let reqCtx = {
queue: [],
index: 0,
noMore: false
}
let cols = ['date', 'total']
while(curDate > destDate) {
if (award == null) {
award = await nextAward(reqCtx)
if (award == null) {
break
}
}
let dayData = { date: curDate.getFullYear() + '/' + (curDate.getMonth()+1) + '/' + curDate.getDate() }
//console.log(award)
if (sameDay(award.date, curDate)) {
dayData.total = $('.toggle strong', award.award)[0].innerHTML
let items = $('.sub-reward-item li', award.award)
for (let i = 0; i < items.length; ++i) {
let item = items[i]
let project = $('a', item)[0].innerHTML
dayData[project] = $('b', item)[0].innerHTML
if (!cols.includes(project)) {
cols.push(project)
}
}
award = null
}
sheet.push(dayData)
curDate = new Date(curDate.getTime() - 24 * 60 * 60 * 1000)
}
if (sheet.length === 0) {
console.log("empty??")
return
}
sheet = sheet.reverse()
//console.log(sheet)
genCSV(cols, sheet)
}
function genCSV(cols, sheet) {
let csv = ''
let first = cols[0]
for (let col of cols) {
if (col !== first) {
csv += ','
}
csv += col.replaceAll(',', '')
}
csv += '\n'
for (let o of sheet) {
for (let col of cols) {
if (col !== first) {
csv += ','
}
let v = o[col]
if (v == null) {
v = '0'
}
csv += v.replaceAll(',', '')
}
csv += '\n'
}
console.log(csv)
let a = document.createElement("a");
a.href = "data:text," + csv; //content
a.download = "PointsData-" + days + "Days.csv"; //file name
a.click();
}
async function nextAward(ctx) {
if (ctx.queue.length > 0) {
return ctx.queue.shift()
}
if (ctx.noMore) {
return null
}
console.log('Fetching... ' + (ctx.index + transactionsPerRequest))
let data = await makeGetRequest(`https://authors.curseforge.com/store/transactions-ajax/${ctx.index}-${transactionsPerRequest}-7`)
ctx.index += transactionsPerRequest
let root = $.parseHTML(`<div>${data}</div>`)
let transactions = $('.transactions', root)
let l = transactions.length
if (l == 0) {
return null
}
if (l < transactionsPerRequest) {
ctx.noMore = true
}
for (let i = 0; i < l; ++i) {
let transaction = transactions[i]
let award = $('.reward-item.award', transaction)
if (award.length === 0) {
continue
}
award = award[0]
let date = new Date($('h3 .standard-date', transaction)[0].title)
ctx.queue.push({ date, award })
}
return ctx.queue.shift()
}
function sameDay(d1, d2) {
return d1.getFullYear() === d2.getFullYear() &&
d1.getMonth() === d2.getMonth() &&
d1.getDate() === d2.getDate();
}