// https://stackoverflow.com/questions/46946380/fetch-api-request-timeout // https://developer.mozilla.org/zh-CN/docs/Web/API/AbortSignal#%E8%B6%85%E6%97%B6%E6%88%96%E6%98%BE%E5%BC%8F%E4%B8%AD%E6%AD%A2_fetch import { path } from "cc" import { PREVIEW } from "cc/env" import { GameDataManager } from "../managers/GameDataManager"; const gameId = "rp_11008"; // let apiaddr = "https://rpgames-api.rpfafafahkdev.com"; let apiaddr = ""; let token = "eyJQIjoxMDEzNzAsIkUiOjE3NjI4ODQxNjksIlMiOjEwMDIsIkQiOiJycF8xMDAxNyJ9.nb071g5rB617sJNMMhSKh7kXM0C0oTWSfPo90pejoc4"; let language = "en" let currency = "THB" let supportUrl = "" let oddsUrl = "" let historyUrl = "" let isRB7 = false; export function getOddsUrl() { return oddsUrl; } export function getSupportUrl() { return supportUrl; } export function getHistoryUrl() { return historyUrl; } export function getLanguage() { // return 'zh'; return language; } export function getIsRB7() { // return true; return isRB7; } export function getGameId() { return gameId; } export async function getTestToken(username: string, appid: string) { if (!username) return; const res = await fetch("https://gamecenter.rpenenenhkdev.com/rpgame/token", { "headers": { "appid": appid, "appsecret": "b6337af9-a91a-4085-b1f2-466923470735", "sec-fetch-mode": "cors", }, "body": JSON.stringify({ "UserID": username, "GameID": gameId, "AppID": appid }), "method": "POST", "mode": "cors", }); const obj = await res.json() token = obj.data.Token } export function initReqAddr() { let partHost = ".rpenenenhkdev.com"; if (!PREVIEW) { const qs = new URLSearchParams(location.search) token = qs.get("t"); const l = qs.get("l"); if (l) { language = l } const c = qs.get("c"); if (c) { currency = c } const brand = qs.get("brand") if (brand == 'rb7') { isRB7 = brand == 'rb7'; } const dotidx = location.host.indexOf('.') partHost = location.host.slice(dotidx) } apiaddr = `https://rpgames-api${partHost}` supportUrl = `https://rpgames-intro${partHost}/#/index?gid=${gameId}&type=support&l=${language}&c=${currency}` oddsUrl = `https://rpgames-intro${partHost}/#/index?gid=${gameId}&type=odds&l=${language}&c=${currency}` historyUrl = `https://rpgames-intro${partHost}/#/history?gid=${gameId}&l=${language}&c=${currency}&t=${token}` } AbortSignal.timeout ??= function timeout(ms) { const ctrl = new AbortController() setTimeout(() => ctrl.abort(), ms) return ctrl.signal } export async function callGamePendingApi(argsObj: any) { const url = apiaddr + path.join("/gameapi/getgamepending") const payload = JSON.stringify(argsObj) const res = await fetch(url, { signal: AbortSignal.timeout(10000), headers: { "Content-Type": "application/json", "X-Rp-Token": token, }, method: "POST", body: payload, mode: 'cors', }) if (res.status != 200) { const errstr = await res.text() throw new Error(errstr || res.statusText) } const obj = await res.json() return obj } export async function callGameApi(action: string, argsObj: any) { const url = apiaddr + path.join("/gameapi/", GameDataManager.instance.gamePending, action) const payload = JSON.stringify(argsObj) const res = await fetch(url, { signal: AbortSignal.timeout(10000), headers: { "Content-Type": "application/json", "X-Rp-Token": token, }, method: "POST", body: payload, mode: 'cors', }) if (res.status != 200) { const errstr = await res.text() throw new Error(errstr || res.statusText) } const obj = await res.json() return obj } export async function callGameApiForRank(action: string, argsObj: any) { const url = apiaddr + path.join("/gameapi/", 'rank', action) const payload = JSON.stringify(argsObj) const res = await fetch(url, { signal: AbortSignal.timeout(10000), headers: { "Content-Type": "application/json", "X-Rp-Token": token, }, method: "POST", body: payload, mode: 'cors', }) if (res.status != 200) { const errstr = await res.text() throw new Error(errstr || res.statusText) } const obj = await res.json() return obj } let uploadErrorSeq = 0 export async function uploadError(msg: string) { if (uploadErrorSeq > 1000) { return } const argsObj = { "game": gameId, "type": "error", "href": window.location.href, "userAgent": window.navigator.userAgent, "language": language, "currency": currency, "token": token, "msg": msg, "seq": uploadErrorSeq++, } const url = apiaddr + "/event/upload" const payload = JSON.stringify(argsObj) const res = await fetch(url, { signal: AbortSignal.timeout(10000), method: "POST", body: payload, mode: 'cors', }) console.log("uploadError", "statusText", res.statusText) } export function gold2cash(v: number): string { v /= 10000 return v.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ','); } export function gold2cash2(v: number): string { v /= 10000 if (v % 1 == 0) { return v.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ','); } else { return v.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ','); } } export function truncateString(str: string, maxLength: number = 10): string { if (!str) return ''; if (str.length <= maxLength) return str; return str.substring(0, maxLength) + '...'; }