@zomlit/tsleague
Version:
RL wrapper in TypeScript
127 lines (126 loc) • 5.05 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RocketLeagueAPI = void 0;
const puppeteer_extra_1 = __importDefault(require("puppeteer-extra"));
const puppeteer_extra_plugin_stealth_1 = __importDefault(require("puppeteer-extra-plugin-stealth"));
const Logger_1 = require("./utils/Logger");
const Playlist_1 = require("./enum/Playlist");
const ProxyManager_1 = require("./proxy/ProxyManager");
const OverviewStats_1 = require("./object/OverviewStats");
const PlaylistStats_1 = require("./object/PlaylistStats");
const AccountType_1 = require("./enum/AccountType");
const SteamAPI_1 = require("./steam/SteamAPI");
puppeteer_extra_1.default.use((0, puppeteer_extra_plugin_stealth_1.default)());
const logger = (0, Logger_1.createLogger)();
class RocketLeagueAPI {
options;
proxyManager = new ProxyManager_1.ProxyManager();
url = 'https://api.tracker.gg/api/v2/rocket-league/standard/profile';
data = null;
constructor(options) {
this.options = options;
if (this.options.accountType === AccountType_1.AccountType.STEAM) {
const steamAPI = new SteamAPI_1.SteamAPI(this.options.username);
const steamId = steamAPI.getSteamID();
this.url += `/steam/${steamId}`;
}
else if (this.options.accountType === AccountType_1.AccountType.EPIC)
this.url += `/epic/${this.options.username}`;
if (options.season)
this.url += `/segments/playlist?season=${options.season}`;
}
async fetchData() {
const proxy = this.proxyManager.getRandomProxy();
logger.info(`Using proxy: ${proxy || 'none'}`);
const launchArgs = [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--no-first-run',
'--no-zygote',
'--single-process',
'--disable-gpu',
];
// Only add proxy if it's not empty
if (proxy) {
launchArgs.push(`--proxy-server=${proxy}`);
}
const browser = await puppeteer_extra_1.default.launch({
headless: true,
args: launchArgs,
});
try {
const page = await browser.newPage();
const response = await page.goto(`${this.url}`, {
waitUntil: 'domcontentloaded',
});
if (!response || response.status() !== 200) {
logger.error(`Failed to load page. Status: ${response?.status()}`);
return null;
}
const bodyText = await page.evaluate(() => document.body?.textContent ?? '');
try {
const parsedData = JSON.parse(bodyText);
if (this.isRocketLeagueData(parsedData))
this.data = parsedData;
else if (this.isRocketLeagueSegmentArray(parsedData))
this.data = { data: parsedData };
else {
logger.error('Invalid data format.');
return null;
}
return this.data;
}
catch (parseError) {
logger.error('Error parsing data:', parseError);
return null;
}
}
catch (fetchError) {
logger.error('Error fetching data:', fetchError);
return null;
}
finally {
await browser.close();
}
}
isRocketLeagueData(data) {
return typeof data === 'object' && data !== null && 'data' in data;
}
isRocketLeagueSegmentArray(data) {
return Array.isArray(data);
}
async getStats(playlist) {
if (!this.data)
await this.fetchData();
if (this.data) {
const segments = Array.isArray(this.data.data)
? this.data.data
: this.data.data.segments;
const stats = segments.find(segment => segment.attributes?.playlistId === Playlist_1.PlaylistIdMap[playlist]);
if (stats && stats.stats)
return new PlaylistStats_1.PlaylistStats(stats.stats);
}
logger.error(`Stats for playlist ${playlist} not found.`);
return null;
}
async getGlobalStats() {
if (!this.data)
await this.fetchData();
if (this.data) {
const segments = Array.isArray(this.data.data)
? this.data.data
: this.data.data.segments;
const overviewSegment = segments.find(segment => segment.type === 'overview');
if (overviewSegment && overviewSegment.stats)
return new OverviewStats_1.OverviewStats(overviewSegment.stats);
}
logger.error('Global stats not found.');
return null;
}
}
exports.RocketLeagueAPI = RocketLeagueAPI;