steam-badge-unlocker
Version:
Provides an interface to solve most quests of the Steam Community badge.
163 lines (152 loc) • 4.37 kB
JavaScript
const SteamBadgeUnlocker = require('../index');
/**
* @param {number} appId
* @param {number} queueAppId
* @returns {Promise<string>}
*/
SteamBadgeUnlocker.prototype.clearDiscoveryQueueAppId = function (appId, queueAppId = 10) {
return this.post({
url: 'https://store.steampowered.com/app/' + queueAppId,
qs: {
l: this.getLanguage(),
},
form: {
sessionid: this.getSessionId(),
appid_to_clear_from_queue: appId,
},
headers: {
'Origin': 'https://store.steampowered.com',
'Accept': '*/*',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'https://store.steampowered.com/app/' + queueAppId,
'X-Requested-With': 'XMLHttpRequest',
},
});
}
/**
* @link https://store.cloudflare.steamstatic.com/public/javascript/discoveryqueue.js
* @param {number} eQueueType
* @returns {Promise<DiscoveryQueueResult>}
*/
SteamBadgeUnlocker.prototype.generateNewDiscoveryQueue = function (eQueueType = 0) {
return this.post({
url: 'https://store.steampowered.com/explore/generatenewdiscoveryqueue',
qs: {
l: this.getLanguage(),
},
json: true,
form: {
sessionid: this.getSessionId(),
queuetype: eQueueType,
},
headers: {
'Origin': 'https://store.steampowered.com',
'Accept': '*/*',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'https://store.steampowered.com/explore/',
'X-Requested-With': 'XMLHttpRequest',
},
});
}
/**
* @returns {Promise<Array<PromiseSettledResult<Awaited<string>>>>}
*/
SteamBadgeUnlocker.prototype.finishDiscoveryQueue = function () {
return this.generateNewDiscoveryQueue().then((result) => {
/** @var {Promise[]} */
const queue = [];
for (let appId of result.queue) {
queue.push(this.clearDiscoveryQueueAppId(appId));
}
// nodeJS <= 12 support
const version = process.version.match(/^v?(\d+)\.(\d+)\./);
const major = parseInt(version[1]);
const minor = version.length >= 3 ? parseInt(version[2]) : 0;
if (major < 12 || major === 12 && minor < 9) {
return Promise.all(queue);
}
return Promise.allSettled(queue);
}, (e) => Promise.reject(e));
}
/**
* @param {ESubSectionType} subSection
* @param {{qs?: AllContentHomeQuery, headers?: module:http.IncomingHttpHeaders}} params
* @returns {Promise<string>}
*/
SteamBadgeUnlocker.prototype.getAllContentHome = function (subSection, params = {}) {
/** @type {AllContentHomeQuery} */
const qs = {
l: this.getLanguage(),
p: 1,
numperpage: 1,
appHubSubSection: SteamBadgeUnlocker.ESubSection[subSection],
browsefilter: 'trend',
...(params.qs || {}),
};
return this.get({
url: 'https://steamcommunity.com/apps/allcontenthome/',
qs,
headers: {
'Origin': 'https://steamcommunity.com',
'Accept': '*/*',
'Referer': 'https://steamcommunity.com' + (subSection ? '/?subsection=' + subSection : ''),
...(params.headers || {}),
},
});
}
/** @typedef {{
* browsesort?: 'Alphabetical'|'MostRecent'|'Trend',
* browsefilter?: 'alphabetical'|'mostrecent'|'trend',
* appHubSubSection?: number,
* userreviewsoffset?: number,
* broadcastsoffset?: number,
* workshopitemspage?: number,
* readytouseitemspage?: number,
* mtxitemspage?: number,
* itemspage?: number,
* screenshotspage?: number,
* videospage?: number,
* artpage?: number,
* allguidepage?: number,
* webguidepage?: number,
* integratedguidepage?: number,
* discussionspage?: number,
* numperpage?: number,
* appid?: number,
* p?: number,
* l?: string,
* }} AllContentHomeQuery */
/** @typedef {{
* queue: number[],
* settings: DiscoveryQueueSettings,
* rgAppData: Object.<string, DiscoveryQueueAppData>,
* }} DiscoveryQueueResult
*/
/** @typedef {{
* os_win: null|0|1,
* os_mac: null|0|1,
* os_linux: null|0|1,
* full_controller_support: null|0|1,
* native_steam_controller: null|0|1,
* include_coming_soon: null|0|1,
* excluded_tagids: number[],
* exclude_early_access: null|0|1,
* exclude_videos: null|0|1,
* exclude_software: null|0|1,
* exclude_dlc: null|0|1,
* exclude_soundtracks: null|0|1,
* featured_tagids: number[],
* }} DiscoveryQueueSettings
*/
/** @typedef {{
* name: string,
* url_name: string,
* discount_block: string,
* descids: number[],
* header: string,
* os_windows: boolean,
* has_live_broadcast: boolean,
* discount: boolean,
* localized: boolean,
* }} DiscoveryQueueAppData
*/