diff --git a/lib/plugins.js b/lib/plugins.js index ff053336..671c7a80 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -11,13 +11,22 @@ var POLLING_RATE = 60 * 1000; // poll each minute var db = null; + var tickerPlugin = null; var traderPlugin = null; var walletPlugin = null; var idVerifierPlugin = null; +var currentlyUsedPlugins = { + ticker: null, + transfer: null, + trader: null, + idVerifier: null +}; + + var cachedConfig = null; -var deviceCurrency = 'USD'; // Can 'USD' be set as default? +var deviceCurrency = 'USD'; var lastBalances = null; var lastRates = {}; @@ -93,56 +102,65 @@ function loadPlugin(name, config) { return plugin; } +function loadOrConfigPlugin(pluginHandle, pluginType, currency, onChangeCb) { + var currentName = cachedConfig.exchanges.plugins.current[pluginType]; + var pluginChanged = currentlyUsedPlugins[pluginType] !== currentName; + + if (currentName) { // some plugins may be disabled + var pluginConfig = cachedConfig.exchanges.plugins.settings[currentName] || {}; + + if (currency) pluginConfig.currency = currency; + + if (pluginHandle && !pluginChanged) pluginHandle.config(pluginConfig); + else pluginHandle = loadPlugin(currentName, pluginConfig); + } + + if (typeof onChangeCb === 'function') onChangeCb(pluginHandle, currency); + + return pluginHandle; +} + exports.configure = function configure(config) { if (config.exchanges.settings.lowBalanceMargin < 1) { throw new Error('`settings.lowBalanceMargin` has to be >= 1'); } - deviceCurrency = config.exchanges.settings.currency; - var plugins = config.exchanges.plugins; - - // [required] configure (or load) ticker - var tickerName = plugins.current.ticker; - var tickerConfig = plugins.settings[tickerName] || {}; - tickerConfig.currency = deviceCurrency; - - if (tickerPlugin) tickerPlugin.config(tickerConfig); - else tickerPlugin = loadPlugin(tickerName, tickerConfig); - - - // [required] configure (or load) wallet - var walletName = plugins.current.transfer; - var walletConfig = plugins.settings[walletName] || {}; - - if (walletPlugin) walletPlugin.config(walletConfig); - else walletPlugin = loadPlugin(walletName, walletConfig); - - - // [optional] configure (or load) trader - var traderName = plugins.current.trade; - if (traderName) { // traderPlugin may be disabled - var traderConfig = plugins.settings[traderName] || {}; - - if (traderPlugin) traderPlugin.config(traderConfig); - else traderPlugin = loadPlugin(traderName, traderConfig); - } - - - // [optional] ID Verifier - var verifierName = plugins.current.idVerifier; - if (verifierName) { // idVerifierPlugin may be disabled - var verifierConfig = plugins.settings[verifierName] || {}; - - if (idVerifierPlugin) idVerifierPlugin.config(verifierConfig); - else idVerifierPlugin = loadPlugin(verifierName, verifierConfig); - } - - cachedConfig = config; - pollBalance(); - pollRate(); + // TICKER [required] configure (or load) + loadOrConfigPlugin( + tickerPlugin, + 'ticker', + config.exchanges.settings.currency, // device currency + function onTickerChange(newTicker, currency) { + tickerPlugin = newTicker; + pollRate(); + } + ); + + // WALLET [required] configure (or load) + loadOrConfigPlugin( + walletPlugin, + 'transfer', + null, + function onWalletChange(newWallet) { + walletPlugin = newWallet; + pollBalance(); + } + ); + + // TRADER [optional] configure (or load) + traderPlugin = loadOrConfigPlugin( + traderPlugin, + 'trade' + ); + + // ID VERIFIER [optional] configure (or load) + idVerifierPlugin = loadOrConfigPlugin( + idVerifierPlugin, + 'idVerifier' + ); }; exports.getCachedConfig = function getCachedConfig() { return cachedConfig; @@ -298,7 +316,7 @@ function pollBalance(callback) { } function pollRate(callback) { - logger.debug('polling for rates'); + logger.debug('polling for rates (' + tickerPlugin.NAME + ')'); tickerPlugin.ticker(deviceCurrency, function(err, resRates) { if (err) {