diff --git a/Assistant.js b/Assistant.js index d41630c92..708288811 100644 --- a/Assistant.js +++ b/Assistant.js @@ -11,6 +11,13 @@ const MODULE_NAME = "Assistant"; + let bot = BOT; + + const logger = DEBUG_MODULE.newDebugLog(); + logger.fileName = MODULE_NAME; + logger.bot = bot; + logger.initialize(); + let thisObject = { dataDependencies: undefined, initialize: initialize, @@ -26,12 +33,6 @@ sendMessage: sendMessage }; - let bot = BOT; - - const logger = DEBUG_MODULE.newDebugLog(); - logger.fileName = MODULE_NAME; - logger.bot = bot; - let utilities = UTILITIES.newUtilities(bot); let exchangePositions = []; // These are the open positions at the exchange at the account the bot is authorized to use. diff --git a/Blob Storage.js b/Blob Storage.js index 7bdc6976e..4da3a2f99 100644 --- a/Blob Storage.js +++ b/Blob Storage.js @@ -1,24 +1,22 @@  exports.newBlobStorage = function newBlobStorage(BOT) { - const FULL_LOG = true; - const LOG_FILE_CONTENT = false; + let FULL_LOG = true; + let LOG_FILE_CONTENT = false; let bot = BOT; const ROOT_DIR = './'; const MODULE_NAME = "Blob Storage"; - var util = require('util'); - var guid = require('node-uuid'); - var crypto = require('crypto'); - var storage = require('azure-storage'); + let storage = require('azure-storage'); const DEBUG_MODULE = require('./Debug Log'); const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; + let thisObject = { initialize: initialize, createFolder: createFolder, @@ -34,10 +32,19 @@ exports.newBlobStorage = function newBlobStorage(BOT) { return thisObject; - function initialize(pBotDataOwner, callBackFunction) { + function initialize(pBotDataOwner, callBackFunction, disableLogging) { try { + if (disableLogging === true) { + + FULL_LOG = false; + LOG_FILE_CONTENT = false; + + } else { + logger.initialize(); + } + if (pBotDataOwner === undefined) { devTeamDataOwner = bot.devTeam; diff --git a/Context.js b/Context.js index 91e0a14ff..035498bbf 100644 --- a/Context.js +++ b/Context.js @@ -3,6 +3,15 @@ const FULL_LOG = true; const LOG_FILE_CONTENT = false; + let bot = BOT; + + const MODULE_NAME = "Context"; + + const logger = DEBUG_MODULE.newDebugLog(); + logger.fileName = MODULE_NAME; + logger.bot = bot; + logger.initialize(); + /* This module allows deals with keeping the context between different executions of the bot. @@ -14,7 +23,7 @@ */ - const MODULE_NAME = "Context"; + /* @@ -68,13 +77,8 @@ */ - let bot = BOT; let statusReportModule; - const logger = DEBUG_MODULE.newDebugLog(); - logger.fileName = MODULE_NAME; - logger.bot = bot; - /* Utilities needed. */ let utilities = UTILITIES.newUtilities(bot); diff --git a/Data Dependencies.js b/Data Dependencies.js index 2a7435b99..6dd08e06c 100644 --- a/Data Dependencies.js +++ b/Data Dependencies.js @@ -5,18 +5,20 @@ const MODULE_NAME = "Data Dependencies"; - let thisObject = { - dataSets: new Map(), - initialize: initialize, - keys: [] - }; - let bot = BOT; let ownerBot; // This is the bot owner of the Data Set. const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; + logger.initialize(); + + let thisObject = { + dataSets: new Map(), + initialize: initialize, + keys: [] + }; + return thisObject; diff --git a/Data Set.js b/Data Set.js index fb852199c..a48b86794 100644 --- a/Data Set.js +++ b/Data Set.js @@ -5,6 +5,13 @@ const MODULE_NAME = "Data Set"; + let bot = BOT; + + const logger = DEBUG_MODULE.newDebugLog(); + logger.bot = bot; + logger.fileName = MODULE_NAME; + logger.initialize(); + let thisObject = { file: undefined, // Here we have the JSON object representing the file content. initialize: initialize, @@ -12,11 +19,7 @@ createTextFile: createTextFile }; - let bot = BOT; - let dependencyConfig; - - const logger = DEBUG_MODULE.newDebugLog(); - logger.bot = bot; + let dependencyConfig; /* Utilities needed. */ diff --git a/Debug Log.js b/Debug Log.js index a1634910b..a161e7f53 100644 --- a/Debug Log.js +++ b/Debug Log.js @@ -1,5 +1,6 @@ exports.newDebugLog = function newDebugLog() { + const ROOT_DIR = './'; const MODULE_NAME = "Debug Log"; const fileSystem = require('fs'); @@ -7,7 +8,9 @@ const dateString = currentDate.getUTCFullYear() + '-' + pad(currentDate.getUTCMonth() + 1, 2) + '-' + pad(currentDate.getUTCDate(), 2) + '-' + pad(currentDate.getUTCHours(), 2) + '-' + pad(currentDate.getUTCMinutes(), 2); const randomId = parseInt(Math.random() * 1000000); - let executionPath = global.EXECUTION_DATETIME.getUTCFullYear() + '-' + pad(global.EXECUTION_DATETIME.getUTCMonth() + 1, 2) + '-' + pad(global.EXECUTION_DATETIME.getUTCDate(), 2) + '.' + pad(global.EXECUTION_DATETIME.getUTCHours(), 2) + '-' + pad(global.EXECUTION_DATETIME.getUTCMinutes(), 2); + let executionDatetime = global.EXECUTION_DATETIME.toISOString(); + let executionPath = global.EXECUTION_DATETIME.getUTCFullYear() + '-' + pad(global.EXECUTION_DATETIME.getUTCMonth() + 1, 2) + '-' + pad(global.EXECUTION_DATETIME.getUTCDate(), 2) + 'T' + pad(global.EXECUTION_DATETIME.getUTCHours(), 2) + '-' + pad(global.EXECUTION_DATETIME.getUTCMinutes(), 2) + '-' + pad(global.EXECUTION_DATETIME.getUTCSeconds(), 2); + let fileNumber = 1; let messageId = 0; let firstCall = true; @@ -19,11 +22,64 @@ bot: undefined, fileName: undefined, forceLoopSplit: false, // When set to 'true' this will force that the logs of the current module are split in many different Loop folders. - write: write + write: write, + initialize: initialize }; + let blobContent = ""; + return thisObject; + function initialize() { + + thisObject.bot.eventHandler.listenToEvent("Loop Finished", onLoopFinished); + + } + + function onLoopFinished(event) { + + try { + + const BLOB_STORAGE = require(ROOT_DIR + 'Blob Storage'); + let cloudStorage = BLOB_STORAGE.newBlobStorage(thisObject.bot); + + cloudStorage.initialize(thisObject.bot, onInizialized, true); + + function onInizialized(err) { + + if (err.result === global.DEFAULT_OK_RESPONSE.result) { + + let filePath = thisObject.bot.filePathRoot + "/Logs/" + thisObject.bot.process + "/" + executionDatetime; + + if (thisObject.bot.debug.year !== undefined) { + + filePath = filePath + "/" + thisObject.bot.debug.year + "/" + thisObject.bot.debug.month; + } + + if (loopCounter === undefined) { loopCounter = 0 }; + + filePath = filePath + "/Loop." + loopCounter; + + cloudStorage.createTextFile(filePath, thisObject.fileName + ".txt", blobContent + '\n', onFileCreated); + + function onFileCreated(err) { + + if (err.result !== global.DEFAULT_OK_RESPONSE.result) { + console.log("[ERROR] onLoopFinished -> onInizialized -> onFileCreated -> err = " + err.message); + return; + } + } + + } else { + console.log("[ERROR] onLoopFinished -> onInizialized -> err = " + err.message); + } + } + + } catch (err) { + console.log("[ERROR] onLoopFinished -> err = " + err.message); + } + } + function createFolders() { try { @@ -127,6 +183,7 @@ loopCounter = thisObject.bot.loopCounter; createLoopFolder(); + blobContent = ""; } } else { @@ -138,7 +195,7 @@ } } - let filePath = getCurrentLogFile(folderPath + "/" + dateString + "---" + randomId + "---", this.fileName); + let filePath = getCurrentLogFile(folderPath + "/" + dateString + "---" + randomId + "---", thisObject.fileName); let newDate = new Date(); newDate = newDate.toISOString(); @@ -147,7 +204,11 @@ try { - fileSystem.appendFileSync(filePath, '\r\n' + newDate + " " + messageId + " " + Message); + let fileLine = '\r\n' + newDate + " " + messageId + " " + Message; + + fileSystem.appendFileSync(filePath, fileLine); + + blobContent = blobContent + fileLine; } catch (err) { diff --git a/EventHandler.js b/EventHandler.js new file mode 100644 index 000000000..3b847868c --- /dev/null +++ b/EventHandler.js @@ -0,0 +1,63 @@ + +exports.newEventHandler = function newEventHandler() { + + const CONSOLE_LOG = false; + + let thisObject = { + name: undefined, // This is for debugging purposes only. + parentEventHandler: undefined, // Here we store the parent cointainer zoom object. + listenToEvent: listenToEvent, + raiseEvent: raiseEvent, + initialize: initialize + }; + + var eventHandlers = []; // Here we store all the functions we will call when an event is comming. + + return thisObject; + + function initialize() { + + + } + + function listenToEvent(eventType, handler, extraData) { + + eventHandlers.push([eventType, handler, extraData]); + + if (thisObject.name !== undefined && CONSOLE_LOG === true) { + + console.log("Event Handler named " + thisObject.name + " received a request to listenToEvent " + eventType + " and call " + (handler.toString()).substring(0, 50)); + + } + + } + + function raiseEvent(eventType, event) { + + if (thisObject.name !== undefined && CONSOLE_LOG === true) { + + console.log("Event Handler named " + thisObject.name + " received a request to raiseEvent " + eventType + " with this data " + (event.toString()).substring(0, 50)); + + } + + for (var i = 0; i < eventHandlers.length; i++) { + + /* We will execute all the functions listening to this event type. */ + + if (eventHandlers[i][0] === eventType) { + + var handler = eventHandlers[i][1]; + var extraData = eventHandlers[i][2]; + + if (thisObject.name !== undefined && CONSOLE_LOG === true) { + + console.log("Event Handler named " + thisObject.name + " received a request to raiseEvent " + eventType + " and will call this handler: " + (handler.toString()).substring(0,50)); + + } + + handler(event, extraData); + + } + } + } +} diff --git a/ExchangeAPI.js b/ExchangeAPI.js index bad5bf8a4..fd4aefe4c 100644 --- a/ExchangeAPI.js +++ b/ExchangeAPI.js @@ -10,6 +10,13 @@ const MODULE_NAME = "Exchange API"; + let bot = BOT; + + const logger = DEBUG_MODULE.newDebugLog(); + logger.fileName = MODULE_NAME; + logger.bot = bot; + logger.initialize(); + let thisObject = { initialize: initialize, getOpenPositions: getOpenPositions, @@ -19,12 +26,6 @@ getTicker: getTicker }; - let bot = BOT; - - const logger = DEBUG_MODULE.newDebugLog(); - logger.fileName = MODULE_NAME; - logger.bot = bot; - let poloniexApiClient; return thisObject; diff --git a/Extraction Bot Process Main Loop.js b/Extraction Bot Process Main Loop.js index 64b9ce369..5cc1b3794 100644 --- a/Extraction Bot Process Main Loop.js +++ b/Extraction Bot Process Main Loop.js @@ -9,11 +9,15 @@ let USER_BOT_MODULE; let COMMONS_MODULE; + const EVENT_HANDLER_MODULE = require(ROOT_DIR + 'EventHandler'); + bot.eventHandler = EVENT_HANDLER_MODULE.newEventHandler(); + const DEBUG_MODULE = require(ROOT_DIR + 'Debug Log'); const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; logger.forceLoopSplit = true; + logger.initialize(); let thisObject = { initialize: initialize, @@ -42,6 +46,7 @@ } catch (err) { logger.write("[ERROR] initialize -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } @@ -122,6 +127,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -129,6 +135,7 @@ logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -136,12 +143,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -176,6 +185,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized > Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -183,6 +193,7 @@ logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized > Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized > Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -190,12 +201,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeUserBot -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -229,6 +242,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> startUserBot -> onFinished > Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -249,16 +263,19 @@ } case "Month before it is needed.": { logger.write("[WARN] run -> loop -> startUserBot -> onFinished > Month before it is needed. This Loop will be terminated."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } case "Month fully processed.": { logger.write("[WARN] run -> loop -> startUserBot -> onFinished > Month fully processed. This Loop will be terminated."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } case "End of the month reached.": { logger.write("[WARN] run -> loop -> startUserBot -> onFinished > End of the month reached. This Loop will be terminated."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } @@ -270,6 +287,7 @@ } default: { logger.write("[ERROR] run -> loop -> startUserBot -> onFinished > Unhandled custom response received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -279,6 +297,7 @@ logger.write("[ERROR] run -> loop -> startUserBot -> onFinished > Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> startUserBot -> onFinished > Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -286,18 +305,21 @@ } catch (err) { logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> startUserBot -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -313,6 +335,7 @@ if (bot.runAtFixedInterval === true) { intervalHandle.clearInterval();} if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Stopping the Loop Gracefully. See you next time! :-)"); } + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; @@ -324,24 +347,29 @@ case 'Normal': { if (bot.runAtFixedInterval === true) { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Fixed Interval Normal exit point reached."); } + bot.eventHandler.raiseEvent("Loop Finished"); return; } else { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.normalWaitTime / 1000) + " seconds."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.normalWaitTime); } } break; case 'Retry': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.retryWaitTime / 1000) + " seconds."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.retryWaitTime); } break; case 'Sleep': { if (bot.runAtFixedInterval === true) { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Fixed Interval Sleep exit point reached."); } + bot.eventHandler.raiseEvent("Loop Finished"); return; } else { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.sleepWaitTime / 60000) + " minutes."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.sleepWaitTime); } } @@ -349,9 +377,11 @@ case 'Coma': { if (bot.runAtFixedInterval === true) { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Fixed Interval Coma exit point reached."); } + bot.eventHandler.raiseEvent("Loop Finished"); return; } else { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.comaWaitTime / 3600000) + " hours."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.comaWaitTime); } } @@ -369,16 +399,17 @@ return JSON.parse(global.PLATFORM_CONFIG.stopGracefully); } catch (err) { - const logText = "[ERROR] 'readConfig' - ERROR : " + err.message; - console.log(logText); - - return; + logger.write("[ERROR] run -> shallWeStop -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } } catch (err) { logger.write("[ERROR] run -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } }; diff --git a/File Storage.js b/File Storage.js index d5240bdbd..151a43d97 100644 --- a/File Storage.js +++ b/File Storage.js @@ -18,6 +18,7 @@ exports.newFileStorage = function newFileStorage(BOT) { const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; + logger.initialize(); const shareName = 'data'; let dataOwner; diff --git a/Indicator Bot Process Main Loop.js b/Indicator Bot Process Main Loop.js index d787ecc72..94ba5bb41 100644 --- a/Indicator Bot Process Main Loop.js +++ b/Indicator Bot Process Main Loop.js @@ -9,11 +9,15 @@ let USER_BOT_MODULE; let COMMONS_MODULE; + const EVENT_HANDLER_MODULE = require(ROOT_DIR + 'EventHandler'); + bot.eventHandler = EVENT_HANDLER_MODULE.newEventHandler(); + const DEBUG_MODULE = require(ROOT_DIR + 'Debug Log'); const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; logger.forceLoopSplit = true; + logger.initialize(); let thisObject = { initialize: initialize, @@ -42,6 +46,7 @@ } catch (err) { logger.write("[ERROR] initialize -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } @@ -112,6 +117,8 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Operation Failed. Aborting the process."); + + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -119,6 +126,7 @@ logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -126,12 +134,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -166,6 +176,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -173,6 +184,7 @@ logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -180,12 +192,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeUserBot -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -219,6 +233,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -239,16 +254,19 @@ } case "Month before it is needed.": { logger.write("[WARN] run -> loop -> startUserBot -> onFinished -> Month before it is needed. This Loop will be terminated."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } case "Month fully processed.": { logger.write("[WARN] run -> loop -> startUserBot -> onFinished -> Month fully processed. This Loop will be terminated."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } case "End of the month reached.": { logger.write("[WARN] run -> loop -> startUserBot -> onFinished -> End of the month reached. This Loop will be terminated."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } @@ -260,6 +278,7 @@ } default: { logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> Unhandled custom response received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -269,6 +288,7 @@ logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -276,18 +296,21 @@ } catch (err) { logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> startUserBot -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -301,6 +324,8 @@ if (shallWeStop() === true) { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Stopping the Loop Gracefully. See you next time! :-)"); } + + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; @@ -311,21 +336,25 @@ switch (nextWaitTime) { case 'Normal': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.normalWaitTime / 1000) + " seconds."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.normalWaitTime); } break; case 'Retry': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.retryWaitTime / 1000) + " seconds."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.retryWaitTime); } break; case 'Sleep': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.sleepWaitTime / 60000) + " minutes."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.sleepWaitTime); } break; case 'Coma': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.comaWaitTime / 3600000) + " hours."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.comaWaitTime); } break; @@ -342,16 +371,17 @@ return JSON.parse(global.PLATFORM_CONFIG.stopGracefully); } catch (err) { - const logText = "[ERROR] 'readConfig' - ERROR : " + err.message; - console.log(logText); - - return; + logger.write("[ERROR] run -> shallWeStop -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } } catch (err) { logger.write("[ERROR] run -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } }; diff --git a/Project.njsproj b/Project.njsproj index 3313fa7bd..21973b6de 100644 --- a/Project.njsproj +++ b/Project.njsproj @@ -32,6 +32,7 @@ Code + Code diff --git a/Status Dependencies.js b/Status Dependencies.js index c55e2c5e1..42848e218 100644 --- a/Status Dependencies.js +++ b/Status Dependencies.js @@ -17,6 +17,7 @@ const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; + logger.initialize(); return thisObject; diff --git a/Status Report.js b/Status Report.js index 93b56231b..691b136e3 100644 --- a/Status Report.js +++ b/Status Report.js @@ -13,6 +13,12 @@ const MODULE_NAME = "Status Report"; + let bot = BOT; + + const logger = DEBUG_MODULE.newDebugLog(); + logger.bot = bot; + logger.initialize(); + let thisObject = { file: undefined, // Here we have the JSON object representing the file content. initialize: initialize, @@ -22,12 +28,8 @@ verifyMarketComplete: verifyMarketComplete }; - let bot = BOT; let owner; // This is the bot owner of the Status Report. Only owners can save the report and override the existing content. - const logger = DEBUG_MODULE.newDebugLog(); - logger.bot = bot; - /* Utilities needed. */ let utilities = UTILITIES.newUtilities(bot); diff --git a/Trading Bot Process Main Loop.js b/Trading Bot Process Main Loop.js index 7a1d46026..c4c8529a9 100644 --- a/Trading Bot Process Main Loop.js +++ b/Trading Bot Process Main Loop.js @@ -9,11 +9,15 @@ let USER_BOT_MODULE; let COMMONS_MODULE; + const EVENT_HANDLER_MODULE = require(ROOT_DIR + 'EventHandler'); + bot.eventHandler = EVENT_HANDLER_MODULE.newEventHandler(); + const DEBUG_MODULE = require(ROOT_DIR + 'Debug Log'); const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; logger.forceLoopSplit = true; + logger.initialize(); let thisObject = { initialize: initialize, @@ -42,6 +46,7 @@ } catch (err) { logger.write("[ERROR] initialize -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } @@ -119,6 +124,7 @@ if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> End of Backtesting Period reached. Exiting Bot Process Loop."); } + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } @@ -157,6 +163,7 @@ if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> End of Competition Period reached. Exiting Bot Process Loop."); } + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; } @@ -166,6 +173,7 @@ default: { logger.write("[ERROR] run -> loop -> Unexpected bot.runMode."); logger.write("[ERROR] run -> loop -> bot.runMode = " + bot.runMode); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -214,6 +222,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -221,6 +230,7 @@ logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -228,12 +238,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeStatusDependencies -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -268,6 +280,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeDataDependencies -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -275,6 +288,7 @@ logger.write("[ERROR] run -> loop -> initializeDataDependencies -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeDataDependencies -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -282,12 +296,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeDataDependencies -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeDataDependencies -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -321,6 +337,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeContext -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -328,6 +345,7 @@ logger.write("[ERROR] run -> loop -> initializeContext -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeContext -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -335,12 +353,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeContext -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeContext -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -375,6 +395,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeExchangeAPI -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -382,6 +403,7 @@ logger.write("[ERROR] run -> loop -> initializeExchangeAPI -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeExchangeAPI -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -389,12 +411,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeContext -> onInizialized -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeExchangeAPI -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -428,6 +452,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeAssistant -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -435,6 +460,7 @@ logger.write("[ERROR] run -> loop -> initializeAssistant -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeAssistant -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -442,12 +468,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeAssistant -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeAssistant -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -482,6 +510,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -489,6 +518,7 @@ logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -496,12 +526,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> initializeUserBot -> onInizialized -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> initializeUserBot -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -534,6 +566,7 @@ } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -541,6 +574,7 @@ logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -548,12 +582,14 @@ } catch (err) { logger.write("[ERROR] run -> loop -> startUserBot -> onFinished -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> startUserBot -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -581,11 +617,13 @@ } case global.DEFAULT_RETRY_RESPONSE.result: { // Something bad happened, but if we retry in a while it might go through the next time. logger.write("[ERROR] run -> loop -> saveContext -> onFinished -> Can not retry at this point."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } case global.DEFAULT_FAIL_RESPONSE.result: { // This is an unexpected exception that we do not know how to handle. logger.write("[ERROR] run -> loop -> saveContext -> onFinished -> Operation Failed. Aborting the process."); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); return; } @@ -593,6 +631,7 @@ logger.write("[ERROR] run -> loop -> saveContext -> onFinished -> Unhandled err.result received. -> err.result = " + err.result); logger.write("[ERROR] run -> loop -> saveContext -> onFinished -> Unhandled err.result received. -> err.message = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_FAIL_RESPONSE); return; } @@ -600,18 +639,21 @@ } catch (err) { logger.write("[ERROR] run -> loop -> saveContext -> onFinished -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> saveContext -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } } catch (err) { logger.write("[ERROR] run -> loop -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(err); } } @@ -625,6 +667,7 @@ if (shallWeStop() === true) { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Stopping the Loop Gracefully. See you next time! :-)"); } + bot.eventHandler.raiseEvent("Loop Finished"); callBackFunction(global.DEFAULT_OK_RESPONSE); return; @@ -635,21 +678,25 @@ switch (nextWaitTime) { case 'Normal': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.normalWaitTime / 1000) + " seconds."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.normalWaitTime); } break; case 'Retry': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.retryWaitTime / 1000) + " seconds."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.retryWaitTime); } break; case 'Sleep': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.sleepWaitTime / 60000) + " minutes."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.sleepWaitTime); } break; case 'Coma': { if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> Restarting Loop in " + (processConfig.comaWaitTime / 3600000) + " hours."); } + bot.eventHandler.raiseEvent("Loop Finished"); setTimeout(loop, processConfig.comaWaitTime); } break; @@ -666,16 +713,17 @@ return JSON.parse(global.PLATFORM_CONFIG.stopGracefully); } catch (err) { - const logText = "[ERROR] 'readConfig' - ERROR : " + err.message; - console.log(logText); - - return; + logger.write("[ERROR] run -> shallWeStop -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } } catch (err) { logger.write("[ERROR] run -> err = " + err.message); + bot.eventHandler.raiseEvent("Loop Finished"); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } }; diff --git a/Utilities.js b/Utilities.js index a0597dd93..9a6d557e8 100644 --- a/Utilities.js +++ b/Utilities.js @@ -13,6 +13,7 @@ exports.newUtilities = function newUtilities(BOT) { const logger = DEBUG_MODULE.newDebugLog(); logger.fileName = MODULE_NAME; logger.bot = bot; + logger.initialize(); let utilities = { pad: pad, diff --git a/package.json b/package.json index 9438945a8..ef24224fb 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,6 @@ "license": "ISC", "dependencies": { "azure-storage": "^2.8.2", - "node-uuid": "^1.4.8", - "nonce": "^1.0.4", - "request": "^2.85.0", "rimraf": "^2.6.2" } }