71 lines
1.6 KiB
TypeScript
71 lines
1.6 KiB
TypeScript
// Imported from main Discord package.
|
|
|
|
import * as fs from "fs"
|
|
import * as path from "path"
|
|
|
|
// TODO: sync fs operations could cause slowdown and/or freezes, depending on usage
|
|
// if this is fine, remove this todo
|
|
export default class Settings {
|
|
path: string;
|
|
lastSaved: string;
|
|
settings: any;
|
|
lastModified: number;
|
|
constructor(root:string) {
|
|
this.path = path.join(root, 'settings.json');
|
|
try {
|
|
this.lastSaved = fs.readFileSync(this.path, "utf8");
|
|
this.settings = JSON.parse(this.lastSaved);
|
|
} catch (e) {
|
|
this.lastSaved = '';
|
|
this.settings = {};
|
|
}
|
|
this.lastModified = this._lastModified();
|
|
}
|
|
|
|
_lastModified() {
|
|
try {
|
|
return fs.statSync(this.path).mtime.getTime();
|
|
} catch (e) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
get(key, defaultValue = false) {
|
|
if (this.settings.hasOwnProperty(key)) {
|
|
return this.settings[key];
|
|
}
|
|
|
|
return defaultValue;
|
|
}
|
|
|
|
set(key, value) {
|
|
this.settings[key] = value;
|
|
}
|
|
|
|
delete(key){
|
|
delete this.settings[key]
|
|
}
|
|
|
|
exists(key){
|
|
return key in this.settings
|
|
}
|
|
|
|
save() {
|
|
if (this.lastModified && this.lastModified !== this._lastModified()) {
|
|
console.warn('Not saving settings, it has been externally modified.');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const toSave = JSON.stringify(this.settings, null, 2);
|
|
if (this.lastSaved != toSave) {
|
|
this.lastSaved = toSave;
|
|
fs.writeFileSync(this.path, toSave, "utf8");
|
|
this.lastModified = this._lastModified();
|
|
}
|
|
} catch (err) {
|
|
console.warn('Failed saving settings with error: ', err);
|
|
}
|
|
}
|
|
}
|