Commit 24229c19 authored by nanahira's avatar nanahira

reuse cardreader

parent 8e668218
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
"https-proxy-agent": "^7.0.6", "https-proxy-agent": "^7.0.6",
"ipaddr.js": "^2.3.0", "ipaddr.js": "^2.3.0",
"koishi": "^4.18.10", "koishi": "^4.18.10",
"koishipro-core.js": "^1.3.5", "koishipro-core.js": "^1.3.7",
"nfkit": "^1.0.35", "nfkit": "^1.0.35",
"p-queue": "6.6.2", "p-queue": "6.6.2",
"pg": "^8.18.0", "pg": "^8.18.0",
...@@ -6050,9 +6050,9 @@ ...@@ -6050,9 +6050,9 @@
} }
}, },
"node_modules/koishipro-core.js": { "node_modules/koishipro-core.js": {
"version": "1.3.5", "version": "1.3.7",
"resolved": "https://registry.npmjs.org/koishipro-core.js/-/koishipro-core.js-1.3.5.tgz", "resolved": "https://registry.npmjs.org/koishipro-core.js/-/koishipro-core.js-1.3.7.tgz",
"integrity": "sha512-hPoDdBN/+9DCyArdbDUxqVDVJ5zBJciYcYYB5epXOili1aVh9DXMfqXpFfw0jRh5oHM0dG5eWQBUpLXte87m8g==", "integrity": "sha512-prR7RRREW0jmKQWIaAfFAparzYrZeKo8+MJs4g2zGOryMH0JU5ZQtKO82ExEIAbCV1QRoVN7Hs0ToRVBy8/PTQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/emscripten": "^1.41.5", "@types/emscripten": "^1.41.5",
......
...@@ -3,7 +3,7 @@ import { Client } from '../../client'; ...@@ -3,7 +3,7 @@ import { Client } from '../../client';
import { ValueContainer } from '../../utility/value-container'; import { ValueContainer } from '../../utility/value-container';
import { Room } from '../room'; import { Room } from '../room';
import { YGOProLFListError } from 'ygopro-lflist-encode'; import { YGOProLFListError } from 'ygopro-lflist-encode';
import { CardReaderFinalized } from 'koishipro-core.js'; import { CardReader } from 'koishipro-core.js';
export class RoomCheckDeck extends ValueContainer< export class RoomCheckDeck extends ValueContainer<
YGOProLFListError | undefined YGOProLFListError | undefined
...@@ -12,7 +12,7 @@ export class RoomCheckDeck extends ValueContainer< ...@@ -12,7 +12,7 @@ export class RoomCheckDeck extends ValueContainer<
public room: Room, public room: Room,
public client: Client, public client: Client,
public deck: YGOProDeck, public deck: YGOProDeck,
public cardReader: CardReaderFinalized, public cardReader: CardReader,
) { ) {
super(undefined); super(undefined);
} }
......
...@@ -56,7 +56,7 @@ import { ...@@ -56,7 +56,7 @@ import {
} from 'ygopro-msg-encode'; } from 'ygopro-msg-encode';
import { DefaultHostInfoProvider } from './default-hostinfo-provder'; import { DefaultHostInfoProvider } from './default-hostinfo-provder';
import { import {
CardReaderFinalized, CardReader,
OcgcoreMessageType, OcgcoreMessageType,
_OcgcoreConstants, _OcgcoreConstants,
} from 'koishipro-core.js'; } from 'koishipro-core.js';
...@@ -108,7 +108,7 @@ import { OnRoomSelectTp } from './room-event/on-room-select-tp'; ...@@ -108,7 +108,7 @@ import { OnRoomSelectTp } from './room-event/on-room-select-tp';
import { RoomCheckDeck } from './room-event/room-check-deck'; import { RoomCheckDeck } from './room-event/room-check-deck';
import cryptoRandomString from 'crypto-random-string'; import cryptoRandomString from 'crypto-random-string';
import { RoomCurrentFieldInfo, RoomInfo } from './room-info'; import { RoomCurrentFieldInfo, RoomInfo } from './room-info';
import { KoishiFragment } from '../utility'; import { KoishiFragment, readCardWithReader } from '../utility';
const { OcgcoreScriptConstants } = _OcgcoreConstants; const { OcgcoreScriptConstants } = _OcgcoreConstants;
...@@ -165,7 +165,7 @@ export class Room { ...@@ -165,7 +165,7 @@ export class Room {
private get resourceLoader() { private get resourceLoader() {
return this.ctx.get(() => YGOProResourceLoader); return this.ctx.get(() => YGOProResourceLoader);
} }
private _cardReader?: CardReaderFinalized; private _cardReader?: CardReader;
private cardReaderLock = new BetterLock(); private cardReaderLock = new BetterLock();
private async getCardReader() { private async getCardReader() {
return this.cardReaderLock.acquire(async () => { return this.cardReaderLock.acquire(async () => {
...@@ -825,7 +825,7 @@ export class Room { ...@@ -825,7 +825,7 @@ export class Room {
// we have to distinguish main and extra deck cards // we have to distinguish main and extra deck cards
const cardReader = await this.getCardReader(); const cardReader = await this.getCardReader();
for (const card of msg.deck.main) { for (const card of msg.deck.main) {
const cardEntry = cardReader.apply(card); const cardEntry = readCardWithReader(cardReader, card);
if ( if (
cardEntry?.type && cardEntry?.type &&
cardEntry.type & OcgcoreCommonConstants.TYPES_EXTRA_DECK cardEntry.type & OcgcoreCommonConstants.TYPES_EXTRA_DECK
......
import { Context } from '../app'; import { Context } from '../app';
import { DirCardReader, searchYGOProResource } from 'koishipro-core.js'; import { searchYGOProResource, SqljsCardReader } from 'koishipro-core.js';
import { YGOProLFList } from 'ygopro-lflist-encode'; import { YGOProLFList } from 'ygopro-lflist-encode';
import path from 'node:path'; import path from 'node:path';
import { YGOProCdb } from 'ygopro-cdb-encode';
export class YGOProResourceLoader { export class YGOProResourceLoader {
constructor(private ctx: Context) {} constructor(private ctx: Context) {}
...@@ -16,10 +17,43 @@ export class YGOProResourceLoader { ...@@ -16,10 +17,43 @@ export class YGOProResourceLoader {
private logger = this.ctx.createLogger(this.constructor.name); private logger = this.ctx.createLogger(this.constructor.name);
private _cardReader = DirCardReader(this.ctx.SQL, ...this.ygoproPaths); private cardReader = this.mergeDatabase().then((db) => SqljsCardReader(db));
async getCardReader() { async getCardReader() {
return this._cardReader; return this.cardReader;
}
private async mergeDatabase() {
const db = new YGOProCdb(this.ctx.SQL);
let dbCount = 0;
for await (const file of searchYGOProResource(...this.ygoproPaths)) {
const filename = path.basename(file.path);
if (!filename?.endsWith('.cdb')) {
continue;
}
try {
const currentDb = new this.ctx.SQL.Database(await file.read());
try {
const currentCdb = new YGOProCdb(currentDb);
const cards = currentCdb.find();
for (const card of cards) {
if (!db.findById(card.code)) {
db.addCard(card);
}
}
++dbCount;
} finally {
currentDb.close();
}
} catch (e) {
this.logger.warn(`Failed to read ${file.path}: ${e}`);
continue;
}
}
this.logger.info(
`Merged database from ${dbCount} databases with ${db.find().length} cards`,
);
return db;
} }
async *getLFLists() { async *getLFLists() {
......
...@@ -6,6 +6,7 @@ import { ...@@ -6,6 +6,7 @@ import {
YGOProLFListItem, YGOProLFListItem,
} from 'ygopro-lflist-encode'; } from 'ygopro-lflist-encode';
import { OcgcoreCommonConstants } from 'ygopro-msg-encode'; import { OcgcoreCommonConstants } from 'ygopro-msg-encode';
import { readCardWithReader } from './read-card-with-reader';
// Constants from ygopro // Constants from ygopro
const { TYPES_EXTRA_DECK, TYPE_TOKEN } = OcgcoreCommonConstants; const { TYPES_EXTRA_DECK, TYPE_TOKEN } = OcgcoreCommonConstants;
...@@ -101,8 +102,7 @@ export const checkDeck = ( ...@@ -101,8 +102,7 @@ export const checkDeck = (
code: number, code: number,
location: 'main' | 'extra' | 'side', location: 'main' | 'extra' | 'side',
): YGOProLFListError | null => { ): YGOProLFListError | null => {
const cardData = const cardData = readCardWithReader(reader, code);
typeof reader === 'function' ? reader(code) : reader.apply(code);
if (!cardData) { if (!cardData) {
return new YGOProLFListError(YGOProLFListErrorReason.UNKNOWNCARD, code); return new YGOProLFListError(YGOProLFListErrorReason.UNKNOWNCARD, code);
......
...@@ -3,3 +3,4 @@ export * from './base-time.entity'; ...@@ -3,3 +3,4 @@ export * from './base-time.entity';
export * from './bigint-transformer'; export * from './bigint-transformer';
export * from './decorators'; export * from './decorators';
export * from './koishi-chat'; export * from './koishi-chat';
export * from './read-card-with-reader';
import { CardReader } from 'koishipro-core.js';
import { CardDataEntry } from 'ygopro-cdb-encode';
export const readCardWithReader = (
reader: CardReader,
cardId: number,
): Partial<CardDataEntry> | null | undefined =>
typeof reader === 'function' ? reader(cardId) : reader.apply(cardId);
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