You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
import fs from 'fs';
|
|
import path from 'path';
|
|
import App from './App';
|
|
import { BaseProvider } from './base/provider/BaseProvider';
|
|
import { ChannelConfig } from './Config';
|
|
|
|
export class ProviderManager {
|
|
private app: App;
|
|
private providerClasses: { [key: string]: any }
|
|
|
|
constructor(app: App) {
|
|
this.app = app;
|
|
this.providerClasses = {};
|
|
}
|
|
|
|
async initialize() {
|
|
const PROVIDER_PATH = path.join(this.app.srcPath, "provider");
|
|
|
|
for (let file of fs.readdirSync(PROVIDER_PATH)) {
|
|
let providerFile = `${PROVIDER_PATH}/${file}`;
|
|
if (providerFile.match(/\.(js|mjs)$/)) {
|
|
// 加载js文件
|
|
let providerName = path.basename(providerFile).replace(/Provider\.(js|mjs)$/gi, "").toLocaleLowerCase();
|
|
try {
|
|
let provider = await import(providerFile);
|
|
if (!provider || !provider.default) {
|
|
throw new Error("provider is empty");
|
|
}
|
|
this.providerClasses[providerName] = provider.default;
|
|
this.app.logger.info(`已加载Provider: ${providerName}`);
|
|
} catch(err) {
|
|
this.app.logger.info(`无法加载Provider: ${providerName}`, err);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建Provider
|
|
* @param {string} providerName
|
|
* @param {any} config
|
|
*/
|
|
create(providerName: string, channelId: string, config: ChannelConfig): BaseProvider | null {
|
|
providerName = providerName.toLocaleLowerCase();
|
|
if (providerName in this.providerClasses) {
|
|
let CurrentProvider: any = this.providerClasses[providerName];
|
|
return new CurrentProvider(this.app, channelId, config);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
}
|