Commit 24229c19 authored by nanahira's avatar nanahira

reuse cardreader

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