UNPKG

frost-api

Version:

A wrapper for Rust Console Edition (RCE) that allows you to use the websocket and API from G-Portal.

164 lines (144 loc) 4.08 kB
import { LogLevel } from "../constants"; import type { ILogger, LogType } from "./interfaces"; import { inspect } from "util"; import { stat, appendFile, writeFile } from "fs"; enum ConsoleColor { Reset = "\x1b[0m", FgRed = "\x1b[31m", FgGreen = "\x1b[32m", FgYellow = "\x1b[33m", FgCyan = "\x1b[36m", FgBlue = "\x1b[34m", FgMagenta = "\x1b[35m", FgWhite = "\x1b[97m", FgGray = "\x1b[90m", FgLightCyan = "\x1b[96m", BgBlack = "\x1b[40m", BgGray = "\x1b[48;5;235m", Bold = "\x1b[1m", Underline = "\x1b[4m" } export default class RCELogger implements ILogger { private logLevel: LogLevel = LogLevel.Info; private file?: string; constructor(logLevel: LogLevel = LogLevel.Info, file?: string) { this.logLevel = logLevel; this.file = file; } private format(content: any): string { return typeof content === "string" ? content : inspect(content, { depth: 5 }); } private logToFile(type: string, message: string) { if (this.file) { stat(this.file, (err, stats) => { if (err) { writeFile(this.file, "", (err) => { if (err) { this.warn(`Failed To Create Log File: ${err.message}`); } }); } if (stats.size > 300 * 1024 * 1024) { writeFile(this.file, "", (err) => { if (err) { this.warn(`Failed To Clear Log File: ${err.message}`); } }); } const log = typeof message === "string" ? `[${type.toUpperCase()}]: ${message}\n` : `[${type.toUpperCase()}]: ${inspect(message, { depth: 5 })}\n`; appendFile(this.file, log, (err) => { if (err) { this.warn(`Failed To Write To Log File: ${err.message}`); } }); }); } } private log(level: LogLevel, logType: LogType, message: string) { this.logToFile(logType.prefix, message); if (this.logLevel !== LogLevel.None && level <= this.logLevel) { const date = new Date(); const timestamp = date.toLocaleTimeString([], { hour12: true }); const padding = " ".repeat(Math.max(0, 15 - logType.prefix.length)); const formattedMessage = `${ConsoleColor.BgBlack}${ConsoleColor.FgWhite}${ConsoleColor.Bold}[${timestamp}]${ConsoleColor.Reset} ${logType.color}${logType.prefix}${padding}${logType.emoji}${ConsoleColor.Reset} `; console.log(formattedMessage, this.format(message)); } } /** * * @param message - The message to log * @description Logs a message with the [DEBUG] prefix * * @example * ```js * manager.logger.debug("Hello, World!"); * ``` */ debug(message: string) { const logType: LogType = { prefix: "[DEBUG]", emoji: "🔧", color: ConsoleColor.FgGreen, }; this.log(LogLevel.Debug, logType, message); } /** * * @param message - The message to log * @description Logs a message with the [ERROR] prefix * * @example * ```js * manager.logger.error("An error occurred!"); * ``` */ error(message: string) { const logType: LogType = { prefix: "[ERROR]", emoji: "❌", color: ConsoleColor.FgRed, }; this.log(LogLevel.Error, logType, message); } /** * * @param message - The message to log * @description Logs a message with the [INFO] prefix * * @example * ```js * manager.logger.info("Hello, World!"); * ``` */ info(message: string) { const logType: LogType = { prefix: "[INFO]", emoji: "💬", color: ConsoleColor.FgCyan, }; this.log(LogLevel.Info, logType, message); } /** * * @param message - The message to log * @description Logs a message with the [WARNING] prefix * * @example * ```js * manager.logger.warn("This is a warning!"); * ``` */ warn(message: string) { const logType: LogType = { prefix: "[WARNING]", emoji: "⚠️", color: ConsoleColor.FgYellow, }; this.log(LogLevel.Warn, logType, message); } }