mirror of
https://github.com/sern-handler/handler
synced 2026-06-06 17:36:56 +00:00
Compare commits
4 Commits
v4.0.1
...
feat/direc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ec59a3443 | ||
|
|
3e668090d8 | ||
|
|
3755b95b1a | ||
|
|
06807ea77f |
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 sern
|
||||
Copyright (c) 2024 sern
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
- Unleash its full potential with a powerful CLI and awesome plugins.
|
||||
|
||||
## 📜 Installation
|
||||
[Start here!!](https://sern.dev/docs/guide/walkthrough/new-project)
|
||||
[Start here!!](https://sern.dev/v4/reference/getting-started)
|
||||
|
||||
## 👶 Basic Usage
|
||||
<details><summary>ping.ts</summary>
|
||||
@@ -48,7 +48,6 @@ export default commandModule({
|
||||
- [Community Bot](https://github.com/sern-handler/sern-community), the community bot for our [discord server](https://sern.dev/discord).
|
||||
- [Vinci](https://github.com/SrIzan10/vinci), the bot for Mara Turing.
|
||||
- [Bask](https://github.com/baskbotml/bask), Listen your favorite artists on Discord.
|
||||
- [ava](https://github.com/SrIzan10/ava), A discord bot that plays KNGI and Gensokyo Radio.
|
||||
- [Murayama](https://github.com/murayamabot/murayama), :pepega:
|
||||
- [Protector (WIP)](https://github.com/needhamgary/Protector), Just a simple bot to help enhance a private minecraft server.
|
||||
- [SmokinWeed 💨](https://github.com/Peter-MJ-Parker/sern-bud), A fun bot for a small - but growing - server.
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import path from 'node:path';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { type Dirent, existsSync } from 'node:fs';
|
||||
import { readdir } from 'fs/promises';
|
||||
import assert from 'node:assert';
|
||||
import * as Id from './id'
|
||||
import { Module } from '../types/core-modules';
|
||||
|
||||
@@ -38,8 +37,9 @@ export async function importModule<T>(absPath: string) {
|
||||
let fileModule = await import(absPath);
|
||||
|
||||
let commandModule: Module = fileModule.default;
|
||||
|
||||
assert(commandModule , `No default export @ ${absPath}`);
|
||||
if(!commandModule) {
|
||||
throw Error(`No default export @ ${absPath}`);
|
||||
}
|
||||
if ('default' in commandModule) {
|
||||
commandModule = commandModule.default as Module;
|
||||
}
|
||||
@@ -53,16 +53,18 @@ export async function importModule<T>(absPath: string) {
|
||||
}
|
||||
|
||||
|
||||
export async function* readRecursive(dir: string): AsyncGenerator<string> {
|
||||
export async function* readRecursive(dir: string, directoryPlugins: string[] = []): AsyncGenerator<[string, string[]]> {
|
||||
const files = await readdir(dir, { withFileTypes: true });
|
||||
const pluginFile = files.find(file => file.isFile() && file.name.startsWith('!plugins')) as Dirent;
|
||||
for (const file of files) {
|
||||
const fullPath = path.posix.join(dir, file.name);
|
||||
const plugins = pluginFile ? [...directoryPlugins, path.posix.join(dir, pluginFile.name) ] : directoryPlugins
|
||||
if (file.isDirectory()) {
|
||||
if (!file.name.startsWith('!')) {
|
||||
yield* readRecursive(fullPath);
|
||||
yield* readRecursive(fullPath, plugins);
|
||||
}
|
||||
} else if (!file.name.startsWith('!')) {
|
||||
yield "file:///"+path.resolve(fullPath);
|
||||
yield ["file:///"+path.resolve(fullPath), plugins];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,8 @@ export default async function(dir: string, deps : UnpackedDependencies) {
|
||||
|
||||
// https://observablehq.com/@ehouais/multiple-promises-as-an-async-generator
|
||||
// possibly optimize to concurrently import modules
|
||||
for await (const path of Files.readRecursive(dir)) {
|
||||
for await (const [path, directoryPlugins] of Files.readRecursive(dir)) {
|
||||
console.log(path, directoryPlugins)
|
||||
let { module } = await Files.importModule<Module>(path);
|
||||
const validType = module.type >= CommandType.Text && module.type <= CommandType.ChannelSelect;
|
||||
if(!validType) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import { fileURLToPath } from "url";
|
||||
|
||||
export const registerTasks = async (tasksPath: string, deps: UnpackedDependencies) => {
|
||||
const taskManager = deps['@sern/scheduler']
|
||||
for await (const f of Files.readRecursive(tasksPath)) {
|
||||
for await (const [f, _] of Files.readRecursive(tasksPath)) {
|
||||
let { module } = await Files.importModule<ScheduledTask>(f);
|
||||
//module.name is assigned by Files.importModule<>
|
||||
// the id created for the task is unique
|
||||
|
||||
@@ -20,7 +20,8 @@ const intoDispatcher = (deps: UnpackedDependencies) =>
|
||||
|
||||
export default async function(deps: UnpackedDependencies, eventDir: string) {
|
||||
const eventModules: EventModule[] = [];
|
||||
for await (const path of Files.readRecursive(eventDir)) {
|
||||
for await (const [path, _] of Files.readRecursive(eventDir)) {
|
||||
console.log(path, _)
|
||||
let { module } = await Files.importModule<Module>(path);
|
||||
await callInitPlugins(module, deps)
|
||||
eventModules.push(module as EventModule);
|
||||
|
||||
Reference in New Issue
Block a user