UNPKG

@zomlit/tsleague

Version:

RL wrapper in TypeScript

127 lines (126 loc) 5.05 kB
"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;