Commit a2f3d08d authored by nanahira's avatar nanahira

put as service

parent 71a2e911
......@@ -17,6 +17,7 @@ import {
PutSession,
CommandLocale,
Inject,
Provide,
} from 'koishi-thirdeye';
import { Logger, Random, Session } from 'koishi';
import initSqlJs from 'sql.js';
......@@ -26,9 +27,16 @@ import PuppeteerPlugin from 'koishi-plugin-puppeteer';
export * from './config';
declare module 'koishi' {
interface Context {
ygocard: YGOCardPlugin;
}
}
const commonFilter =
'datas.type & 0x4000 = 0 and (datas.alias = 0 or datas.id - datas.alias > 10)';
@Provide('ygocard')
@DefinePlugin({ name: 'ygocard', schema: YGOCardConfig })
export default class YGOCardPlugin
extends StarterPlugin(YGOCardConfig)
......@@ -73,12 +81,12 @@ export default class YGOCardPlugin
const [result] = this.queryInDB(id.toString(), db);
return result;
}
private randomCard() {
randomCard() {
const db = Random.pick(this.dbs);
if (!db) return;
return this.randomCardInDB(db);
}
private queryInAllDBs(value: string, matchCount?: number) {
queryInAllDBs(value: string, matchCount?: number) {
return _.sortBy(
_.uniqBy(
_.flatten(this.dbs.map((db) => this.queryInDB(value, db))),
......@@ -87,7 +95,7 @@ export default class YGOCardPlugin
(c) => c.getDistanceFrom(value),
).slice(0, matchCount || this.config.matchCount);
}
private async loadDBs(SQL: SQL.SqlJsStatic) {
private async loadDatabases() {
const allDatabaseFiles = _.flatten(
await Promise.all(
this.config.databasePaths.map(async (p) =>
......@@ -97,22 +105,32 @@ export default class YGOCardPlugin
),
),
);
this.logger.info(
`Will load cards from ${allDatabaseFiles.length} databases.`,
);
const buffers = await Promise.all(
allDatabaseFiles.map((f) => fs.readFile(f)),
);
this.dbs = buffers.map((b) => new SQL.Database(b));
this.dbs = buffers.map((b) => new this.SQL.Database(b));
this.logger.info(`Loaded cards from ${allDatabaseFiles.length} databases.`);
}
private SQL: initSqlJs.SqlJsStatic;
async onConnect() {
const SQL = await initSqlJs();
return this.loadDBs(SQL);
this.SQL = await initSqlJs();
return this.loadDatabases();
}
onDisconnect() {
private disposeDatabase() {
this.dbs.forEach((db) => db.close());
this.dbs = [];
}
onDisconnect() {
this.disposeDatabase();
}
async reloadDatabase() {
this.disposeDatabase();
await this.loadDatabases();
}
async renderCard(card: YGOProCard) {
......@@ -183,7 +201,7 @@ export default class YGOCardPlugin
@UseCommand('{{commandName}} [query]')
@CommandLocale('zh', localeZh.cardCommand)
@CommandLocale('en', localeEn.cardCommand)
async onCardCommand(
private async onCardCommand(
@PutArg(0) query: string,
@PutOption('random', '--random') random: boolean,
@PutOption('count', '-c <count:posint>') count: number,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment