mrivals
Version:
Wrapper/Scrapper for Marvel Rival stats.
1 lines • 10.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/helpers/fetcher.ts","../src/index.ts"],"sourcesContent":["import { exec } from \"node:child_process\";\r\n\r\nconst fetchWithCurl = (url: string) =>\r\n new Promise((resolve, reject) => {\r\n exec(`curl --max-time 5 --user-agent 'Chrome/121' --url ${url}`, (err, result) => {\r\n if (!result) {\r\n reject(err);\r\n }\r\n resolve(JSON.parse(result));\r\n });\r\n });\r\n\r\nconst fetchWithNode = (url: string) =>\r\n new Promise((resolve, reject) => {\r\n fetch(url)\r\n .then((res) => res.json())\r\n .then((json) => resolve(json))\r\n .catch((err) => reject(err));\r\n });\r\n\r\nconst fetchWithFlaresolverr = (url: string, { flaresolverrUrl }: { flaresolverrUrl: string }) => fetch(flaresolverrUrl, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({\r\n cmd: \"request.get\",\r\n url: url,\r\n maxTimeout: 60000,\r\n }),\r\n}).then(async (res) => {\r\n if (res.ok) {\r\n const data = await res.json();\r\n const responseText = data.solution.response;\r\n \r\n let jsonContent = responseText;\r\n\r\n if (responseText.startsWith('<html>')) {\r\n // Extract content between <pre> tags\r\n const match = responseText.match(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/i);\r\n if (match && match[1]) {\r\n jsonContent = match[1].trim();\r\n }\r\n }\r\n \r\n return JSON.parse(jsonContent);\r\n }\r\n throw new Error(res.statusText);\r\n});\r\n\r\nexport const getFetcher = (options?: { \r\n flaresolverrUrl?: string, \r\n useCurl?: boolean \r\n }) => {\r\n if (options?.flaresolverrUrl) {\r\n return (url: string) => fetchWithFlaresolverr(url, { flaresolverrUrl: options.flaresolverrUrl });\r\n }\r\n \r\n if (options?.useCurl) {\r\n return fetchWithCurl;\r\n }\r\n \r\n return fetchWithNode;\r\n };\r\n \r\n\r\n","import { TrackerResponse } from './types/tracker';\r\nimport { HeroesStats, HeroStats, OverviewStats, RoleStats, UserInfo, BaseOptions, FetchUserOptions } from './types/internal';\r\nimport { getFetcher } from './helpers/fetcher';\r\n\r\nconst BASE_URL = `https://api.tracker.gg/api/v2/marvel-rivals/standard/profile/ign/{USERNAME}`;\r\n\r\nclass API {\r\n username: string;\r\n _raw: TrackerResponse;\r\n\r\n constructor(username: string) {\r\n this.username = username;\r\n }\r\n\r\n static async fetchUser(username: string, options: FetchUserOptions = {}) {\r\n const api = new API(username);\r\n\r\n const fetchData = getFetcher({\r\n flaresolverrUrl: options.flaresolverrUrl,\r\n useCurl: options.useCurl ?? false,\r\n });\r\n\r\n api._raw = (await fetchData(BASE_URL.replace('{USERNAME}', username))) as TrackerResponse;\r\n\r\n if (api._raw.errors) throw new Error(api._raw.errors[0].message);\r\n return api;\r\n }\r\n\r\n\r\n overview(options: BaseOptions = {}) {\r\n const result = {} as OverviewStats;\r\n const raw = options.raw ?? false;\r\n const data = this._raw.data.segments.find((x) => x.type === 'overview');\r\n if (raw) {\r\n // @ts-ignore\r\n result._raw = data;\r\n }\r\n if (data?.stats) {\r\n for (const key in data.stats) {\r\n result[key] = data.stats[key].value;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n heroes() {\r\n const result = {} as HeroesStats;\r\n const heroes = this._raw.data.segments.filter((x) => x.type === 'hero');\r\n\r\n for (const hero of heroes) {\r\n const heroName = hero.metadata.name;\r\n result[heroName] = {} as HeroStats;\r\n if (hero) {\r\n for (const key in hero.stats) {\r\n result[heroName][key] = hero.stats[key].value;\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n roles() {\r\n const result = {} as RoleStats;\r\n const roles = this._raw.data.segments.filter((x) => x.type === 'hero-role');\r\n\r\n for (const role of roles) {\r\n const roleName = role.metadata.name;\r\n result[roleName] = {} as HeroStats;\r\n if (role) {\r\n for (const key in role.stats) {\r\n result[roleName][key] = role.stats[key].value;\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n peakRank() {\r\n const data = this._raw.data.segments.find((x) => x.type === 'ranked-peaks');\r\n\r\n const {lifetimePeakRanked} = data?.stats ?? {};\r\n\r\n const peakTiers = Array.isArray(data?.stats.peakTiers?.value) ? data?.stats.peakTiers.value : [];\r\n\r\n const result = {\r\n peakTiers: peakTiers?.map((x) => ({\r\n displayName: x.displayName,\r\n tierName: x.metadata.tierName,\r\n tierShortName: x.metadata.tierShortName,\r\n tierIcon: x.metadata.iconUrl,\r\n tierColor: x.metadata.color,\r\n season: x.metadata.seasonShortName,\r\n seasonName: x.metadata.seasonName,\r\n mmr: x.value as number,\r\n })),\r\n lifetimePeakRanked: {\r\n displayName: lifetimePeakRanked.metadata.tierName,\r\n tierName: lifetimePeakRanked.metadata.tierName,\r\n tierShortName: lifetimePeakRanked.metadata.tierShortName,\r\n tierIcon: lifetimePeakRanked.metadata.iconUrl,\r\n tierColor: lifetimePeakRanked.metadata.color,\r\n season: lifetimePeakRanked.metadata.seasonShortName,\r\n seasonName: lifetimePeakRanked.metadata.seasonName,\r\n mmr: lifetimePeakRanked.value as number,\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n info() {\r\n const platform = this._raw.data.platformInfo;\r\n const info = this._raw.data.userInfo;\r\n const data = this._raw.data.segments.find((x) => x.type == 'overview');\r\n\r\n const { ranked, peakRanked } = data?.stats ?? {};\r\n\r\n const result: UserInfo = {\r\n platform: platform.platformSlug,\r\n uuid: platform.platformUserId,\r\n name: platform.platformUserHandle,\r\n userid: platform.platformUserIdentifier,\r\n avatar: platform.avatarUrl,\r\n pageViews: info.pageviews,\r\n rank: ranked?.metadata?.tierName,\r\n peakRank: peakRanked?.metadata?.tierName,\r\n };\r\n\r\n return result;\r\n }\r\n\r\n raw() {\r\n return this._raw;\r\n }\r\n}\r\n\r\nexport {\r\n API,\r\n};"],"mappings":";AAAA,SAAS,YAAY;AAErB,IAAM,gBAAgB,CAAC,QACnB,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC7B,OAAK,qDAAqD,GAAG,IAAI,CAAC,KAAK,WAAW;AAC9E,QAAI,CAAC,QAAQ;AACT,aAAO,GAAG;AAAA,IACd;AACA,YAAQ,KAAK,MAAM,MAAM,CAAC;AAAA,EAC9B,CAAC;AACL,CAAC;AAEL,IAAM,gBAAgB,CAAC,QACnB,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC7B,QAAM,GAAG,EACJ,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EACxB,KAAK,CAAC,SAAS,QAAQ,IAAI,CAAC,EAC5B,MAAM,CAAC,QAAQ,OAAO,GAAG,CAAC;AACnC,CAAC;AAEL,IAAM,wBAAwB,CAAC,KAAa,EAAE,gBAAgB,MAAmC,MAAM,iBAAiB;AAAA,EACpH,QAAQ;AAAA,EACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,EAC9C,MAAM,KAAK,UAAU;AAAA,IACnB,KAAK;AAAA,IACL;AAAA,IACA,YAAY;AAAA,EACd,CAAC;AACL,CAAC,EAAE,KAAK,OAAO,QAAQ;AACnB,MAAI,IAAI,IAAI;AACR,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,eAAe,KAAK,SAAS;AAEnC,QAAI,cAAc;AAElB,QAAI,aAAa,WAAW,QAAQ,GAAG;AAEnC,YAAM,QAAQ,aAAa,MAAM,8BAA8B;AAC/D,UAAI,SAAS,MAAM,CAAC,GAAG;AACnB,sBAAc,MAAM,CAAC,EAAE,KAAK;AAAA,MAChC;AAAA,IACJ;AAEA,WAAO,KAAK,MAAM,WAAW;AAAA,EACjC;AACA,QAAM,IAAI,MAAM,IAAI,UAAU;AAClC,CAAC;AAEM,IAAM,aAAa,CAAC,YAGnB;AACJ,MAAI,SAAS,iBAAiB;AAC5B,WAAO,CAAC,QAAgB,sBAAsB,KAAK,EAAE,iBAAiB,QAAQ,gBAAgB,CAAC;AAAA,EACjG;AAEA,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACzDF,IAAM,WAAW;AAEjB,IAAM,MAAN,MAAM,KAAI;AAAA,EACN;AAAA,EACA;AAAA,EAEA,YAAY,UAAkB;AAC1B,SAAK,WAAW;AAAA,EACpB;AAAA,EAEA,aAAa,UAAU,UAAkB,UAA4B,CAAC,GAAG;AACrE,UAAM,MAAM,IAAI,KAAI,QAAQ;AAE5B,UAAM,YAAY,WAAW;AAAA,MACzB,iBAAiB,QAAQ;AAAA,MACzB,SAAS,QAAQ,WAAW;AAAA,IAChC,CAAC;AAED,QAAI,OAAQ,MAAM,UAAU,SAAS,QAAQ,cAAc,QAAQ,CAAC;AAEpE,QAAI,IAAI,KAAK;AAAQ,YAAM,IAAI,MAAM,IAAI,KAAK,OAAO,CAAC,EAAE,OAAO;AAC/D,WAAO;AAAA,EACX;AAAA,EAGA,SAAS,UAAuB,CAAC,GAAG;AAChC,UAAM,SAAS,CAAC;AAChB,UAAM,MAAM,QAAQ,OAAO;AAC3B,UAAM,OAAO,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AACtE,QAAI,KAAK;AAEL,aAAO,OAAO;AAAA,IAClB;AACA,QAAI,MAAM,OAAO;AACb,iBAAW,OAAO,KAAK,OAAO;AAC1B,eAAO,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE;AAAA,MAClC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,SAAS;AACL,UAAM,SAAS,CAAC;AAChB,UAAM,SAAS,KAAK,KAAK,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAEtE,eAAW,QAAQ,QAAQ;AACvB,YAAM,WAAW,KAAK,SAAS;AAC/B,aAAO,QAAQ,IAAI,CAAC;AACpB,UAAI,MAAM;AACN,mBAAW,OAAO,KAAK,OAAO;AAC1B,iBAAO,QAAQ,EAAE,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE;AAAA,QAC5C;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ;AACJ,UAAM,SAAS,CAAC;AAChB,UAAM,QAAQ,KAAK,KAAK,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW;AAE1E,eAAW,QAAQ,OAAO;AACtB,YAAM,WAAW,KAAK,SAAS;AAC/B,aAAO,QAAQ,IAAI,CAAC;AACpB,UAAI,MAAM;AACN,mBAAW,OAAO,KAAK,OAAO;AAC1B,iBAAO,QAAQ,EAAE,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE;AAAA,QAC5C;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,WAAW;AACP,UAAM,OAAO,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,cAAc;AAE1E,UAAM,EAAC,mBAAkB,IAAI,MAAM,SAAS,CAAC;AAE7C,UAAM,YAAY,MAAM,QAAQ,MAAM,MAAM,WAAW,KAAK,IAAI,MAAM,MAAM,UAAU,QAAQ,CAAC;AAE/F,UAAM,SAAS;AAAA,MACX,WAAW,WAAW,IAAI,CAAC,OAAO;AAAA,QAC9B,aAAc,EAAE;AAAA,QAChB,UAAU,EAAE,SAAS;AAAA,QACrB,eAAe,EAAE,SAAS;AAAA,QAC1B,UAAU,EAAE,SAAS;AAAA,QACrB,WAAW,EAAE,SAAS;AAAA,QACtB,QAAQ,EAAE,SAAS;AAAA,QACnB,YAAY,EAAE,SAAS;AAAA,QACvB,KAAK,EAAE;AAAA,MACX,EAAE;AAAA,MACF,oBAAoB;AAAA,QAChB,aAAa,mBAAmB,SAAS;AAAA,QACzC,UAAU,mBAAmB,SAAS;AAAA,QACtC,eAAe,mBAAmB,SAAS;AAAA,QAC3C,UAAU,mBAAmB,SAAS;AAAA,QACtC,WAAW,mBAAmB,SAAS;AAAA,QACvC,QAAQ,mBAAmB,SAAS;AAAA,QACpC,YAAY,mBAAmB,SAAS;AAAA,QACxC,KAAK,mBAAmB;AAAA,MAC5B;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO;AACH,UAAM,WAAW,KAAK,KAAK,KAAK;AAChC,UAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,UAAM,OAAO,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,QAAQ,UAAU;AAErE,UAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,SAAS,CAAC;AAE/C,UAAM,SAAmB;AAAA,MACrB,UAAU,SAAS;AAAA,MACnB,MAAM,SAAS;AAAA,MACf,MAAM,SAAS;AAAA,MACf,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,MAAM,QAAQ,UAAU;AAAA,MACxB,UAAU,YAAY,UAAU;AAAA,IACpC;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM;AACF,WAAO,KAAK;AAAA,EAChB;AACJ;","names":[]}