SDKBase.js 12.8 KB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SDKBase = exports.setConfigV2 = exports.setConfig = exports.SDKConfigV2 = exports.SDKConfig = exports.V2 = void 0;
const simba_httpclient_1 = require("simba-httpclient");
const SVConfig_1 = require("./SVConfig");
const simba_utils_1 = require("simba-utils");
const SDKServer_1 = require("./SDKServer");
const SDKRecordsData_1 = require("./SDKRecordsData");
const TimeManager_1 = require("./TimeManager");
exports.V2 = false;
const TIME_OUT_MS = 5000;
function setConfig(config) {
    exports.SDKConfig = config;
}
exports.setConfig = setConfig;
function setConfigV2(config) {
    exports.SDKConfig = config;
    exports.SDKConfigV2 = config;
    exports.V2 = true;
}
exports.setConfigV2 = setConfigV2;
function convertDate(playerCreateTime) {
    const dateParse = playerCreateTime.split(" ");
    const preParse = dateParse[0].split("-");
    const afterParse = dateParse[1].split(":");
    const finalDate = new Date();
    finalDate.setFullYear(parseInt(preParse[0]));
    finalDate.setMonth(parseInt(preParse[1]) - 1);
    finalDate.setDate(parseInt(preParse[2]));
    finalDate.setHours(parseInt(afterParse[0]));
    finalDate.setMinutes(parseInt(afterParse[1]));
    finalDate.setSeconds(parseInt(afterParse[2]));
    return finalDate.toISOString();
}
class SDKBase {
    constructor() {
        this.systemInfo = {
            deviceInfo: { model: "", brand: "", platform: "", system: "", version: "", SDKVersion: "" },
            displayInfo: {
                windowSize: { width: 0, height: 0 },
                safeArea: { left: 0, top: 0, right: 0, bottom: 0 }
            }
        };
    }
    async init() {
        if (exports.V2) {
            SDKServer_1.default.timeServer = new simba_httpclient_1.HttpClient(exports.SDKConfigV2.debug ? exports.SDKConfigV2.syncTimeServiceUrlDEV : exports.SDKConfigV2.syncTimeServiceUrlRELEASE);
        }
        else {
            SDKServer_1.default.mapleServer = new simba_httpclient_1.HttpClient(`https://maple${exports.SDKConfig.debug ? "-test" : ""}.icesimba.cn`);
            SDKServer_1.default.timeServer = new simba_httpclient_1.HttpClient(exports.SDKConfig.debug ? `https://maple-test.icesimba.cn/wechat/gettime?game_id=${exports.SDKConfig.gameId}` : "https://iwppublic.icesimba.cn/wechat/gettime");
        }
        await TimeManager_1.TimeManager.init(!!exports.SDKConfig.useLocalTime);
        return new Promise((resolve) => {
            SVConfig_1.initShareConfig(exports.SDKConfig).then(() => {
                resolve(true);
            }).catch((err) => {
                console.error(err);
                resolve(false);
            });
        });
    }
    /**构建登录传给服务器的参数 */
    buildLoginParam(param) {
        if (exports.V2) {
            let body = {
                source: exports.SDKConfigV2.localServerLoginSource,
                platformId: param.code,
                password: "",
                appId: exports.SDKConfigV2.gameId
            };
            return body;
        }
    }
    async login(extraParams, timeout = 5000) {
        const { code } = await this._login();
        if (!code.length)
            return { session: "", token: "", playerId: "", createTime: "", profileVersion: -1 };
        if (exports.V2) {
            let url = exports.SDKConfigV2.debug ? exports.SDKConfigV2.loginLocalServerServiceUrlDEV : exports.SDKConfigV2.loginLocalServerServiceUrlRELEASE;
            // let body = {
            //     source: SDKConfigV2.localServerLoginSource,
            //     platformId: code,
            //     password: "",
            //     appId: SDKConfigV2.gameId
            // };
            let body = this.buildLoginParam({ code: code });
            try {
                let loginRetStr = (await SDKServer_1.default.loginLocalServerHttp.post(url, TIME_OUT_MS, JSON.stringify(body), "application/json"));
                // console.log("loginLocalServer response = ", loginRetStr);
                if (loginRetStr && "" !== loginRetStr.trim()) {
                    const loginRetJson = JSON.parse(loginRetStr);
                    if (loginRetJson["subject"] && loginRetJson["refreshToken"] && loginRetJson["serviceTokens"]) {
                        let commonToken = loginRetJson["serviceTokens"]["*"];
                        let recordToken = loginRetJson["serviceTokens"]["archive"];
                        this.loginInfo = {
                            channelAccessToken: code,
                            localServerPublicServiceToken: commonToken,
                            localServerRecordServiceToken: recordToken ? recordToken : commonToken,
                            localServerRefreshToken: loginRetJson["refreshToken"],
                            localServerSubject: loginRetJson["subject"],
                            playerId: loginRetJson["subject"].split("_")[1]
                        };
                    }
                }
                await this.downloadRecord();
                await TimeManager_1.TimeManager.onLogin(SDKRecordsData_1.getSDKRecord().sdk);
                return Object.assign({}, this.loginInfo);
            }
            catch (error) {
                console.error("loginLocalServer", error);
            }
        }
        else {
            let params = extraParams ? Object.assign({}, extraParams) : {};
            let channel = this.getChannel();
            params["game_id"] = exports.SDKConfig.gameId;
            params["open_id"] = "";
            if (channel === "wechat") {
                params["third_code"] = code;
                params["third_type"] = channel;
                params["device_id"] = "";
            }
            else {
                params["device_id"] = code; //使用device_id的时候不需要third_code和third_type否则会报错
            }
            params["server_id"] = "";
            // console.log('send login data to server', JSON.stringify(params));
            let ret = await SDKServer_1.default.mapleServer.post("/maple/client/v1/user/login", timeout, JSON.stringify(params), "application/json");
            const response = JSON.parse(ret);
            // console.log("server response data", response);
            if (response && parseInt(response["code"]) === 0 && response["obj"]) {
                this.loginInfo = { session: response["obj"]["session"], token: response["obj"]["token"], playerId: response["obj"]["player_id"], createTime: response["obj"]["create_time"], profileVersion: response["obj"]["profile"] ? parseInt(response["obj"]["profile"]["version"]) : -1 };
                // console.log("login succeed,login info is ", this.loginInfo);
                // console.log("start to download record data from server");
                await SDKRecordsData_1.downloadSDKRecord(exports.SDKConfig.gameId, this.getHttpHeaders());
                // console.log("download record data from server succeed");
                // console.log("start to valid time from server");
                await TimeManager_1.TimeManager.onLogin(SDKRecordsData_1.getSDKRecord().sdk);
                // console.log("valid time from server completed");
                return Object.assign({}, this.loginInfo);
            }
            else {
                // console.log('login from server error ,error info is', ret);
                throw ret;
            }
        }
    }
    /**原生平台不能调用 getSDKRecord*/
    async timeManagerOnLogin() {
        await TimeManager_1.TimeManager.onLogin(SDKRecordsData_1.getSDKRecord().sdk);
    }
    /**下载存档 */
    async downloadRecord() {
        let url = exports.SDKConfigV2.debug ? exports.SDKConfigV2.localServerRecordServiceUrlDEV : exports.SDKConfigV2.localServerRecordServiceUrlRELEASE;
        url += `?appName=${exports.SDKConfigV2.gameId}&platformId=${this.loginInfo.playerId}`;
        let downloadSucced = await SDKRecordsData_1.downloadSDKRecordV2(exports.SDKConfigV2.gameId, url, { "Authorization": `Bearer ${this.loginInfo.localServerRecordServiceToken}` });
        if (!downloadSucced) {
            setTimeout(async () => {
                await this.refreshLocalServerToken();
                return this.downloadRecord();
            }, TIME_OUT_MS);
        }
    }
    /**静默获取token */
    async refreshLocalServerToken() {
        // console.log("refreshLocalServerToken");
        let url = exports.SDKConfigV2.debug ? exports.SDKConfigV2.refreshlocalServerTokenServiceUrlDEV : exports.SDKConfigV2.refreshlocalServerTokenServiceUrlRELEASE;
        this.loginInfo = Object.assign({}, this.loginInfo);
        let body = {
            refreshToken: this.loginInfo.localServerRefreshToken,
            appId: exports.SDKConfigV2.gameId
        };
        let refreshTokenResponseStr = await SDKServer_1.default.refreshTokenServerHttp.post(url, TIME_OUT_MS, JSON.stringify(body), "application/json");
        // console.log("refreshLocalServerToken refreshTokenResponseStr = ", refreshTokenResponseStr);
        if (refreshTokenResponseStr && "" !== refreshTokenResponseStr.trim()) {
            let refreshTokenResponseJson = JSON.parse(refreshTokenResponseStr);
            if (refreshTokenResponseJson["subject"] && refreshTokenResponseJson["refreshToken"] && refreshTokenResponseJson["serviceTokens"]) {
                let commonToken = refreshTokenResponseJson["serviceTokens"]["*"];
                let recordToken = refreshTokenResponseJson["serviceTokens"]["archive"];
                let RloginInfo = {
                    channelAccessToken: this.loginInfo.channelAccessToken,
                    localServerPublicServiceToken: commonToken,
                    localServerRecordServiceToken: recordToken ? recordToken : commonToken,
                    localServerRefreshToken: refreshTokenResponseJson["refreshToken"],
                    localServerSubject: refreshTokenResponseJson["subject"],
                    playerId: refreshTokenResponseJson["subject"].split("_")[1]
                };
                this.loginInfo = RloginInfo;
            }
        }
    }
    getHttpHeaders() {
        this.loginInfo = Object.assign({}, this.loginInfo);
        return {
            "IcesimbaToken": this.loginInfo.token,
            "IcesimbaSession": this.loginInfo.session,
            "Content-Type": "application/json"
        };
    }
    isLoggedIn() {
        return !!this.loginInfo;
    }
    getLoginInfo() {
        return this.loginInfo;
    }
    uploadGameRecord(data) {
        if (this.getChannel() !== "dummy") {
            if (!this.isLoggedIn()) {
                console.error("SDK not logged in yet.");
                return;
            }
            SDKRecordsData_1.uploadSDKRecord({ game: data });
        }
    }
    getGameRecord() {
        return SDKRecordsData_1.getSDKRecord().game;
    }
    async bi(category, id, gameBasicMetrics, gameData) {
        if (exports.V2) {
            return;
        }
        if (this.getChannel() === "dummy")
            return;
        const biData = Object.assign({}, gameBasicMetrics);
        this.loginInfo = Object.assign({}, this.loginInfo);
        const registerTime = convertDate(this.loginInfo.createTime);
        biData["client_time"] = (new Date()).toISOString();
        biData["session_id"] = this.loginInfo.session;
        biData["uuid"] = this.loginInfo.playerId;
        biData["uuid_create_time"] = registerTime;
        biData["user_id"] = this.loginInfo.playerId;
        biData["user_register_time"] = registerTime;
        //todo
        biData["user_register_channel_id"] = this.getChannel();
        biData["user_register_channel_source"] = "";
        biData["channel_id"] = this.getChannel();
        biData["channel_source"] = "";
        biData["game_version"] = exports.SDKConfig.gameVersion;
        biData["game_id"] = exports.SDKConfig.gameId;
        biData["category"] = category;
        biData["id"] = id;
        biData["game_data"] = gameData;
        biData["login_duration"] = TimeManager_1.TimeManager.getGameTime();
        biData["daily_duration"] = TimeManager_1.TimeManager.getTodayGameTime();
        biData["total_duration"] = TimeManager_1.TimeManager.getTotalGameTime();
        const deviceModel = {
            brand: this.systemInfo.deviceInfo.brand,
            model: this.systemInfo.deviceInfo.model,
            platform: this.systemInfo.deviceInfo.platform,
            system_version: this.systemInfo.deviceInfo.version,
            third_version: this.systemInfo.deviceInfo.SDKVersion
        };
        biData["device_model"] = deviceModel;
        biData["device_id"] = this.loginInfo.session;
        let postData = JSON.stringify(biData);
        const data = {
            data: postData,
            sign: new String(simba_utils_1.md5(postData + "d0dd883ae80667d27b924d1e52b78b59"))
        };
        return SDKServer_1.default.eventServer.post("/client/v1/event/log/put", 5000, JSON.stringify(data), "application/json", this.getHttpHeaders());
    }
}
exports.SDKBase = SDKBase;