190 lines
6.1 KiB
TypeScript
190 lines
6.1 KiB
TypeScript
|
import { _decorator } from 'cc';
|
||
|
import * as CryptoES from 'crypto-es';
|
||
|
import { GameManager } from '../Manager/GameManager';
|
||
|
export let CryptoESDefault = CryptoES.default;
|
||
|
|
||
|
const { ccclass, property } = _decorator;
|
||
|
|
||
|
@ccclass('BEConnector')
|
||
|
export default class BEConnector {
|
||
|
public static _instance: BEConnector = null;
|
||
|
|
||
|
private token: string;
|
||
|
private skinId: string;
|
||
|
private tournamentId: string;
|
||
|
private key: string;
|
||
|
private deviceInfo: string;
|
||
|
|
||
|
// Ticket infors
|
||
|
public numberTicket: number;
|
||
|
public maxScore: number;
|
||
|
private mileStone: string;
|
||
|
|
||
|
private gameURL: string = '';
|
||
|
|
||
|
public static get instance() {
|
||
|
if (null == this._instance) {
|
||
|
this._instance = new BEConnector();
|
||
|
}
|
||
|
return this._instance;
|
||
|
}
|
||
|
|
||
|
constructor() {
|
||
|
this.getGameData();
|
||
|
}
|
||
|
|
||
|
public getGameData() {
|
||
|
let url = new URLSearchParams(window.location.search);
|
||
|
|
||
|
this.token = url.get('token');
|
||
|
this.skinId = url.get('skinId');
|
||
|
this.tournamentId = url.get('tournamentId');
|
||
|
this.deviceInfo = url.get('deviceInfo');
|
||
|
|
||
|
this.numberTicket = parseInt(url.get('numberTicket'));
|
||
|
this.maxScore = parseInt(url.get('maxScore'));
|
||
|
this.mileStone = url.get('mileStone');
|
||
|
this.gameURL = ENV_CONFIG[url.get('env')];
|
||
|
}
|
||
|
|
||
|
public async authenticate() {
|
||
|
await fetch(
|
||
|
`${this.gameURL}/promotions/authenticate-tournament?token=${this.token}&tournamentId=${this.tournamentId}&skinId=${this.skinId}&deviceInfo=${this.deviceInfo}`,
|
||
|
)
|
||
|
.then((response) => {
|
||
|
if (response.ok) {
|
||
|
return response.json();
|
||
|
}
|
||
|
})
|
||
|
.then((data) => {
|
||
|
if (data.ResultCode == 1) {
|
||
|
this.key = data.Data.Key;
|
||
|
console.log('authen success', this.key);
|
||
|
} else {
|
||
|
throw new Error('');
|
||
|
}
|
||
|
})
|
||
|
.catch((err) => console.log('authen failed'));
|
||
|
}
|
||
|
|
||
|
public ticketMinus(type: 'auth' | 'revive') {
|
||
|
let numberTicket = type === 'auth' ? 1 : this.getTicketCanBeMinus();
|
||
|
let dataEncrypted: string = this.getDataEncrypted({ type: type, total: numberTicket });
|
||
|
|
||
|
fetch(`${this.gameURL}/promotions/ticket-minus/${this.tournamentId}/${this.skinId}?cocos=1`, {
|
||
|
headers: {
|
||
|
Accept: 'application/json',
|
||
|
'Content-Type': 'application/json',
|
||
|
'x-access-refactor-token': this.token,
|
||
|
},
|
||
|
method: 'POST',
|
||
|
body: JSON.stringify({ data: dataEncrypted }),
|
||
|
}).then(() => {
|
||
|
this.numberTicket -= numberTicket;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public calculatingTicketToContinue(scoreRange: object, yourScore: number) {
|
||
|
let closestMilestone: number = 0;
|
||
|
for (const milestone in scoreRange) {
|
||
|
if (parseInt(milestone) <= yourScore) {
|
||
|
closestMilestone = scoreRange[milestone];
|
||
|
}
|
||
|
}
|
||
|
if (!closestMilestone) {
|
||
|
const minValue = Math.min(...Object.values(scoreRange));
|
||
|
closestMilestone = minValue;
|
||
|
}
|
||
|
return closestMilestone;
|
||
|
}
|
||
|
|
||
|
public async checkGameScoreTicket() {
|
||
|
let totalScore: number = GameManager.instance.score;
|
||
|
let dataEncrypted: string = this.getDataEncrypted({ score: totalScore, ticket: this.getTicketCanBeMinus() });
|
||
|
|
||
|
await fetch(`${this.gameURL}/promotions/check-game-score-ticket/${this.tournamentId}/${this.skinId}?cocos=1`, {
|
||
|
headers: {
|
||
|
Accept: 'application/json',
|
||
|
'Content-Type': 'application/json',
|
||
|
'x-access-refactor-token': this.token,
|
||
|
},
|
||
|
method: 'POST',
|
||
|
body: JSON.stringify({ data: dataEncrypted }),
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public postMessage() {
|
||
|
let totalScore: number = GameManager.instance.score;
|
||
|
// window.parent.postMessage(
|
||
|
// JSON.stringify({
|
||
|
// error: false,
|
||
|
// message: "Hello World",
|
||
|
// score: totalScore,
|
||
|
// type: "paypal_modal",
|
||
|
// }),
|
||
|
// "*"
|
||
|
// );
|
||
|
setTimeout(() => {
|
||
|
BEConnector.instance.numberTicket += 5;
|
||
|
GameManager.instance.onRevive();
|
||
|
}, 2000);
|
||
|
}
|
||
|
|
||
|
public postScoreToServer(score: number) {
|
||
|
let dataEncrypted: string = this.getDataEncrypted({
|
||
|
Score: score,
|
||
|
TournamentId: this.tournamentId,
|
||
|
SkinId: this.skinId,
|
||
|
});
|
||
|
|
||
|
fetch(
|
||
|
`${this.gameURL}/promotions/store-score-tournament?tournamentId=${this.tournamentId}&skinId=${this.skinId}&cocos=1`,
|
||
|
{
|
||
|
headers: {
|
||
|
Accept: 'application/json',
|
||
|
'Content-Type': 'application/json',
|
||
|
'x-access-refactor-token': this.token,
|
||
|
},
|
||
|
method: 'POST',
|
||
|
body: JSON.stringify({ data: dataEncrypted }),
|
||
|
},
|
||
|
).catch((err) => console.log(err));
|
||
|
console.log('send score to server: ' + score);
|
||
|
|
||
|
window.parent.postMessage(
|
||
|
JSON.stringify({
|
||
|
error: false,
|
||
|
message: 'Hello World',
|
||
|
score: score,
|
||
|
type: 'game_tournament',
|
||
|
}),
|
||
|
'*',
|
||
|
);
|
||
|
}
|
||
|
|
||
|
private getDataEncrypted(data: any): string {
|
||
|
return CryptoESDefault.AES.encrypt(JSON.stringify(data), this.key, {
|
||
|
iv: CryptoESDefault.enc.Utf8.parse('16'),
|
||
|
mode: CryptoESDefault.mode.CBC,
|
||
|
padding: CryptoESDefault.pad.Pkcs7,
|
||
|
}).toString();
|
||
|
}
|
||
|
|
||
|
public getTicketCanBeMinus() {
|
||
|
let mileStone = JSON.parse(this.mileStone);
|
||
|
let currentScore = GameManager.instance.score;
|
||
|
let total = this.calculatingTicketToContinue(mileStone, currentScore);
|
||
|
return total;
|
||
|
}
|
||
|
|
||
|
public canRelive() {
|
||
|
return this.numberTicket > this.getTicketCanBeMinus();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const ENV_CONFIG = {
|
||
|
development: 'http://192.168.1.144:3009/api',
|
||
|
staging: 'https://api.play4promote.com/api',
|
||
|
production: 'https://api.play4promo.com/api',
|
||
|
};
|