ggejs
Version:
A powerful Node.js module for interacting with the server of Goodgame Empire & Goodgame Empire: Four Kingdoms
300 lines (286 loc) • 10.9 kB
JavaScript
const EmpireError = require("../tools/EmpireError");
const NAME = "gbd";
/** @type {CommandCallback<void>[]}*/
const callbacks = [];
module.exports.name = NAME;
/**
* @param {BaseClient} client
* @param {number} errorCode
* @param {Object} params
*/
module.exports.execute = function (client, errorCode, params) {
parseGBD(client, params);
require('.').baseExecuteCommand(client, undefined, errorCode, params, callbacks);
}
/**
* @param {BaseClient} client
* @returns {Promise<void>}
*/
module.exports.registerGbdListener = function (client) {
return new Promise((resolve, reject) => {
const id = require('crypto').randomUUID();
callbacks.push({id, clientId: client._id, match: () => true, resolve, reject});
setTimeout(() => {
const i = callbacks.findIndex(c => c.id === id);
if (i !== -1) callbacks.splice(i, 1);
resolve();
}, 1000);
});
}
module.exports.gbd = parseGBD;
/**
* @param {BaseClient} client
* @param {{WR: number, LA: number, ch: {HID: number}, [p: string]: Object}} params
* @return {Player}
*/
function parseGBD(client, params) {
client.clientUserData.wasResetted = params.WR === 1;
client.clientUserData.lastUserActivity = params.LA;
client.clientUserData.selectedHeroID = params.ch["HID"];
// castleUserData.parse_GAL(paramObj.gal);
// parseNestedJsonResponse("gcu");
// parseNestedJsonResponse("gho");
// parseNestedJsonResponse("gxp");
require('./gpi').gpi(client, params.gpi);
// parseNestedJsonResponse("upi");
// parseNestedJsonResponse("ufa");
// parseNestedJsonResponse("ufp");
// parseNestedJsonResponse("uar");
// parseNestedJsonResponse("gem");
// parseNestedJsonResponse("gpf");
// parseNestedJsonResponse("gms");
// parseNestedJsonResponse("gpc");
require('./gcl').gcl(client, params.gcl);
// parseNestedJsonResponse("kgv");
// parseNestedJsonResponse("uap");
// parseNestedJsonResponse("gri");
// parseNestedJsonResponse("gkl");
// parseNestedJsonResponse("vip");
// parseNestedJsonResponse("opt");
// parseNestedJsonResponse("pgl");
// parseNestedJsonResponse("boi");
// parseNestedJsonResponse("sei");
// parseNestedJsonResponse("tei");
// parseNestedJsonResponse("txi");
// parseNestedJsonResponse("rei");
// parseNestedJsonResponse("kpi");
// parseNestedJsonResponse("mpe");
// parseNestedJsonResponse("vli");
// parseNestedJsonResponse("dql");
// parseNestedJsonResponse("gli");
// parseNestedJsonResponse("drt");
// parseNestedJsonResponse("tmp");
// parseNestedJsonResponse("sce");
// parseNestedJsonResponse("esl");
require('./ggm').ggm(client, params.ggm);
// parseNestedJsonResponse("lts");
// parseNestedJsonResponse("skl");
// parseNestedJsonResponse("rww");
// parseNestedJsonResponse("dcl");
// parseNestedJsonResponse("ahl");
// parseNestedJsonResponse("gai");
// if (!_loc2_) {
// parseNestedJsonResponse("mre");
// parseNestedJsonResponse("gml");
// }
// parseNestedJsonResponse("sin");
// parseNestedJsonResponse("nrf");
// parseNestedJsonResponse("gatp");
// parseNestedJsonResponse("bie");
// parseNestedJsonResponse("ree");
// parseNestedJsonResponse("DTS");
// parseNestedJsonResponse("mvf");
// parseNestedJsonResponse("pre");
// parseNestedJsonResponse("gls");
// parseNestedJsonResponse("mcd");
for (const x in params) {
const msg = JSON.stringify(params[x]);
switch (x.toLowerCase()) {
case "WR".toLowerCase():
case "LA".toLowerCase():
case "ch":
case "gpi":
case "gcl":
case "ggm":
// Handled before for-loop
break;
case "gal":
case "gcu":
case "gho":
case "gxp":
case "upi":
case "ufa":
case "ufp":
case "uar":
case "gem":
case "gpf":
case "gms":
case "gpc":
case "kgv":
case "uap":
case "gri":
case "gkl":
case "vip":
case "opt":
case "pgl":
case "boi":
case "sei":
case "tei":
case "txi":
case "rei":
case "kpi":
case "mpe":
case "vli":
case "dql":
case "gli":
case "drt":
case "tmp":
case "sce":
case "esl":
case "lts":
case "skl":
case "rww":
case "dcl":
case "ahl":
case "gai":
case "mre":
case "gml":
case "sin":
case "nrf":
case "gatp":
case "bie":
case "ree":
case "DTS".toLowerCase():
case "mvf":
case "pre":
case "gls":
case "mcd":
//#region not handled in gbd source code
case "cpi":
case "gas":
case "gabgap":
case "gmu":
case "sne":
//#endregion
try {
client.logger.t('[RECEIVED-GBD]', x, '%', msg.substring(0, Math.min(140, msg.length)));
try {
require(`./${x.toLowerCase()}`)[x.toLowerCase()](client, params[x]);
client.logger.d("[GBD]", x, "should be handled outside switch statement, but it's not.")
} catch (e) {
require(`./onReceived/${x.toLowerCase()}`).execute(client, 0, params[x]);
}
} catch (e) {
client.logger.e("[GBD]", e);
}
break;
//#region not handled in gbd source code
case "atl":
case "dsd":
case "fcs":
case "gll":
case "scd":
//Not implemented in game
client.logger.t('[RECEIVED-GBD-not_implemented]', x, '%', msg.substring(0, Math.min(140, msg.length)));
break;
case "fii":
//Not implemented in game: Friend invite info
case "thi":
//Not implemented in game: Treasure hunt info
case "wbie":
//Not implemented in game: Welcome back message info event
client.logger.t('[RECEIVED-GBD-not_implemented]', x, '%', msg.substring(0, Math.min(140, msg.length)));
break;
default:
client.logger.t('[GBD Unknown] Unknown part in gbd command:', x, msg);
break;
//#endregion
}
}
setTimeout(() => handlePostGBDCommandInNextFrame(client), 10);
}
/** @param {BaseClient} client */
function handlePostGBDCommandInNextFrame(client) {
/* todo
* var _loc1_:LockConditionVO = null;
* var _loc2_:Boolean = autoReconnectionService.isAutoReconnected;
* if(!_loc2_)
* {
* restoreTutorialIfRuined();
* }
* enableIAPmanagerStartupIntervalSignal.dispatch(false);
* configureNotificationsSignal.dispatch();
* worldmapCameraData.currentCenteredWorldMapObject = castleListService.getMainCastleByKingdomId(kingdomData.activeKingdomID);
* if (!_loc2_) {
* startTutorialSignal.dispatch(true);
* }
* else {
* castleRemoveLoadingScreenSignal.dispatch();
* }
* restoreLastSessionGameStateSignal.dispatch();
* initMarketingTracking();
* helpshiftLoginSignal.dispatch();
* trackDevice();
* trackDisconnection();
*/
requestSubscriptionsData(client).catch(e => client.logger.w(new EmpireError(client, e)));
/*todo
* directCommandMap.map(InitPaymentShopCommand).execute();
* if (!featureRestrictionsModel.isFeatureRestrictedWithType("accountCode",FeatureRestrictionType.HIDDEN)) {
* directCommandMap.map(MobileWebShopGetAccountIdCommand).execute();
* }
* sendInstallerPackageSignal.dispatch();
* requestTimeForRuinPushNotification();
*/
requestLoginBonusInfo(client).catch(e => client.logger.w(new EmpireError(client, e)));
requestMessagesData(client).catch(e => client.logger.w(new EmpireError(client, e)));
requestAllianceData(client).catch(e => client.logger.w(new EmpireError(client, e)));
requestBookmarkData(client).catch(e => client.logger.w(new EmpireError(client, e)));
requestConstructionItemInventory(client).catch(e => client.logger.w(new EmpireError(client, e)));
requestGeneralsInnData(client).catch(e => client.logger.w(new EmpireError(client, e)));
/* todo
showAccountForcedDialog();
directCommandMap.map(SendDeviceMetaDataCommand).execute();
gameStatusModel.gameIsListening = true;
stopCachingJsonCommandsSignal.dispatch();
connectionLostModel.reset();
if (lockConditionModel.hasCondition()) {
_loc1_ = lockConditionModel.hasCondition();
debug("client has lock condition in GBD:",_loc1_.originalConditionIds + ", find the original reason where it came from and clean");
lockConditionModel.conditionComplete();
}
*/
}
/** @param {BaseClient} client */
async function requestGeneralsInnData(client) {
await require('./gcs').getCharactersStatus(client);
}
/** @param {BaseClient} client */
async function requestBookmarkData(client) {
await require('./gbl').getBookmarkList(client);
}
/** @param {BaseClient} client */
async function requestConstructionItemInventory(client) {
await require('./gii').getConstructionItemInventory(client);
}
/** @param {BaseClient} client */
async function requestMessagesData(client) {
await require('./sne').showMessages(client);
}
/** @param {BaseClient} client */
async function requestAllianceData(client) {
if (client.clientUserData.allianceId >= 0) {
await require('./ain').getAllianceInfo(client, client.clientUserData.allianceId);
await require('./afa').getAllianceFame(client);
await require('./acl').getAllianceChatHistory(client);
}
}
/** @param {BaseClient} client */
async function requestSubscriptionsData(client) {
await require('./sie').getSubscriptionsInformation(client);
}
/** @param {BaseClient} client */
async function requestLoginBonusInfo(client) {
await require('./alb').getLoginBonus(client);
require('./sli').getStartupLoginBonus(client).catch(e=>e);
}