diff --git a/.gitignore b/.gitignore index 85ce57bf..6ce1cc91 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ dist etc release +tests/log.txt + # User data tests/data user.config.json diff --git a/client/src/index.js b/client/src/index.js index 3c4e0348..58c3da93 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -14,13 +14,17 @@ import { Events, CssEditor, Globals, Settings, Database, Updater, ModuleManager, import { ClientLogger as Logger, ClientIPC, Utils } from 'common'; import { EmoteModule } from 'builtin'; import electron from 'electron'; +import path from 'path'; +const tests = true; const ignoreExternal = false; -const DEV = true; class BetterDiscord { constructor() { + Logger.file = tests ? path.join(__dirname, '..', '..', 'tests', 'log.txt') : path.join(__dirname, 'log.txt'); + Logger.log('main', 'BetterDiscord starting'); + this._bd = { DOM, BdUI, Modals, Reflection, diff --git a/client/src/modules/modulemanager.js b/client/src/modules/modulemanager.js index 99d9324c..0186cfa7 100644 --- a/client/src/modules/modulemanager.js +++ b/client/src/modules/modulemanager.js @@ -27,7 +27,7 @@ export default class { new SocketProxy(), new EventHook(), CssEditor, - new Updater() + Updater ]); } diff --git a/client/src/modules/updater.js b/client/src/modules/updater.js index 36ec548d..435fba9e 100644 --- a/client/src/modules/updater.js +++ b/client/src/modules/updater.js @@ -13,7 +13,7 @@ import Globals from './globals'; import { $ } from 'vendor'; import { ClientLogger as Logger } from 'common'; -export default class { +export default new class { constructor() { window.updater = this; diff --git a/client/webpack.config.js b/client/webpack.config.js index 0cbaa481..3bca7afb 100644 --- a/client/webpack.config.js +++ b/client/webpack.config.js @@ -1,6 +1,5 @@ -const - path = require('path'), - webpack = require('webpack'); +const path = require('path'); +const webpack = require('webpack'); const jsLoader = { test: /\.(js|jsx)$/, @@ -9,18 +8,18 @@ const jsLoader = { query: { presets: ['react'] } -} +}; const vueLoader = { test: /\.(vue)$/, loader: 'vue-loader' -} +}; const scssLoader = { test: /\.scss$/, exclude: /node_modules/, loader: ['css-loader', 'sass-loader'] -} +}; module.exports = { entry: './src/index.js', @@ -50,8 +49,13 @@ module.exports = { path.resolve('src', 'structs'), path.resolve('src', 'builtin') ] + }, + node: { + process: false, + __filename: false, + __dirname: false } - /* resolve: { + /* resolve: { alias: { 'momentjs': 'vendor/moment.min.js' }, @@ -60,5 +64,5 @@ module.exports = { path.resolve(__dirname, '..'), path.resolve(__dirname, '..', 'node_modules') ] - }*/ + } */ }; diff --git a/common/modules/logger.js b/common/modules/logger.js index df4b6830..78f4cee0 100644 --- a/common/modules/logger.js +++ b/common/modules/logger.js @@ -9,34 +9,55 @@ */ import { Vendor } from 'modules'; +import { FileUtils } from './utils'; -const logs = []; +export const logLevels = { + 'log': 'log', + 'warn': 'warn', + 'err': 'error', + 'error': 'error', + 'debug': 'debug', + 'dbg': 'debug', + 'info': 'info' +}; -export class ClientLogger { +export class Logger { - static err(module, message) { this.log(module, message, 'err'); } - static warn(module, message) { this.log(module, message, 'warn'); } - static info(module, message) { this.log(module, message, 'info'); } - static dbg(module, message) { this.log(module, message, 'dbg'); } + constructor(file) { + this.logs = []; + this.file = file; + } - static log(module, message, level = 'log') { - level = this.parseLevel(level); + err(module, message) { this.log(module, message, 'err'); } + warn(module, message) { this.log(module, message, 'warn'); } + info(module, message) { this.log(module, message, 'info'); } + dbg(module, message) { this.log(module, message, 'dbg'); } + + log(module, message, level = 'log') { + level = Logger.parseLevel(level); if (typeof message === 'object' && !(message instanceof Array)) { console[level]('[%cBetter%cDiscord:%s]', 'color: #3E82E5', '', `${module}${level === 'debug' ? '|DBG' : ''}`, message); let message_string = message.toString(); if (message_string === '[object Object]') message_string += ' ' + JSON.stringify(message, null, 4); - logs.push(`${level.toUpperCase()} : [${Vendor.moment().format('DD/MM/YY hh:mm:ss')}|${module}] ${message_string}${message_string === '[object Object]' ? ' ' + JSON.stringify(message, null, 4) : ''}`); + this.logs.push(`${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message_string}${message_string === '[object Object]' ? ' ' + JSON.stringify(message, null, 4) : ''}`); + + if (this.file) + FileUtils.appendToFile(this.file, `${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message_string}${message_string === '[object Object]' ? ' ' + JSON.stringify(message, null, 4) : ''}\n`); + return; } message = typeof message === 'object' && message instanceof Array ? message : [message]; console[level]('[%cBetter%cDiscord:%s]', 'color: #3E82E5', '', `${module}${level === 'debug' ? '|DBG' : ''}`, ...message); - logs.push(`${level.toUpperCase()} : [${Vendor.moment().format('DD/MM/YY hh:mm:ss')}|${module}] ${message.join(' ')}`); + this.logs.push(`${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message.join(' ')}`); + + if (this.file) + FileUtils.appendToFile(this.file, `${level.toUpperCase()} : [${Logger.timestamp}|${module}] ${message.join(' ')}\n`); } - static logError(err) { + logError(err) { if (!err.module && !err.message) { console.log(err); return; @@ -44,24 +65,14 @@ export class ClientLogger { this.err(err.module, err.message); } - static get logs() { - return logs; - } - - static get levels() { - return { - 'log': 'log', - 'warn': 'warn', - 'err': 'error', - 'error': 'error', - 'debug': 'debug', - 'dbg': 'debug', - 'info': 'info' - }; - } - static parseLevel(level) { - return this.levels.hasOwnProperty(level) ? this.levels[level] : 'log'; + return logLevels.hasOwnProperty(level) ? logLevels[level] : 'log'; + } + + static get timestamp() { + return Vendor.moment().format('DD/MM/YY hh:mm:ss'); } } + +export const ClientLogger = new Logger(); diff --git a/common/modules/utils.js b/common/modules/utils.js index 527fab73..07b46bbf 100644 --- a/common/modules/utils.js +++ b/common/modules/utils.js @@ -386,6 +386,21 @@ export class FileUtils { }); } + /** + * Writes to the end of a file. + * @param {String} path The file's path + * @param {String} data The data to append to the file + * @return {Promise} + */ + static async appendToFile(path, data) { + return new Promise((resolve, reject) => { + fs.appendFile(path, data, err => { + if (err) reject(err); + else resolve(); + }); + }); + } + /** * Returns the contents of a file parsed as JSON. * @param {String} path The file's path