From c0c3a6adca8a44edcdc5214315bf5d7fc35c4104 Mon Sep 17 00:00:00 2001 From: Paulov Date: Mon, 11 Jul 2022 09:10:27 +0100 Subject: [PATCH] UPDATE: Various fixes to ensure Server.exe works --- _CreateBuildDir_Minimum.bat | 18 ++++++ bin/www.js | 20 +++---- core/initializer.js | 3 +- core/util/logger.js | 7 ++- package.json | 8 +-- src/Controllers/AccountController.js | 70 ++++++++++------------- src/Controllers/ResponseController.js | 2 +- src/Controllers/TradingController.js | 80 +++++++++++++++------------ src/classes/item.js | 7 ++- src/classes/profile.js | 60 ++++++++++---------- src/classes/ragfair.js | 7 +-- src/classes/trader.js | 2 +- src/functions/response.js | 2 +- 13 files changed, 153 insertions(+), 133 deletions(-) create mode 100644 _CreateBuildDir_Minimum.bat diff --git a/_CreateBuildDir_Minimum.bat b/_CreateBuildDir_Minimum.bat new file mode 100644 index 0000000..9f69a7a --- /dev/null +++ b/_CreateBuildDir_Minimum.bat @@ -0,0 +1,18 @@ +rmdir Build /s/q +mkdir Build + +copy "Server.exe" "Build/Server.exe" +xcopy "db" "Build/db/" /s/i/y +xcopy "res" "Build/res/" /s/i/y +xcopy "user" "Build/user/" /s/i/y + +rmdir "Build/user/cache/" /s/q +rmdir "Build/user/events/" /s/q +rmdir "Build/user/logs/" /s/q +rmdir "Build/user/profiles/" /s/q +rmdir "Build/user/mods" /s/q + +del "Build\user\configs\gameplay.json" /q +del "Build\user\configs\server.json" /q + +pause \ No newline at end of file diff --git a/bin/www.js b/bin/www.js index f98cfe4..5fec4c1 100644 --- a/bin/www.js +++ b/bin/www.js @@ -11,7 +11,7 @@ const app = require('../express/app'); const http = require('http'); const https = require('https'); const fs = require('fs'); -const ws = require('ws'); +// const ws = require('ws'); const { certificate } = require('./../core/server/certGenerator'); const { ConfigController } = require('./../src/Controllers/ConfigController') var serverIp = "127.0.0.1"; @@ -44,15 +44,15 @@ const httpsServer = https.createServer({ cert: certs.cert }, app); -const io = require('socket.io')(httpsServer,{ - perMessageDeflate :false -}); -io.on('connection', (socket) => { - console.log('a user connected'); - socket.on('disconnect', () => { - console.log('user disconnected'); - }); -}); +// const io = require('socket.io')(httpsServer,{ +// perMessageDeflate :false +// }); +// io.on('connection', (socket) => { +// console.log('a user connected'); +// socket.on('disconnect', () => { +// console.log('user disconnected'); +// }); +// }); /** ====================================================================================================== * Https Server running on whatever port determined by outcome above diff --git a/core/initializer.js b/core/initializer.js index 7d8ca92..07c47f6 100644 --- a/core/initializer.js +++ b/core/initializer.js @@ -354,7 +354,8 @@ class Initializer { for (let file of loadOrder) { loadedModules += file.replace(".js", ", "); let name = file.replace(".js", "").toLowerCase() + "_f"; // fixes the weaponbuilds.js file bug ... lol - global[name] = require(process.cwd() + "/src/classes/" + file); + // global[name] = require(process.cwd() + "/src/classes/" + file); + global[name] = require(__dirname + "/../src/classes/" + file); } // logger.logInfo("[Modules] " + loadedModules.slice(0, -2)); } diff --git a/core/util/logger.js b/core/util/logger.js index 7ef35cd..375977d 100644 --- a/core/util/logger.js +++ b/core/util/logger.js @@ -31,12 +31,17 @@ const colorData = [ class Logger { constructor() { let file = utility.getDate() + "_" + utility.getTime() + ".log"; + + if (!fileIO.exist('user')) { + fileIO.mkDir('user'); + } + let folder = "user/logs/"; let filepath = folder + file; // create log folder if (!fileIO.exist(folder)) { - +fileIO.mkDir(folder); + fileIO.mkDir(folder); } // create log file diff --git a/package.json b/package.json index cdefb62..d94a11d 100644 --- a/package.json +++ b/package.json @@ -19,15 +19,13 @@ "express": "^4.18.1", "mathjs": "^10.6.1", "selfsigned": "^2.0.1", - "socket.io": "^4.5.0", "uuid": "^8.3.2", - "write-json-file": "^4.3.0", - "ws": "^8.5.0" + "write-json-file": "^4.3.0" }, "bin": "bin/www.js", "pkg": { - "scripts": "", - "assets": "", + "scripts": [ "core/**/*.js", "src/**/*.js" ], + "assets": [ "res/**/*", "db/**/*", "public/**/*", "express/views/**/*" ], "targets": [ "node16-win" ] diff --git a/src/Controllers/AccountController.js b/src/Controllers/AccountController.js index acf82a1..f6c1f25 100644 --- a/src/Controllers/AccountController.js +++ b/src/Controllers/AccountController.js @@ -101,19 +101,20 @@ class AccountController return fullyLoadedAccounts; } - static reloadAccountBySessionID(sessionID) { + static reloadAccountBySessionID(sessionID) { if (!fileIO.exist(`./user/profiles/${sessionID}/account.json`)) { logger.logWarning(`Account file for account ${sessionID} does not exist.`); } else { // Does the session exist? - if (!AccountController.accounts[sessionID]) { + if (AccountController.accounts[sessionID] === undefined) { logger.logWarning(`Tried to load session ${sessionID} but it wasn't cached, loading.`); // Reload the account from disk. AccountController.accounts[sessionID] = fileIO.readParsed(`./user/profiles/${sessionID}/account.json`); - } else { - // Reload the account from disk. - AccountController.accounts[sessionID] = fileIO.readParsed(`./user/profiles/${sessionID}/account.json`); - } + } + // else { + // // Reload the account from disk. + // AccountController.accounts[sessionID] = fileIO.readParsed(`./user/profiles/${sessionID}/account.json`); + // } } } @@ -228,12 +229,11 @@ class AccountController } static getPmcPath(sessionID) { - let pmcPath = db.user.profiles.character; - return pmcPath.replace("__REPLACEME__", sessionID); + const path = `${process.cwd()}/user/profiles/${sessionID}/character.json`; + // console.log(path); + return path; } - - /* * Get profile with sessionID of type (profile type in string, i.e. 'pmc'). * If we don't have a profile for this sessionID yet, then load it and other related data @@ -333,7 +333,7 @@ class AccountController * If the sessionID is specified, AccountController function will save the specified account file to disk, if the file wasn't modified elsewhere and the current memory content differs from the content on disk. * @param {*} sessionID */ - static saveToDisk(sessionID) { + static saveToDisk(sessionID, force = false, releaseMemory = false) { if(sessionID === undefined) return; @@ -342,11 +342,16 @@ class AccountController fs.mkdirSync(`user/profiles/`); } - AccountController.saveToDiskAccount(sessionID); - AccountController.saveToDiskProfile(sessionID); + AccountController.saveToDiskAccount(sessionID, force); + AccountController.saveToDiskProfile(sessionID, force); + if(releaseMemory) { + delete AccountController.accounts[sessionID]; + delete AccountController.profiles[sessionID]; + logger.logSuccess(sessionID + " has been released from memory.") + } } - static saveToDiskAccount(sessionID) { + static saveToDiskAccount(sessionID, force = false) { // Does the account file exist? (Required for new accounts) if (!fileIO.exist(`./user/profiles/${sessionID}/account.json`)) { logger.logInfo(`Registering New account ${sessionID}.`); @@ -355,7 +360,7 @@ class AccountController } else { let currentAccount = AccountController.accounts[sessionID]; let savedAccount = fileIO.readParsed(`./user/profiles/${sessionID}/account.json`); - if (JSON.stringify(currentAccount) !== JSON.stringify(savedAccount)) { + if (force || JSON.stringify(currentAccount) !== JSON.stringify(savedAccount)) { // Save memory content to disk fileIO.write(`./user/profiles/${sessionID}/account.json`, AccountController.accounts[sessionID]); logger.logSuccess(`Account file for account ${sessionID} was saved to disk.`); @@ -363,10 +368,10 @@ class AccountController } } - static saveToDiskProfile(sessionID) { + static saveToDiskProfile(sessionID, force = false) { // Check if a PMC character exists in the server memory. if (AccountController.profiles[sessionID] === undefined) { - logger.logError(`Profile ${sessionID} doesn't exist in memory`); + // logger.logError(`Profile ${sessionID} doesn't exist in memory`); return; } @@ -374,7 +379,7 @@ class AccountController let prof = AccountController.getPmcProfile(sessionID); // prof = AccountController.FixTradersInfo(prof); const diskProf = JSON.stringify(JSON.parse(fs.readFileSync(profilePath))); - if(diskProf !== JSON.stringify(prof)) { + if(force || diskProf !== JSON.stringify(prof)) { fileIO.write(profilePath, prof); logger.logSuccess(`Profile for AID ${sessionID} was saved.`); } @@ -441,8 +446,8 @@ class AccountController * @param {*} sessionID */ static createProfile(info, sessionID) { -console.log("createProfile"); -console.log(info); +// console.log("createProfile"); +// console.log(info); // Load account data // const account = AccountController.find(sessionID); @@ -500,7 +505,7 @@ console.log(info); // AccountController.setWipe(account.id, false); account.wipe = false; AccountController.initializeProfile(sessionID); - AccountController.saveToDisk(sessionID); + // AccountController.saveToDisk(sessionID); } /** @@ -584,7 +589,7 @@ console.log(info); // AccountController needs to be at the top to check for changed accounts. AccountController.reloadAccountBySessionID(sessionID); let account = AccountController.find(sessionID); - if (typeof account.lang == "undefined") { + if (account.lang === undefined) { account.lang = "en"; AccountController.saveToDisk(sessionID); } @@ -596,29 +601,14 @@ console.log(info); * @param {*} sessionID */ static reloadProfileBySessionID(sessionID) { - if (sessionID === undefined) { - logger.throwErr("Session ID is undefined"); - return; - } - try { + if(AccountController.profiles[sessionID] === undefined) { - // Check if the profile file exists - if (global.internal.fs.existsSync(AccountController.getPmcPath(sessionID))) { + if (fs.existsSync(AccountController.getPmcPath(sessionID))) { //Load the PMC profile from disk. AccountController.profiles[sessionID]["pmc"] = fileIO.readParsed(AccountController.getPmcPath(sessionID)); } - } catch (e) { - if (e instanceof SyntaxError) { - return logger.logError( - `There is a syntax error in the character.json file for AID ${sessionID}. This likely means you edited something improperly. Call stack: \n${e.stack}` - ); - } else { - logger.logData(sessionID); - logger.logError(`There was an issue loading the user profile with session ID ${sessionID}. Call stack:`); - logger.logData(e); - return; - } } + } } diff --git a/src/Controllers/ResponseController.js b/src/Controllers/ResponseController.js index 80ceea7..a2987ee 100644 --- a/src/Controllers/ResponseController.js +++ b/src/Controllers/ResponseController.js @@ -228,7 +228,7 @@ action: (url, info, sessionID) => { action: (url, info, sessionID) => { const account = AccountController.find(sessionID); account.wipe = false; - AccountController.saveToDisk(sessionID); + AccountController.saveToDisk(sessionID, true, true); } }, { diff --git a/src/Controllers/TradingController.js b/src/Controllers/TradingController.js index 22df7ea..b09cd05 100644 --- a/src/Controllers/TradingController.js +++ b/src/Controllers/TradingController.js @@ -418,7 +418,11 @@ static getLoyalty(pmcData, traderID) { break; } } - } else { return "ragfair" } + } + else { + // return "ragfair" + return playerLevel; + } return calculatedLoyalty; } @@ -475,42 +479,46 @@ static getLoyalty(pmcData, traderID) { const assort = TradingController.getTraderAssort(traderId, sessionID); const pmcData = AccountController.getPmcProfile(sessionID); const traderLevel = TradingController.getLoyalty(pmcData, traderId); - let traderQuestAssort = global._database.traders[traderId].questassort; - - // Get all items filtered by level - for (const key in assort.loyal_level_items) { - const requiredLevel = assort.loyal_level_items[key]; - if(requiredLevel <= traderLevel) { - const itemIndex = assort.items.findIndex(x=>x._id === key); - if(itemIndex !== -1) { - const questStatus = quest_f.getQuestStatus(pmcData, traderQuestAssort.started[key]); - - if ( - key in traderQuestAssort.started && questStatus !== "Started" - ) { - continue; - } - - if ( - key in traderQuestAssort.success && - quest_f.getQuestStatus(pmcData, traderQuestAssort.success[key]) !== - "Success" - ) { - continue; - } - - if ( - key in traderQuestAssort.fail && - quest_f.getQuestStatus(pmcData, traderQuestAssort.fail[key]) !== "Fail" - ) { - continue; + if (traderLevel !== "ragfair" + && traderId !== "ragfair" + && global._database.traders[traderId].questassort !== undefined) { + let traderQuestAssort = global._database.traders[traderId].questassort; + + // Get all items filtered by level + for (const key in assort.loyal_level_items) { + const requiredLevel = assort.loyal_level_items[key]; + if(requiredLevel <= traderLevel) { + const itemIndex = assort.items.findIndex(x=>x._id === key); + if(itemIndex !== -1) { + const questStatus = quest_f.getQuestStatus(pmcData, traderQuestAssort.started[key]); + + if ( + key in traderQuestAssort.started && questStatus !== "Started" + ) { + continue; + } + + if ( + key in traderQuestAssort.success && + quest_f.getQuestStatus(pmcData, traderQuestAssort.success[key]) !== + "Success" + ) { + continue; + } + + if ( + key in traderQuestAssort.fail && + quest_f.getQuestStatus(pmcData, traderQuestAssort.fail[key]) !== "Fail" + ) { + continue; + } + + newAssort.barter_scheme[key] = assort.barter_scheme[key]; + newAssort.loyal_level_items[key] = requiredLevel; + + const assortItem = assort.items[itemIndex]; + newAssort.items.push(assortItem); } - - newAssort.barter_scheme[key] = assort.barter_scheme[key]; - newAssort.loyal_level_items[key] = requiredLevel; - - const assortItem = assort.items[itemIndex]; - newAssort.items.push(assortItem); } } } diff --git a/src/classes/item.js b/src/classes/item.js index 4f464e4..3d3a129 100644 --- a/src/classes/item.js +++ b/src/classes/item.js @@ -69,8 +69,9 @@ class ItemServer { handleRoutes(info, sessionID) { this.resetOutput(sessionID); + let pmcData = AccountController.getPmcProfile(sessionID); + for (let body of info.data) { - let pmcData = AccountController.getPmcProfile(sessionID); if (body.Action in this.routes) { this.routes[body.Action](pmcData, body, sessionID); } else { @@ -95,12 +96,12 @@ class ItemServer { resetOutput(sessionID) { if (sessionID == "" || typeof sessionID == "undefined") { - logger.logError(`[MISSING SESSION ID] resetOutput(sessionID) is blank or undefined; returning.`); + // logger.logError(`[MISSING SESSION ID] resetOutput(sessionID) is blank or undefined; returning.`); return; } let _profile = AccountController.getPmcProfile(sessionID); if (utility.isUndefined(_profile)) { - logger.logError(`[MISSING PROFILE] Profile with sessionID: ${sessionID} is missing?`); + // logger.logError(`[MISSING PROFILE] Profile with sessionID: ${sessionID} is missing?`); return; } diff --git a/src/classes/profile.js b/src/classes/profile.js index 51d6db6..8572c4d 100644 --- a/src/classes/profile.js +++ b/src/classes/profile.js @@ -62,37 +62,37 @@ class ProfileServer { logger.logSuccess(`Loaded profile for AID ${sessionID} successfully.`); } - /** - * Reload the profile from disk if the profile was changed by another server. - * @param {*} sessionID - */ - reloadProfileBySessionID(sessionID) { - if (sessionID === undefined) { - logger.throwErr("Session ID is undefined"); - return; - } - try { - - // Check if the profile file exists - if (global.internal.fs.existsSync(getPmcPath(sessionID))) { - //Load the PMC profile from disk. - AccountController.profiles[sessionID]["pmc"] = fileIO.readParsed(getPmcPath(sessionID)); + // /** + // * Reload the profile from disk if the profile was changed by another server. + // * @param {*} sessionID + // */ + // reloadProfileBySessionID(sessionID) { + // if (sessionID === undefined) { + // logger.throwErr("Session ID is undefined"); + // return; + // } + // try { + + // // Check if the profile file exists + // if (global.internal.fs.existsSync(getPmcPath(sessionID))) { + // //Load the PMC profile from disk. + // AccountController.profiles[sessionID]["pmc"] = fileIO.readParsed(getPmcPath(sessionID)); - logger.logWarning(`Profile for AID ${sessionID} was modified elsewhere. Profile was reloaded successfully.`) - } - } catch (e) { - if (e instanceof SyntaxError) { - return logger.logError( - `There is a syntax error in the character.json file for AID ${sessionID}. This likely means you edited something improperly. Call stack: \n${e.stack}` - ); - } else { - logger.logData(sessionID); - logger.logError(`There was an issue loading the user profile with session ID ${sessionID}. Call stack:`); - logger.logData(e); - return; - } - } - } + // logger.logWarning(`Profile for AID ${sessionID} was modified elsewhere. Profile was reloaded successfully.`) + // } + // } catch (e) { + // if (e instanceof SyntaxError) { + // return logger.logError( + // `There is a syntax error in the character.json file for AID ${sessionID}. This likely means you edited something improperly. Call stack: \n${e.stack}` + // ); + // } else { + // logger.logData(sessionID); + // logger.logError(`There was an issue loading the user profile with session ID ${sessionID}. Call stack:`); + // logger.logData(e); + // return; + // } + // } + // } /** * Check if the sessionID is loaded. diff --git a/src/classes/ragfair.js b/src/classes/ragfair.js index 707c694..2b4ecba 100644 --- a/src/classes/ragfair.js +++ b/src/classes/ragfair.js @@ -3,6 +3,7 @@ const { ConfigController } = require('../Controllers/ConfigController'); const { DatabaseController } = require('../Controllers/DatabaseController'); const { ItemController } = require('../Controllers/ItemController'); +const { TradingController } = require('../Controllers/TradingController'); function sortOffersByID(a, b) { return a.intId - b.intId; @@ -147,6 +148,7 @@ function getOffers(sessionID, request) { if (!request.linkedSearchId && !request.neededSearchId) { response.categories = trader_f.handler.getAssort(sessionID, "ragfair").loyal_level_items; + // response.categories = TradingController.getTraderAssort("ragfair", sessionID).loyal_level_items; } if (request.buildCount) { @@ -174,9 +176,6 @@ function getOffers(sessionID, request) { for (let item of itemsToAdd) { offers = offers.concat(createOffer(item, request.onlyFunctional, request.buildCount === 0)); -/* if (request.offerOwnerType === 0) { - delete offers.buyRestrictionMax; - } */ } // merge trader offers with player offers display offers is set to 'ALL' @@ -245,7 +244,7 @@ function getOffersFromTraders(sessionID, request) { // check if offer is really available, removes any quest locked items not in current assort of a trader const tmpOffer = jsonToReturn.offers[offer]; const traderId = tmpOffer.user.id; - const traderAssort = trader_f.handler.getAssort(sessionID, traderId).items; + const traderAssort = TradingController.getTraderAssort(traderId, sessionID).items; for (let item of traderAssort) { if (item._id === tmpOffer.root) { jsonToReturn.offers[offer].items[0].upd.StackObjectsCount = 30; //(tmpOffer.items[0].upd.BuyRestrictionMax - tmpOffer.items[0].upd.BuyRestrictionCurrent); diff --git a/src/classes/trader.js b/src/classes/trader.js index 8a3521e..46bf26d 100644 --- a/src/classes/trader.js +++ b/src/classes/trader.js @@ -80,7 +80,7 @@ class TraderServer { const pmcData = AccountController.getPmcProfile(sessionID); const TraderLevel = TradingController.getLoyalty(pmcData, traderID); - if (TraderLevel !== "ragfair") { + if (TraderLevel !== "ragfair" && traderID !== "ragfair") { // 1 is min level, 4 is max level let questassort = global._database.traders[traderID].questassort; diff --git a/src/functions/response.js b/src/functions/response.js index d0e48d0..9de82fa 100644 --- a/src/functions/response.js +++ b/src/functions/response.js @@ -376,7 +376,7 @@ class Responses { } clientGameProfileItemsMoving(url, info, sessionID) { const data = item_f.handler.handleRoutes(info, sessionID); - AccountController.saveToDisk(sessionID); + AccountController.saveToDisk(sessionID, true); return response_f.getBody(data); } clientGameProfileList(url, info, sessionID) {