98 lines
2.7 KiB
TypeScript
98 lines
2.7 KiB
TypeScript
import PocketBase, { RecordModel } from "pocketbase"
|
||
import { Logger } from "winston"
|
||
|
||
import PbToolBase from "../base"
|
||
|
||
const DB_NAME = "soupGame"
|
||
|
||
/**
|
||
* 表示海龟汤游戏的数据结构
|
||
* 海龟汤是一种推理游戏,玩家根据故事的开头和结局,通过提问来猜测故事完整内容
|
||
* 存储游戏的基本信息、历史记录和状态
|
||
*/
|
||
export interface SoupGame {
|
||
/** 聊天会话的唯一标识符 */
|
||
chatId: string
|
||
/** 海龟汤游戏标题 */
|
||
title: string
|
||
/** 游戏的初始问题或谜题 */
|
||
query: string
|
||
/** 海龟汤游戏的正确答案或完整故事 */
|
||
answer: string
|
||
/** 游戏过程中的提问和回答历史记录 */
|
||
history: string[]
|
||
/** 游戏是否处于活跃状态 */
|
||
active: boolean
|
||
}
|
||
|
||
/**
|
||
* 海龟汤游戏数据模型类型,继承基本游戏接口和PocketBase记录模型
|
||
*/
|
||
export type SoupGameModel = SoupGame & RecordModel
|
||
|
||
/**
|
||
* 海龟汤游戏数据库操作类
|
||
* 提供获取、更新和关闭游戏等功能
|
||
*
|
||
* @extends PbToolBase<SoupGameModel> 继承PocketBase基础工具类
|
||
*/
|
||
class SoupGameDB extends PbToolBase<SoupGameModel> {
|
||
/**
|
||
* 创建海龟汤游戏数据库操作实例
|
||
*
|
||
* @param pbClient - PocketBase 客户端实例
|
||
* @param logger - 日志记录器实例
|
||
*/
|
||
constructor(pbClient: PocketBase, logger: Logger) {
|
||
super(DB_NAME, pbClient, logger)
|
||
}
|
||
|
||
/**
|
||
* 根据聊天ID获取当前活跃的海龟汤游戏
|
||
*
|
||
* @param chatId - 聊天会话的唯一标识符
|
||
* @returns 成功时返回活跃的游戏记录,失败时返回null
|
||
*
|
||
* @example
|
||
* ```typescript
|
||
* const activeGame = await soupGameDb.getActiveOneByChatId("chat123");
|
||
* ```
|
||
*/
|
||
public getActiveOneByChatId = (chatId: string) => {
|
||
return this.getFirstOne(`chatId = "${chatId}" && active = true`)
|
||
}
|
||
|
||
/**
|
||
* 关闭指定ID的海龟汤游戏,将其状态设置为非活跃
|
||
*
|
||
* @param id - 游戏记录的唯一标识符
|
||
* @returns 成功时返回更新后的游戏记录,失败时返回null
|
||
*
|
||
* @example
|
||
* ```typescript
|
||
* const closedGame = await soupGameDb.close("game123");
|
||
* ```
|
||
*/
|
||
public close = (id: string) => {
|
||
return this.update(id, { active: false })
|
||
}
|
||
|
||
/**
|
||
* 覆盖更新指定海龟汤游戏的历史记录
|
||
*
|
||
* @param id - 游戏记录的唯一标识符
|
||
* @param history - 新的历史记录数组,包含玩家提问和回答
|
||
* @returns 成功时返回更新后的游戏记录,失败时返回null
|
||
*
|
||
* @example
|
||
* ```typescript
|
||
* const updatedGame = await soupGameDb.overrideHistory("game123", ["问题1", "回答1", "问题2", "回答2"]);
|
||
* ```
|
||
*/
|
||
public overrideHistory = (id: string, history: string[]) => {
|
||
return this.update(id, { history })
|
||
}
|
||
}
|
||
|
||
export default SoupGameDB
|