// Copyright 2019 Campbell Crowley. All rights reserved.
// Author: Campbell Crowley (dev@campbellcrowley.com)
const fs = require('fs');
/**
* @description Manages base information for all possible moves.
* @memberof Pets
* @inner
*/
class BaseMoves {
/**
* @description Create instance.
*/
constructor() {
/**
* @description The filename of the file to read move information from.
* @private
* @type {string}
* @default
*/
this._baseFile = './save/petMoves.json';
/**
* @description Parsed data from file.
* @private
* @type {object}
* @default
*/
this._moves = {};
this.initialize = this.initialize.bind(this);
this.shutdown = this.shutdown.bind(this);
this.get = this.get.bind(this);
this._fileUpdate = this._fileUpdate.bind(this);
this._readFile = this._readFile.bind(this);
}
/**
* @description Start watching file system changes and read pet information
* from file.
* @public
*/
initialize() {
fs.watchFile(this._baseFile, {persistent: false}, this._fileUpdate);
this._readFile();
}
/**
* @description Stop watching for file system changes, and remove all event
* listeners.
* @public
*/
shutdown() {
fs.unwatchFile(this._baseFile, this._fileUpdate);
}
/**
* @description Fetch base object for a single move.
* @public
* @param {string} name Name of move to fetch.
* @returns {?object} Object reference of pet information for the move, or
* null if could not be found.
*/
get(name) {
return this._moves[(name + '').trim().toLowerCase()];
}
/**
* @description File has been modified, re-read and parse data.
* @private
* @param {fs.Stats} curr Current file stats.
* @param {fs.Stats} prev Previous file stats.
*/
_fileUpdate(curr, prev) {
if (curr.mtime == prev.mtime) return;
this._readFile();
}
/**
* @description Read and parse data from the file.
* @private
*/
_readFile() {
fs.readFile(this._baseFile, (err, data) => {
if (err) {
console.error(
'Failed to read base pet move information:', this._baseFile,
err.code);
return;
}
try {
this._moves = JSON.parse(data);
} catch (err) {
console.error(
'Failed to parse base pet move information:', this._baseFile, err);
return;
}
});
}
}
module.exports = BaseMoves;