1 | const g = require('got')
|
2 | const _ = require('underscore')
|
3 | const cfg = require('../lib/config')
|
4 | const { HttpsAgent } = require('agentkeepalive')
|
5 | const log = console.log
|
6 |
|
7 | let api = {
|
8 | $url: 'https://www.curseforge.com/wow/addons/',
|
9 | $srl: 'https://addons-ecs.forgesvc.net/api/v2/addon',
|
10 |
|
11 | $lcl: /(addons|projects)\/(.*)$/,
|
12 | $scl: 'curseforge.com',
|
13 |
|
14 | info(ad, done) {
|
15 | let flavor = cfg.getMode() === '_classic_' ? 'wow_classic' : 'wow_retail'
|
16 | let top = require('./')
|
17 |
|
18 | top.getDB('curse', db => {
|
19 |
|
20 | if (!db) return done()
|
21 |
|
22 |
|
23 |
|
24 | let x = _.find(db, d => ad.key === d.key)
|
25 |
|
26 |
|
27 |
|
28 | if (!x) return done()
|
29 |
|
30 | let id = x.id
|
31 |
|
32 | let qs = `${api.$srl}/${id}`
|
33 |
|
34 |
|
35 | g.get(qs)
|
36 | .then(res => {
|
37 | res = JSON.parse(res.body)
|
38 |
|
39 |
|
40 | let data = {
|
41 | name: res.name,
|
42 | owner: res.authors ? res.authors[0].name : 'unknown',
|
43 | create: new Date(res.dateCreated).valueOf() / 1000,
|
44 | update: new Date(res.dateReleased).valueOf() / 1000,
|
45 | download: res.downloadCount,
|
46 | version: res.latestFiles.map(x => {
|
47 | return {
|
48 | name: x.displayName,
|
49 | size: x.fileLength,
|
50 | link: x.downloadUrl,
|
51 | flavor: x.gameVersionFlavor,
|
52 | date: new Date(x.fileDate),
|
53 | stage: x.releaseType
|
54 | }
|
55 | })
|
56 | }
|
57 |
|
58 | if (!ad.anyway)
|
59 | data.version = _.filter(data.version, x => x.flavor === flavor)
|
60 |
|
61 | if (!ad.nolib)
|
62 | data.version = _.filter(data.version, x => !x.name.match(/-nolib$/))
|
63 |
|
64 | let beta = _.filter(data.version, x => x.stage < 3)
|
65 | if (beta) data.version = beta
|
66 |
|
67 | data.version.sort((a, b) => b.date - a.date)
|
68 |
|
69 |
|
70 | done(!data.version.length ? null : data)
|
71 | })
|
72 | .catch(err => {
|
73 | done()
|
74 | })
|
75 | })
|
76 | },
|
77 |
|
78 | summary(done) {
|
79 | g.get('https://github.com/antiwinter/scrap/raw/master/wowa/db-curse.json', {
|
80 | agent: new HttpsAgent({ keepAlive: true })
|
81 | })
|
82 | .then(res => {
|
83 | done(JSON.parse(res.body))
|
84 | })
|
85 | .catch(err => {
|
86 | log('githubcontent error', err)
|
87 | done()
|
88 | })
|
89 | },
|
90 |
|
91 | search(ad, done) {
|
92 | let flavor = cfg.getMode() === '_classic_' ? 'wow_classic' : 'wow_retail'
|
93 |
|
94 | let qs = `${api.$srl}/search?gameId=1&index=0&pageSize=30&searchFilter=${ad.key}`
|
95 |
|
96 | g.get(qs)
|
97 | .then(res => {
|
98 |
|
99 | let data = JSON.parse(res.body)
|
100 |
|
101 | if (!ad.anyway)
|
102 | data = _.filter(data, d =>
|
103 | _.find(
|
104 | d.gameVersionLatestFiles,
|
105 | _d => _d.gameVersionFlavor === flavor
|
106 | )
|
107 | )
|
108 |
|
109 | done(
|
110 | data.map(x => {
|
111 | return {
|
112 | name: x.name,
|
113 | key: x.websiteUrl.split('/').pop(),
|
114 | download: x.downloadCount,
|
115 | update: new Date(x.dateModified).valueOf() / 1000,
|
116 | page: x.websiteUrl
|
117 | }
|
118 | })
|
119 | )
|
120 | })
|
121 | .catch(err => {
|
122 | done()
|
123 | })
|
124 | }
|
125 | }
|
126 |
|
127 | module.exports = api
|