diff --git a/main.js b/main.js index 0cc502a..a8f9fef 100644 --- a/main.js +++ b/main.js @@ -393,10 +393,12 @@ function createWindow(status) { mainWindow.getAppRuntimeLog = shepherd.getAppRuntimeLog; mainWindow.nativeCoindList = nativeCoindList; mainWindow.zcashParamsDownloadLinks = shepherd.zcashParamsDownloadLinks; - mainWindow.isWindows = os.platform() === 'win32' ? true : false; + mainWindow.isWindows = os.platform() === 'win32' ? true : false; // obsolete(?) mainWindow.appExit = appExit; mainWindow.getMaxconKMDConf = shepherd.getMaxconKMDConf; mainWindow.setMaxconKMDConf = shepherd.setMaxconKMDConf; + mainWindow.getMMCacheData = shepherd.getMMCacheData; + mainWindow.activeSection = 'wallets'; if (appConfig.dev) { mainWindow.loadURL('http://127.0.0.1:3000'); @@ -512,8 +514,9 @@ app.on('window-all-closed', function() { // Calling event.preventDefault() will prevent the default behaviour, which is terminating the application. app.on('before-quit', function(event) { shepherd.log('before-quit'); + shepherd.killRogueProcess('marketmaker'); - if (!forceQuitApp && + /*if (!forceQuitApp && mainWindow === null && loadingWindow != null) { // mainWindow not intitialised and loadingWindow not dereferenced // loading window is still open @@ -524,7 +527,7 @@ app.on('before-quit', function(event) { let code = `$('#loading_status_text').html('Preparing to shutdown the wallet.<br/>Please wait while all daemons are closed...')`; loadingWindow.webContents.executeJavaScript(code); event.preventDefault(); - } + }*/ }); // Emitted when all windows have been closed and the application will quit. diff --git a/routes/shepherd.js b/routes/shepherd.js index a5f7593..48efa5d 100644 --- a/routes/shepherd.js +++ b/routes/shepherd.js @@ -37,6 +37,17 @@ shepherd.rpcConf = {}; shepherd.appRuntimeLog = []; shepherd.appRuntimeSPVLog = []; shepherd.lockDownAddCoin = false; +shepherd.mmupass = null; +shepherd.mmRatesInterval = null; +shepherd.mmPublic = { + coins: [], + mmupass: null, + swaps: [], + bids: [], + asks: [], + isAuth: false, + rates: {}, +}; // spv vars and libs shepherd.electrumCoins = { diff --git a/routes/shepherd/dex/mmControl.js b/routes/shepherd/dex/mmControl.js index e8140b3..5c89086 100644 --- a/routes/shepherd/dex/mmControl.js +++ b/routes/shepherd/dex/mmControl.js @@ -4,24 +4,108 @@ const portscanner = require('portscanner'); const exec = require('child_process').exec; const execFile = require('child_process').execFile; const path = require('path'); +const request = require('request'); +const Promise = require('bluebird'); + +const RATES_UPDATE_INTERVAL = 60000; module.exports = (shepherd) => { shepherd.get('/mm/start', (req, res, next) => { shepherd.log('mm start is called'); shepherd.startMarketMaker({ passphrase: req.query.passphrase }); + shepherd.mmupass = null; + + shepherd.mmupass = setInterval(() => { + const options = { + url: `http://localhost:7783`, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ method: 'balance' }), + }; + + // send back body on both success and error + // this bit replicates iguana core's behaviour + request(options, (error, response, body) => { + if (response && + response.statusCode && + response.statusCode === 200) { + const _parsedBody = JSON.parse(body); + + if (_parsedBody.userpass) { + res.end(body); + clearInterval(shepherd.mmupass); + shepherd.mmupass = _parsedBody.userpass; + shepherd.mmPublic.mmupass = shepherd.mmupass; + shepherd.mmPublic.isAuth = true; + shepherd.mmPublic.coins = _parsedBody.coins; + shepherd.log(`mm start success`); + shepherd.log(`mm userpass ${_parsedBody.userpass}`); + shepherd.getRates(); + } + } else { + shepherd.log(`mm start responded with error ${error}`); + /*res.end(body ? body : JSON.stringify({ + result: 'error', + error: { + code: -777, + message: `unable to call method balance at port 7783`, + }, + }));*/ + } + }); + }, 500); + }); - const successObj = { - msg: 'success', - result: 'started', - }; + shepherd.getRates = () => { + function _getRates() { + const options = { + url: `https://min-api.cryptocompare.com/data/price?fsym=KMD&tsyms=BTC,USD`, + method: 'GET', + }; + + // send back body on both success and error + // this bit replicates iguana core's behaviour + request(options, (error, response, body) => { + if (response && + response.statusCode && + response.statusCode === 200) { + const _parsedBody = JSON.parse(body); + shepherd.log(`rates ${body}`); + shepherd.mmPublic.rates = _parsedBody; + } else { + shepherd.log(`mm unable to retrieve KMD/BTC,USD rate`); + } + }); + } - res.end(JSON.stringify(successObj)); - }); + _getRates(); + shepherd.mmRatesInterval = setInterval(() => { + _getRates(); + }, RATES_UPDATE_INTERVAL); + } + + shepherd.getMMCacheData = () => { + return new Promise((resolve, reject) => { + resolve(shepherd.mmPublic); + }); + } shepherd.get('/mm/stop', (req, res, next) => { shepherd.log('mm stop is called'); + clearInterval(shepherd.mmRatesInterval); shepherd.killRogueProcess('marketmaker'); + shepherd.mmPublic = { + coins: [], + mmupass: null, + swaps: [], + bids: [], + asks: [], + isAuth: false, + rates: {}, + }; const successObj = { msg: 'success', @@ -34,15 +118,25 @@ module.exports = (shepherd) => { shepherd.get('/mm/restart', (req, res, next) => { shepherd.log('mm restart is called'); shepherd.killRogueProcess('marketmaker'); + shepherd.mmPublic = { + coins: {}, + mmupass: null, + swaps: [], + bids: [], + asks: [], + isAuth: false, + }; + setTimeout(() => { shepherd.startMarketMaker({ passphrase: req.query.passphrase }); - }, 1000); - const successObj = { - msg: 'success', - result: 'restarting', - }; - res.end(JSON.stringify(successObj)); + const successObj = { + msg: 'success', + result: 'restarting', + }; + + res.end(JSON.stringify(successObj)); + }, 1000); }); shepherd.startMarketMaker = (data) => {