const i18n = require('LanguageData'); i18n.init(window.language); // languageID should be equal to the one we input in New Language ID input field cc.Class({ extends: cc.Component, properties: { cavasNode: { default: null, type: cc.Node }, backgroundNode: { default: null, type: cc.Node }, interactiveControls: { default: null, type: cc.Node }, phoneLabel: { default: null, type: cc.Node }, smsLoginCaptchaLabel: { default: null, type: cc.Node }, phoneCountryCodeInput: { default: null, type: cc.Node }, phoneNumberInput: { type: cc.Node, default: null }, phoneNumberTips: { type: cc.Node, default: null }, smsLoginCaptchaInput: { type: cc.Node, default: null }, smsLoginCaptchaButton: { type: cc.Node, default: null }, captchaTips: { type: cc.Node, default: null }, loginButton: { type: cc.Node, default: null }, smsWaitCountdownPrefab: { default: null, type: cc.Prefab }, loadingPrefab: { default: null, type: cc.Prefab }, wechatLoginTips: { default: null, type: cc.Label, }, }, // LIFE-CYCLE CALLBACKS: onLoad() { //kobako: 腾讯统计代码 //WARN: 打包到微信小游戏的时候会导致出错 /* (function() { var mta = document.createElement("script"); mta.src = "//pingjs.qq.com/h5/stats.js?v2.0.4"; mta.setAttribute("name", "MTAH5"); mta.setAttribute("sid", "500674632"); var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(mta, s); })(); */ window.atFirstLocationHref = window.location.href.split('#')[0]; const self = this; self.getRetCodeList(); self.getRegexList(); const isUsingX5BlinkKernelOrWebkitWeChatKernel = window.isUsingX5BlinkKernelOrWebkitWeChatKernel(); //const isUsingX5BlinkKernelOrWebkitWeChatKernel = true; if (!CC_DEBUG) { self.phoneNumberTips.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.smsLoginCaptchaButton.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.captchaTips.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.phoneCountryCodeInput.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.phoneNumberInput.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.smsLoginCaptchaInput.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.phoneLabel.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.smsLoginCaptchaLabel.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; self.loginButton.active = !isUsingX5BlinkKernelOrWebkitWeChatKernel; } self.checkPhoneNumber = self.checkPhoneNumber.bind(self); self.checkIntAuthTokenExpire = self.checkIntAuthTokenExpire.bind(self); self.checkCaptcha = self.checkCaptcha.bind(self); self.onSMSCaptchaGetButtonClicked = self.onSMSCaptchaGetButtonClicked.bind(self); self.smsLoginCaptchaButton.on('click', self.onSMSCaptchaGetButtonClicked); self.loadingNode = cc.instantiate(this.loadingPrefab); self.smsGetCaptchaNode = self.smsLoginCaptchaButton.getChildByName('smsGetCaptcha'); self.smsWaitCountdownNode = cc.instantiate(self.smsWaitCountdownPrefab); const qDict = window.getQueryParamDict(); if (null != qDict && qDict["expectedRoomId"]) { window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); } cc.loader.loadRes("pbfiles/room_downsync_frame", function(err, textAsset /* cc.TextAsset */ ) { if (err) { cc.error(err.message || err); return; } if (false == (cc.sys.platform == cc.sys.WECHAT_GAME)) { // Otherwise, `window.RoomDownsyncFrame` is already assigned. let protoRoot = new protobuf.Root; window.protobuf.parse(textAsset.text, protoRoot); window.RoomDownsyncFrame = protoRoot.lookupType("treasurehunterx.RoomDownsyncFrame"); window.BattleColliderInfo = protoRoot.lookupType("treasurehunterx.BattleColliderInfo"); window.WsReq = protoRoot.lookupType("treasurehunterx.WsReq"); window.WsResp = protoRoot.lookupType("treasurehunterx.WsResp"); } self.checkIntAuthTokenExpire().then( () => { const intAuthToken = JSON.parse(cc.sys.localStorage.getItem('selfPlayer')).intAuthToken; self.useTokenLogin(intAuthToken); }, () => { window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); if ( (CC_DEBUG || isUsingX5BlinkKernelOrWebkitWeChatKernel) ) { if (null != qDict && qDict["code"]) { const code = qDict["code"]; console.log("Got the wx authcode: ", code, "while at full url: " + window.location.href); self.useWXCodeLogin(code); } else { if (isUsingX5BlinkKernelOrWebkitWeChatKernel) { self.getWechatCode(null); } else { // Deliberately left blank. } } } } ); }); }, getRetCodeList() { const self = this; self.retCodeDict = constants.RET_CODE; }, getRegexList() { const self = this; self.regexList = { EMAIL: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, PHONE: /^\+?[0-9]{8,14}$/, STREET_META: /^.{5,100}$/, LNG_LAT_TEXT: /^[0-9]+(\.[0-9]{4,6})$/, SEO_KEYWORD: /^.{2,50}$/, PASSWORD: /^.{6,50}$/, SMS_CAPTCHA_CODE: /^[0-9]{4}$/, ADMIN_HANDLE: /^.{4,50}$/, }; }, onSMSCaptchaGetButtonClicked(evt) { var timerEnable = true; const self = this; if (!self.checkPhoneNumber('getCaptcha')) { return; } NetworkUtils.ajax({ url: backendAddress.PROTOCOL + '://' + backendAddress.HOST + ':' + backendAddress.PORT + constants.ROUTE_PATH.API + constants.ROUTE_PATH.PLAYER + constants.ROUTE_PATH.VERSION + constants.ROUTE_PATH.SMS_CAPTCHA + constants.ROUTE_PATH.GET, type: 'GET', data: { phoneCountryCode: self.phoneCountryCodeInput.getComponent(cc.EditBox).string, phoneNum: self.phoneNumberInput.getComponent(cc.EditBox).string }, success: function(res) { switch (res.ret) { case self.retCodeDict.OK: self.phoneNumberTips.getComponent(cc.Label).string = ''; self.captchaTips.getComponent(cc.Label).string = ''; break; case self.retCodeDict.DUPLICATED: self.phoneNumberTips.getComponent(cc.Label).string = constants.ALERT.TIP_LABEL.LOG_OUT; break; case self.retCodeDict.INCORRECT_PHONE_COUNTRY_CODE_OR_NUMBER: self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.PHONE_ERR"); break; case self.retCodeDict.IS_TEST_ACC: self.smsLoginCaptchaInput.getComponent(cc.EditBox).string = res.smsLoginCaptcha; self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.TEST_USER"); timerEnable = false; // clearInterval(self.countdownTimer); break; case self.retCodeDict.SMS_CAPTCHA_REQUESTED_TOO_FREQUENTLY: self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.SMS_CAPTCHA_FREEQUENT_REQUIRE"); default: break; } if (timerEnable) self.countdownTime(self); } }); }, countdownTime(self) { self.smsLoginCaptchaButton.off('click', self.onSMSCaptchaGetButtonClicked); self.smsLoginCaptchaButton.removeChild(self.smsGetCaptchaNode); self.smsWaitCountdownNode.parent = self.smsLoginCaptchaButton; var total = 20; // Magic number self.countdownTimer = setInterval(function() { if (total === 0) { self.smsWaitCountdownNode.parent.removeChild(self.smsWaitCountdownNode); self.smsGetCaptchaNode.parent = self.smsLoginCaptchaButton; self.smsWaitCountdownNode.getChildByName('WaitTimeLabel').getComponent(cc.Label).string = 20; self.smsLoginCaptchaButton.on('click', self.onSMSCaptchaGetButtonClicked); clearInterval(self.countdownTimer); } else { total--; self.smsWaitCountdownNode.getChildByName('WaitTimeLabel').getComponent(cc.Label).string = total; } }, 1000) }, checkIntAuthTokenExpire() { return new Promise((resolve, reject) => { if (!cc.sys.localStorage.getItem('selfPlayer')) { reject(); return; } const selfPlayer = JSON.parse(cc.sys.localStorage.getItem('selfPlayer')); (selfPlayer.intAuthToken && new Date().getTime() < selfPlayer.expiresAt) ? resolve() : reject(); }) }, checkPhoneNumber(type) { const self = this; const phoneNumberRegexp = self.regexList.PHONE; var phoneNumberString = self.phoneNumberInput.getComponent(cc.EditBox).string; if (phoneNumberString) { return true; if (!phoneNumberRegexp.test(phoneNumberString)) { self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.PHONE_ERR"); return false; } else { return true; } } else { if (type === 'getCaptcha' || type === 'login') { self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.PHONE_ERR"); } return false; } }, checkCaptcha(type) { const self = this; const captchaRegexp = self.regexList.SMS_CAPTCHA_CODE; var captchaString = self.smsLoginCaptchaInput.getComponent(cc.EditBox).string; if (captchaString) { if (self.smsLoginCaptchaInput.getComponent(cc.EditBox).string.length !== 4 || (!captchaRegexp.test(captchaString))) { self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.CAPTCHA_ERR"); return false; } else { return true; } } else { if ('login' == type) { self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.CAPTCHA_ERR"); } return false; } }, useTokenLogin(_intAuthToken) { var self = this; NetworkUtils.ajax({ url: backendAddress.PROTOCOL + '://' + backendAddress.HOST + ':' + backendAddress.PORT + constants.ROUTE_PATH.API + constants.ROUTE_PATH.PLAYER + constants.ROUTE_PATH.VERSION + constants.ROUTE_PATH.INT_AUTH_TOKEN + constants.ROUTE_PATH.LOGIN, type: "POST", data: { intAuthToken: _intAuthToken }, success: function(resp) { self.onLoggedIn(resp); }, error: function(xhr, status, errMsg) { console.log("Login attempt `useTokenLogin` failed, about to execute `clearBoundRoomIdInBothVolatileAndPersistentStorage`."); window.clearBoundRoomIdInBothVolatileAndPersistentStorage() }, timeout: function() { self.enableInteractiveControls(true); }, }); }, enableInteractiveControls(enabled) { this.smsLoginCaptchaButton.getComponent(cc.Button).interactable = enabled; this.loginButton.getComponent(cc.Button).interactable = enabled; this.phoneCountryCodeInput.getComponent(cc.EditBox).enabled = enabled; this.phoneNumberInput.getComponent(cc.EditBox).enabled = enabled; this.smsLoginCaptchaInput.getComponent(cc.EditBox).enabled = enabled; if (enabled) { setVisible(this.interactiveControls); } else { setInvisible(this.interactiveControls); } }, onLoginButtonClicked(evt) { const self = this; if (!self.checkPhoneNumber('login') || !self.checkCaptcha('login')) { return; } self.loginParams = { phoneCountryCode: self.phoneCountryCodeInput.getComponent(cc.EditBox).string, phoneNum: self.phoneNumberInput.getComponent(cc.EditBox).string, smsLoginCaptcha: self.smsLoginCaptchaInput.getComponent(cc.EditBox).string }; self.enableInteractiveControls(false); NetworkUtils.ajax({ url: backendAddress.PROTOCOL + '://' + backendAddress.HOST + ':' + backendAddress.PORT + constants.ROUTE_PATH.API + constants.ROUTE_PATH.PLAYER + constants.ROUTE_PATH.VERSION + constants.ROUTE_PATH.SMS_CAPTCHA + constants.ROUTE_PATH.LOGIN, type: "POST", data: self.loginParams, success: function(resp) { self.onLoggedIn(resp); }, error: function(xhr, status, errMsg) { console.log("Login attempt `onLoginButtonClicked` failed, about to execute `clearBoundRoomIdInBothVolatileAndPersistentStorage`."); window.clearBoundRoomIdInBothVolatileAndPersistentStorage() }, timeout: function() { self.enableInteractiveControls(true); } }); }, onWechatLoggedIn(res) { const self = this; if (res.ret === self.retCodeDict.OK) { self.enableInteractiveControls(false); const date = Number(res.expiresAt); const selfPlayer = { expiresAt: date, playerId: res.playerId, intAuthToken: res.intAuthToken, displayName: res.displayName, avatar: res.avatar, } cc.sys.localStorage.setItem('selfPlayer', JSON.stringify(selfPlayer)); const qDict = window.getQueryParamDict(); const expectedRoomId = qDict["expectedRoomId"]; if (null != expectedRoomId) { console.log("onWechatLoggedIn using expectedRoomId == " + expectedRoomId); window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); } // To remove "code=XXX" in "query string". window.history.replaceState(qDict, null, window.location.pathname); self.useTokenLogin(res.intAuthToken); } else { cc.sys.localStorage.removeItem("selfPlayer"); window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); self.wechatLoginTips.string = constants.ALERT.TIP_LABEL.WECHAT_LOGIN_FAILS + ", errorCode = " + res.ret; // To remove "code=XXX" in "query string". window.history.replaceState({}, null, window.location.pathname); } }, onLoggedIn(res) { const self = this; cc.log(`OnLoggedIn ${JSON.stringify(res)}.`) if (res.ret === self.retCodeDict.OK) { if(window.isUsingX5BlinkKernelOrWebkitWeChatKernel()) { window.initWxSdk = self.initWxSdk.bind(self); window.initWxSdk(); } self.enableInteractiveControls(false); const date = Number(res.expiresAt); const selfPlayer = { expiresAt: date, playerId: res.playerId, intAuthToken: res.intAuthToken, avatar: res.avatar, displayName: res.displayName, name: res.name, } cc.sys.localStorage.setItem('selfPlayer', JSON.stringify(selfPlayer)); console.log("cc.sys.localStorage.selfPlayer = ", cc.sys.localStorage.getItem('selfPlayer')); if (self.countdownTimer) { clearInterval(self.countdownTimer); } const inputControls = self.backgroundNode.getChildByName("InteractiveControls"); self.backgroundNode.removeChild(inputControls); safelyAddChild(self.backgroundNode, self.loadingNode); self.loadingNode.getChildByName('loadingSprite').runAction( cc.repeatForever(cc.rotateBy(1.0, 360)) ); cc.director.loadScene('default_map'); } else { cc.sys.localStorage.removeItem("selfPlayer"); window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); self.enableInteractiveControls(true); switch (res.ret) { case self.retCodeDict.DUPLICATED: this.phoneNumberTips.getComponent(cc.Label).string = constants.ALERT.TIP_LABEL.LOG_OUT; break; case this.retCodeDict.TOKEN_EXPIRED: this.captchaTips.getComponent(cc.Label).string = constants.ALERT.TIP_LABEL.TOKEN_EXPIRED; break; case this.retCodeDict.SMS_CAPTCHA_NOT_MATCH: self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.SMS_CAPTCHA_NOT_MATCH"); break; case this.retCodeDict.INCORRECT_CAPTCHA: self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.SMS_CAPTCHA_NOT_MATCH"); break; case this.retCodeDict.SMS_CAPTCHA_CODE_NOT_EXISTING: self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.SMS_CAPTCHA_NOT_MATCH"); break; case this.retCodeDict.INCORRECT_PHONE_NUMBER: self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.INCORRECT_PHONE_NUMBER"); break; case this.retCodeDict.INVALID_REQUEST_PARAM: self.captchaTips.getComponent(cc.Label).string = i18n.t("login.tips.INCORRECT_PHONE_NUMBER"); break; case this.retCodeDict.INCORRECT_PHONE_COUNTRY_CODE: this.captchaTips.getComponent(cc.Label).string = constants.ALERT.TIP_LABEL.INCORRECT_PHONE_COUNTRY_CODE; break; default: break; } } }, useWXCodeLogin(_code) { const self = this; NetworkUtils.ajax({ url: backendAddress.PROTOCOL + '://' + backendAddress.HOST + ':' + backendAddress.PORT + constants.ROUTE_PATH.API + constants.ROUTE_PATH.PLAYER + constants.ROUTE_PATH.VERSION + constants.ROUTE_PATH.WECHAT + constants.ROUTE_PATH.LOGIN, type: "POST", data: { code: _code }, success: function(res) { self.onWechatLoggedIn(res); }, error: function(xhr, status, errMsg) { console.log("Login attempt `useWXCodeLogin` failed, about to execute `clearBoundRoomIdInBothVolatileAndPersistentStorage`."); cc.sys.localStorage.removeItem("selfPlayer"); window.clearBoundRoomIdInBothVolatileAndPersistentStorage(); self.wechatLoginTips.string = constants.ALERT.TIP_LABEL.WECHAT_LOGIN_FAILS + ", errorMsg =" + errMsg; window.history.replaceState({}, null, window.location.pathname); }, }); }, getWechatCode(evt) { let self = this; self.wechatLoginTips.string = ""; const wechatServerEndpoint = wechatAddress.PROTOCOL + "://" + wechatAddress.HOST + ((null != wechatAddress.PORT && "" != wechatAddress.PORT.trim()) ? (":" + wechatAddress.PORT) : ""); const url = wechatServerEndpoint + constants.WECHAT.AUTHORIZE_PATH + "?" + wechatAddress.APPID_LITERAL + "&" + constants.WECHAT.REDIRECT_RUI_KEY + NetworkUtils.encode(window.location.href) + "&" + constants.WECHAT.RESPONSE_TYPE + "&" + constants.WECHAT.SCOPE + constants.WECHAT.FIN; console.log("To visit wechat auth addr: " + url); window.location.href = url; }, initWxSdk() { const selfPlayer = JSON.parse(cc.sys.localStorage.getItem('selfPlayer')); const origUrl = window.location.protocol + "//" + window.location.host + window.location.pathname; /* * The `shareLink` must * - have its 2nd-order-domain registered as trusted 2nd-order under the targetd `res.jsConfig.app_id`, and * - extracted from current window.location.href. */ const shareLink = origUrl; const updateAppMsgShareDataObj = { type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 title: document.title, // 分享标题 desc: 'Let\'s play together!', // 分享描述 link: shareLink + (cc.sys.localStorage.getItem('boundRoomId') ? "" : ("?expectedRoomId=" + cc.sys.localStorage.getItem('boundRoomId'))), imgUrl: origUrl + "/favicon.ico", // 分享图标 success: function() { // 设置成功 } }; const menuShareTimelineObj = { title: document.title, // 分享标题 link: shareLink + (cc.sys.localStorage.getItem('boundRoomId') ? "" : ("?expectedRoomId=" + cc.sys.localStorage.getItem('boundRoomId'))), imgUrl: origUrl + "/favicon.ico", // 分享图标 success: function() {} }; const wxConfigUrl = (window.isUsingWebkitWechatKernel() ? window.atFirstLocationHref : window.location.href); //接入微信登录接口 NetworkUtils.ajax({ "url": backendAddress.PROTOCOL + '://' + backendAddress.HOST + ':' + backendAddress.PORT + constants.ROUTE_PATH.API + constants.ROUTE_PATH.PLAYER + constants.ROUTE_PATH.VERSION + constants.ROUTE_PATH.WECHAT + constants.ROUTE_PATH.JSCONFIG, type: "POST", data: { "url": wxConfigUrl, "intAuthToken": selfPlayer.intAuthToken, }, success: function(res) { if (constants.RET_CODE.OK != res.ret) { console.log("cannot get the wsConfig. retCode == " + res.ret); return; } const jsConfig = res.jsConfig; console.log(updateAppMsgShareDataObj); const configData = { debug: CC_DEBUG, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: jsConfig.app_id, // 必填,公众号的唯一标识 timestamp: jsConfig.timestamp.toString(), // 必填,生成签名的时间戳 nonceStr: jsConfig.nonce_str, // 必填,生成签名的随机串 jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline'], signature: jsConfig.signature, // 必填,签名 }; console.log("config url: " + wxConfigUrl); console.log("wx.config: "); console.log(configData); wx.config(configData); console.log("Current window.location.href: " + window.location.href); wx.ready(function() { console.log("Here is wx.ready.") wx.onMenuShareAppMessage(updateAppMsgShareDataObj); wx.onMenuShareTimeline(menuShareTimelineObj); }); wx.error(function(res) { console.error("wx config fails and error is " + JSON.stringify(res)); }); }, error: function(xhr, status, errMsg) { console.log("cannot get the wsConfig. errMsg == " + errMsg); }, }); }, });