Commit a2f3d08d authored by nanahira's avatar nanahira

put as service

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