From d61a536cdbbe2d993291e6ac2ef5fb2e969fba77 Mon Sep 17 00:00:00 2001 From: Roj Date: Fri, 29 Jul 2022 23:19:54 +0300 Subject: [PATCH] chore: setup logging (#234) --- .gitignore | 1 + deps.ts | 2 ++ env.ts | 11 ++++++----- helpers.ts | 22 ++-------------------- main.ts | 1 + module_manager.ts | 27 ++++++++++++++++++--------- setup_log.ts | 31 +++++++++++++++++++++++++++++++ 7 files changed, 61 insertions(+), 34 deletions(-) create mode 100644 setup_log.ts diff --git a/.gitignore b/.gitignore index e990224..3afe110 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ externals/ downloads/ test* +.log diff --git a/deps.ts b/deps.ts index 674de35..f461629 100644 --- a/deps.ts +++ b/deps.ts @@ -14,3 +14,5 @@ export { toFileUrl, } from "https://deno.land/std@0.150.0/path/mod.ts"; export * from "https://deno.land/x/grm_parse@0.0.4/mod.ts"; +export * as log from "https://deno.land/std@0.150.0/log/mod.ts"; +export { getLevelByName } from "https://deno.land/std@0.150.0/log/levels.ts"; diff --git a/env.ts b/env.ts index 91d9dcc..36ba0af 100644 --- a/env.ts +++ b/env.ts @@ -1,4 +1,4 @@ -import { cleanEnv, config, makeValidator, num, str } from "./deps.ts"; +import { cleanEnv, config, log, makeValidator, num, str } from "./deps.ts"; await config({ export: true }); @@ -9,9 +9,10 @@ const cmdPrefix = makeValidator((input) => { if (PREFIX_REGEX.test(input)) { return input; } - console.warn( - "Falling back to '\\' for COMMAND_PREFIX, a single symbol excluding @, #, $ was expected", + log.warning( + "falling back to '\\' for COMMAND_PREFIX: a single symbol excluding @, # and $ was expected", ); + Deno.exit(); return "\\"; }); @@ -19,8 +20,8 @@ const inputPrefix = makeValidator((input) => { if (PREFIX_REGEX.test(input) && input !== Deno.env.get("COMMAND_PREFIX")) { return input; } - console.warn( - "Falling back to '>' for INPUT_PREFIX, a single symbol excluding @, #, $ and COMMAND_PREFIX was expected", + log.warning( + "falling back to '>' for INPUT_PREFIX: a single symbol excluding @, #, $ and COMMAND_PREFIX was expected", ); return "\\"; }); diff --git a/helpers.ts b/helpers.ts index 91df7d2..ba38b33 100644 --- a/helpers.ts +++ b/helpers.ts @@ -3,29 +3,11 @@ import { CustomFile, NewMessageEvent, SendMessageParams } from "$grm"; import { Buffer } from "$grm-deps"; import { fmt, pre, type Stringable } from "./deps.ts"; -export async function wrap( - event: NewMessageEvent, - func: () => Promise, -) { - try { - await func(); - } catch (err) { - console.error(err); - try { - let message = String(err); - message = message.length <= 1000 ? message : "An error occurred."; - await event.message.reply({ message }); - } catch (_err) { - // - } - } -} - -export async function updateMessage( +export function updateMessage( event: NewMessageEvent, text: Stringable, ) { - return await event.message.edit( + return event.message.edit( fmt`${event.message.text}\n${text}`.edit, ); } diff --git a/main.ts b/main.ts index a2cf9be..ee97dda 100644 --- a/main.ts +++ b/main.ts @@ -1,4 +1,5 @@ import { NewMessage, StringSession, TelegramClient } from "$grm"; +import "./setup_log.ts"; import env from "./env.ts"; import modules from "./modules/mod.ts"; import { managerModule, ModuleManager } from "./module_manager.ts"; diff --git a/module_manager.ts b/module_manager.ts index 7830762..7d65e86 100644 --- a/module_manager.ts +++ b/module_manager.ts @@ -1,5 +1,5 @@ import { Api, NewMessageEvent, TelegramClient } from "$grm"; -import { bold, fmt, join, resolve, toFileUrl } from "./deps.ts"; +import { bold, fmt, join, log, resolve, toFileUrl } from "./deps.ts"; import { CommandHandler, End } from "./handlers/mod.ts"; import { updateMessage } from "./helpers.ts"; import { getHelp, isModule, Module } from "./module.ts"; @@ -198,7 +198,7 @@ export class ModuleManager { if (disableable && this.disabled.has(name)) { return; } - for (const handler of handlers) { + for (const [index, handler] of Object.entries(handlers)) { if (await handler.check({ client: this.client, event })) { try { const result = await handler.handle({ client: this.client, event }); @@ -206,7 +206,7 @@ export class ModuleManager { break; } } catch (err) { - console.error(err); + log.error(`handler #${index} of ${name} failed: ${err}`); try { let message = String(err); message = message.length <= 1000 ? message : "An error occurred."; @@ -262,15 +262,24 @@ export class ModuleManager { static async directory(path: string) { const modules = new Array(); - for await (let { name: file } of Deno.readDir(path)) { - if (file.startsWith(".")) { + let all = 0; + let loaded = 0; + for await (let { name, isFile, isDirectory } of Deno.readDir(path)) { + if ((!isFile && !isDirectory) || name.startsWith(".")) { continue; } - file = file.endsWith(".ts") ? file : `${file}/mod.ts`; - const spec = join(path, file); - const mod = await this.file(spec); - modules.push(mod); + all++; + name = name.endsWith(".ts") ? name : `${name}/mod.ts`; + const spec = join(path, name); + try { + const mod = await this.file(spec); + modules.push(mod); + loaded++; + } catch (err) { + log.warning(`failed to load ${spec} from ${path}: ${err}`); + } } + log.info(`loaded ${loaded} out of ${all} modules from ${path}`); return modules; } } diff --git a/setup_log.ts b/setup_log.ts new file mode 100644 index 0000000..7ebc427 --- /dev/null +++ b/setup_log.ts @@ -0,0 +1,31 @@ +import { getLevelByName, log } from "./deps.ts"; + +const level = (() => { + let toReturn = "INFO"; + try { + const level = Deno.env.get("LOG_LEVEL"); + if (level) { + // deno-lint-ignore no-explicit-any + getLevelByName(level as any); + toReturn = level; + } + } catch (_err) { + // + } + return toReturn as log.LevelName; +})(); + +await log.setup({ + handlers: { + console: new log.handlers.ConsoleHandler(level), + file: new log.handlers.FileHandler(level, { + filename: ".log", + mode: "a", + }), + }, + loggers: { + default: { + handlers: ["console", "file"], + }, + }, +});