steam-js-api
Version:
A wrapper for Steam Web API, with additional CSGO functionality.
323 lines (251 loc) • 9.61 kB
JavaScript
const {validateSteamID, request} = require('./util.js')
const {requireKey} = require('./../app.js')
const STATS = require('./../json/stats-min.json')
// Helps with custom stats structures
function addProp(o, s, v) {
if (s.length > 2) {
let k = s.shift()
if (!(k in o)) {
o[k] = addProp({}, s, v)
} else {
o[k] = addProp(o[k], s, v)
}
} else if (s.length == 2) {
let k = s.shift()
if (!(k in o)) {
o[k] = {}
}
o[k][s[0]] = v
} else {
o[s.shift()] = v
}
return o
}
function getGlobalAchievements(appID, callback) {
function run(resolve, reject) {
request('ISteamUserStats/GetGlobalAchievementPercentagesForApp/v2', {gameid: appID}, result => {
if (result.error) {
if (reject) reject(result)
else resolve(result)
return
}
if (typeof result.data === 'object' && result.data.hasOwnProperty('achievementpercentages')){
let achievements = result.data.achievementpercentages.achievements
let data = {
achievements: {}
}
for (index in achievements) {
let a = achievements[index]
data.achievements[a.name] = a.percent
}
resolve({data})
} else {
result.error = 'Unexpected response. Data may have still been returned.'
if (reject) reject(result)
else resolve(result)
}
})
}
if (typeof callback === 'function') {
run(callback)
} else {
return new Promise((resolve, reject) => {
run(resolve, reject)
})
}
}
function getCurrentPlayers(appID, callback) {
function run(resolve, reject) {
request('ISteamUserStats/GetNumberOfCurrentPlayers/v1', {appid: appID}, result => {
if (result.error) {
if (reject) reject(result)
else resolve(result)
return
}
if (typeof result.data === 'object' && result.data.hasOwnProperty('response')){
let reponse = result.data.response
let data = {
players: reponse.player_count
}
resolve({data})
} else {
result.error = 'Unexpected response. Data may have still been returned.'
if (reject) reject(result)
else resolve(result)
}
})
}
if (typeof callback === 'function') {
run(callback)
} else {
return new Promise((resolve, reject) => {
run(resolve, reject)
})
}
}
function getAchievements(steamID, appID, callback) {
function run(resolve, reject) {
let _key = requireKey()
if (!validateSteamID(steamID)) {
let result = {error: 'Steam ID does not appear valid'}
if (reject) reject(result)
else resolve(result)
}
request('ISteamUserStats/GetPlayerAchievements/v1', {key: _key, steamid: steamID, appid: appID}, result => {
if (result.error) {
if (reject) reject(result)
else resolve(result)
return
}
if (typeof result.data === 'object' && result.data.hasOwnProperty('playerstats')){
let playerstats = result.data.playerstats
let data = {
name: playerstats.gameName,
count: 0,
achievements: {}
}
for (index in playerstats.achievements) {
let a = playerstats.achievements[index]
data.achievements[a.apiname] = {
unlocked: Boolean(a.achieved),
time: a.unlocktime
}
data.count++
}
resolve({data})
} else {
result.error = 'Unexpected response. Data may have still been returned.'
if (reject) reject(result)
else resolve(result)
}
})
}
if (typeof callback === 'function') {
run(callback)
} else {
return new Promise((resolve, reject) => {
run(resolve, reject)
})
}
}
function getGameSchema(appID, callback) {
function run(resolve, reject) {
let _key = requireKey()
request('ISteamUserStats/GetSchemaForGame/v2', {key: _key, appid: appID}, result => {
if (result.error) {
if (reject) reject(result)
else resolve(result)
return
}
if (typeof result.data === 'object' && result.data.hasOwnProperty('game')){
let game = result.data.game
let data = {
name: game.gameName,
statCount: 0,
achievementCount: 0,
stats: {},
achievements: {}
}
for (index in game.availableGameStats.stats) {
let s = game.availableGameStats.stats[index]
data.stats[s.name] = {
displayName: s.displayName,
default: s.defaultvalue
}
data.statCount++
}
for (index in game.availableGameStats.achievements) {
let a = game.availableGameStats.achievements[index]
data.achievements[a.name] = {
displayName: a.displayName,
description: a.description || "",
hidden: Boolean(a.hidden),
icon: a.icon,
iconLocked: a.icongray
}
data.achievementCount++
}
resolve({data})
} else {
result.error = 'Unexpected response. Data may have still been returned.'
if (reject) reject(result)
else resolve(result)
}
})
}
if (typeof callback === 'function') {
run(callback)
} else {
return new Promise((resolve, reject) => {
run(resolve, reject)
})
}
}
function getStats(steamID, appID, callback) {
function run(resolve, reject) {
let _key = requireKey()
if (!validateSteamID(steamID)) {
let result = {error: 'Steam ID does not appear valid'}
if (reject) reject(result)
else resolve(result)
}
request('ISteamUserStats/GetUserStatsForGame/v2', {key: _key, steamid: steamID, appid: appID}, result => {
if (result.error) {
if (reject) reject(result)
else resolve(result)
return
}
if (typeof result.data === 'object' && result.data.hasOwnProperty('playerstats')){
let playerstats = result.data.playerstats
let data = {
name: playerstats.gameName,
count: 0,
stats: {}
}
if (STATS.hasOwnProperty(appID)) {
// Custom structure defined
for (index in playerstats.stats) {
let s = playerstats.stats[index]
if (STATS[appID][s.name]) {
// Custom, add data
data.stats = addProp(data.stats, STATS[appID][s.name].name.split('.'), s.value)
} else {
// Unspecified, place inside 'unknown' with original name
if (!data.stats.unknown) {
data.stats.unknown = {}
}
data.stats.unknown[s.name] = s.value
}
data.count++
}
} else {
// No custom structure defined, use basic structure
for (index in playerstats.stats) {
let s = playerstats.stats[index]
data.stats[s.name] = s.value
data.count++
}
}
resolve({data})
} else {
result.error = 'Unexpected response. Data may have still been returned.'
if (reject) reject(result)
else resolve(result)
}
})
}
if (typeof callback === 'function') {
run(callback)
} else {
return new Promise((resolve, reject) => {
run(resolve, reject)
})
}
}
const lib = {}
lib.getGlobalAchievements = getGlobalAchievements
lib.getCurrentPlayers = getCurrentPlayers
lib.getAchievements = getAchievements
lib.getGameSchema = getGameSchema
lib.getStats = getStats
module.exports = lib