ggejs
Version:
A powerful Node.js module for interacting with the server of Goodgame Empire & Goodgame Empire: Four Kingdoms
163 lines (143 loc) • 6.13 kB
JavaScript
'use strict'
const EventEmitter = require('node:events');
const {NetworkInstance, languages} = require('e4k-data');
const {sendAllianceChat} = require("./commands/acm");
const {joinArea} = require('./commands/jaa');
const {pingpong} = require("./commands/pin");
const {sendMessage} = require("./commands/sms");
const AllianceManager = require('./managers/AllianceManager');
const ClientUserDataManager = require("./managers/ClientUserDataManager");
const EquipmentManager = require("./managers/EquipmentManager");
const MovementManager = require('./managers/MovementManager');
const PlayerManager = require('./managers/PlayerManager');
const SocketManager = require("./managers/SocketManager");
const WorldMapManager = require('./managers/WorldMapManager');
const PremiumBoostData = require("./structures/boosters/PremiumBoostData");
const QuestData = require("./structures/quests/QuestData");
const EmpireError = require("./tools/EmpireError");
const Logger = require("./tools/Logger");
class BaseClient extends EventEmitter {
/** @type {{token:string, tokenExpirationDate: Date}} */
#apiToken;
uniqueAccountId = "";
bannedUntil = new Date(0);
_networkId = -1;
logger = new Logger();
/** @param {NetworkInstance} serverInstance */
constructor(serverInstance) {
super();
this._id = require('crypto').randomUUID();
this.socketManager = new SocketManager(this, serverInstance);
this.alliances = new AllianceManager(this);
this.clientUserData = new ClientUserDataManager();
this.clientUserData.boostData = new PremiumBoostData(this);
this.clientUserData.questData = new QuestData(this);
this.equipments = new EquipmentManager(this);
this.movements = new MovementManager(this);
this.players = new PlayerManager(this);
this.worldMaps = new WorldMapManager(this);
}
//#region TODO: MOVE TO CORRECT MANAGER
/** @type {MailMessage[]} */
_mailMessages = [];
/** @return {MailMessage[]} */
get mailMessages() {
return this._mailMessages;
}
/** @type {ActiveEvent[]} */
_activeSpecialEvents = [];
//#endregion
get _socket() {
return this.socketManager.socket;
}
_language = 'en';
/** @param {string} val */
set language(val) {
if (languages[val] == null) return;
this._language = val;
}
/** @param {number} val */
set reconnectTimeout(val) {
this.socketManager.reconnectTimeout = val;
}
/** @param {{token:string, tokenExpirationDate: Date}} val */
set _apiToken(val) {
this.#apiToken = val;
(async () => {
try {
const gameId = 16;
const f = await fetch(`https://accounts.public.ggs-ep.com/players/${gameId}-${this._networkId}-${this.socketManager.serverInstance.value}-${this.clientUserData.playerId}/gnip-phrase`, {
headers: {Authorization: `Bearer ${val.token}`}
});
this.uniqueAccountId = JSON.parse(Buffer.from(await f.arrayBuffer()).toString())["gnipPhrase"] ?? "";
/*
const f2 = await fetch(`https://accounts.public.ggs-ep.com/players/${gameId}-${this._networkId}-${this.socketManager.serverInstance.value}-${this.clientUserData.playerId}/onetime-links/mbs`, {
headers: {Authorization: `Bearer ${val.token}`}
});
this.webshopOneTimeLink = JSON.parse(Buffer.from(await f2.arrayBuffer()).toString())["link"];
const storeId = "googleplay" // "googleplay" || "local";
const f3 = await fetch(`https://mobile-payments.public.ggs-e4k.com/api/players/${gameId}-${this._networkId}-${this.socketManager.serverInstance.value}-${this.clientUserData.playerId}/catalog/${storeId}`, {
headers: {Authorization: `Bearer ${val.token}`}
});
this.logger.d( JSON.parse(Buffer.from(await f3.arrayBuffer()).toString()) );
*/
} catch (e) {
this.logger.d(e);
}
})();
}
async _reconnect(){}
async _sendPingPong() {
try {
await pingpong(this);
} catch (errorCode) {
throw new EmpireError(this, errorCode);
}
}
/** @param {string} message */
async sendChatMessage(message) {
try {
// TODO(?): Move into MyAlliance
await sendAllianceChat(this, message);
} catch (errorCode) {
throw new EmpireError(this, errorCode);
}
}
/**
* @param {string} playerName
* @param {string} subject
* @param {string} message
*/
async sendMailMessage(playerName, subject, message) {
try {
await sendMessage(this, playerName, subject, message);
} catch (errorCode) {
const overrideTextId = (() => {
switch (errorCode) {
case 12:
return this.clientUserData.userXp < 1080 ? 'errorCode_12' : 'alert_writeNewMessage_blocked_lowLevel';
case 68:
return 'dialog_receiverNotFound';
case 98:
return 'alert_textTooShort';
default:
return '';
}
})();
throw new EmpireError(this, errorCode, overrideTextId);
}
}
/**
* @param {InteractiveMapobject} mapObject
* @returns {Promise<Castle>}
*/
async getCastleInfo(mapObject) {
if (!mapObject || !mapObject.objectId) throw new EmpireError(this, "WorldMapArea is not valid");
try {
return await joinArea(this, mapObject);
} catch (errorCode) {
throw new EmpireError(this, errorCode);
}
}
}
module.exports = BaseClient;