2025-09-20 20:36:59 +08:00
|
|
|
/**
|
|
|
|
|
* Ai角色配置
|
|
|
|
|
*/
|
|
|
|
|
import { BaseData } from "./BaseData";
|
|
|
|
|
import proto from "db://assets/Scripts/proto/proto.pb.js";
|
|
|
|
|
|
2025-09-21 14:08:30 +08:00
|
|
|
// 数据结构
|
|
|
|
|
export interface AiCharacters {
|
|
|
|
|
id: number;
|
|
|
|
|
basePrompt: string;
|
|
|
|
|
additionPrompt: string;
|
|
|
|
|
}
|
2025-09-20 20:36:59 +08:00
|
|
|
|
2025-09-21 14:08:30 +08:00
|
|
|
export class AiCharacterData extends BaseData {
|
|
|
|
|
// 数据 map
|
|
|
|
|
private _dataMap: Map<number, AiCharacters>;
|
|
|
|
|
// 数据 id
|
|
|
|
|
private _ids: number[];
|
|
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
super();
|
|
|
|
|
this._dataMap = new Map<number, AiCharacters>(),
|
|
|
|
|
this._ids = [];
|
|
|
|
|
}
|
2025-09-20 20:36:59 +08:00
|
|
|
|
|
|
|
|
public reset(): void {
|
2025-09-21 14:08:30 +08:00
|
|
|
this._dataMap.clear();
|
|
|
|
|
this._ids = [];
|
2025-09-20 20:36:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public clear(): void {
|
2025-09-21 14:08:30 +08:00
|
|
|
this._dataMap.clear();
|
|
|
|
|
this._ids = [];
|
2025-09-20 20:36:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public destroy(): void {
|
|
|
|
|
super.destroy();
|
2025-09-21 14:08:30 +08:00
|
|
|
this._dataMap = null;
|
|
|
|
|
this._ids = null;
|
2025-09-20 20:36:59 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-21 14:08:30 +08:00
|
|
|
// 解析数据,一个
|
|
|
|
|
private parseOneAiCharacters(data: any): AiCharacters | null {
|
|
|
|
|
if (!data) return null;
|
|
|
|
|
const oneData: AiCharacters = {
|
|
|
|
|
id: data.id, // 角色id
|
|
|
|
|
basePrompt: data.basePrompt, // 个人信息基础prompt(聊天&评分都需要)
|
|
|
|
|
additionPrompt: data.additionPrompt, // 额外信息prompt(聊天需要)
|
|
|
|
|
};
|
|
|
|
|
return oneData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 解析数据,多个
|
|
|
|
|
private parseAllAiCharacters(data: any): AiCharacters[] {
|
|
|
|
|
if (!data) return [];
|
|
|
|
|
let allData = [];
|
|
|
|
|
for (const value of data) {
|
|
|
|
|
const oneData: AiCharacters = this.parseOneAiCharacters(value);
|
|
|
|
|
if (oneData) {
|
|
|
|
|
allData.push(oneData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return allData;
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-20 20:36:59 +08:00
|
|
|
/** 设置Ai角色配置*/
|
|
|
|
|
public set aiCharacter(data: proto.cs.ICSGetResConfigRes) {
|
2025-09-21 17:37:32 +08:00
|
|
|
let parsed: any;
|
|
|
|
|
try {
|
|
|
|
|
parsed = JSON.parse(data.data);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.warn("AiCharacterData JSON 解析失败", e);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 解析数据
|
|
|
|
|
let allData = this.parseAllAiCharacters(parsed);
|
|
|
|
|
// 保存数据
|
|
|
|
|
for (const oneData of allData) {
|
|
|
|
|
if (!oneData) continue;
|
|
|
|
|
// 覆盖或新增
|
|
|
|
|
if (!this._dataMap.has(oneData.id)) {
|
|
|
|
|
this._ids.push(oneData.id);
|
|
|
|
|
}
|
|
|
|
|
this._dataMap.set(oneData.id, oneData);
|
|
|
|
|
}
|
2025-09-20 20:36:59 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-21 14:08:30 +08:00
|
|
|
/** 获取所有 id */
|
|
|
|
|
public getAllIds(): number[] {
|
|
|
|
|
return this._ids;
|
2025-09-20 20:36:59 +08:00
|
|
|
}
|
2025-09-21 14:08:30 +08:00
|
|
|
|
|
|
|
|
/** 获取数据,根据 id */
|
|
|
|
|
private getAiCharactersById(id: number): AiCharacters | null {
|
|
|
|
|
return this._dataMap.get(id) ?? null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 获取个人信息基础prompt,根据 id*/
|
|
|
|
|
public getBasePromptById(id: number): string {
|
|
|
|
|
const oneData = this.getAiCharactersById(id);
|
|
|
|
|
return oneData ? oneData.basePrompt : "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 获取额外信息prompt,根据 id*/
|
|
|
|
|
public getAdditionPromptById(id: number): string {
|
|
|
|
|
const oneData = this.getAiCharactersById(id);
|
|
|
|
|
return oneData ? oneData.additionPrompt : "";
|
|
|
|
|
}
|
2025-09-20 20:36:59 +08:00
|
|
|
}
|