修改:协议和配置表
This commit is contained in:
@@ -1,15 +1,27 @@
|
||||
/**
|
||||
* 技师数据
|
||||
* 技师数据,统一访问入口
|
||||
*/
|
||||
import { BaseData } from "./BaseData";
|
||||
import { GirlBriefData } from "./GirlBriefData";
|
||||
import { GirlDetailData } from "./GirlDetailData";
|
||||
import { GirlUnlockData } from "./GirlUnlockData";
|
||||
import { GirlChatData } from "./GirlChatData";
|
||||
import { GirlFavorabilityData } from "./GirlFavorabilityData";
|
||||
import { DataId } from "./DataManager";
|
||||
import proto from 'db://assets/Scripts/proto/proto.pb.js';
|
||||
|
||||
// 分类的数据结构
|
||||
interface CategoryBucket {
|
||||
// 技师的简要数据
|
||||
briefs: Map<number, proto.cs.IGirlBrief>;
|
||||
briefs: Map<number, GirlBriefData>;
|
||||
// 技师的详细数据
|
||||
details: Map<number, proto.cs.IGirlDetail>;
|
||||
details: Map<number, GirlDetailData>;
|
||||
// 技师的解锁数据
|
||||
unlocks: Map<number, GirlUnlockData>;
|
||||
// 技师的聊天数据
|
||||
chats: Map<number, GirlChatData>;
|
||||
// 技师的好感度数据
|
||||
favorability: Map<number, GirlFavorabilityData>;
|
||||
// 技师的id
|
||||
girlIds: number[];
|
||||
}
|
||||
@@ -20,8 +32,6 @@ const DAILY_BUCKET = "__daily__";
|
||||
export class GirlData extends BaseData {
|
||||
// 大分类
|
||||
private _categories = new Map<string, CategoryBucket>();
|
||||
// 每日推荐(存放在 DAILY_BUCKET 中,同时保留 id 索引便于 UI 使用)
|
||||
private _dailyRecommendIds: number[] = [];
|
||||
|
||||
public reset(): void {
|
||||
this._categories.clear();
|
||||
@@ -50,271 +60,208 @@ export class GirlData extends BaseData {
|
||||
let bucket = cats.get(categoryId);
|
||||
if (!bucket) {
|
||||
bucket = {
|
||||
briefs: new Map<number, proto.cs.IGirlBrief>(),
|
||||
details: new Map<number, proto.cs.IGirlDetail>(),
|
||||
briefs: new Map<number, GirlBriefData>(),
|
||||
details: new Map<number, GirlDetailData>(),
|
||||
unlocks: new Map<number, GirlUnlockData>(),
|
||||
chats: new Map<number, GirlChatData>(),
|
||||
favorability: new Map<number, GirlFavorabilityData>(),
|
||||
girlIds: [],
|
||||
};
|
||||
cats.set(categoryId, bucket);
|
||||
}
|
||||
return bucket;
|
||||
}
|
||||
|
||||
/**
|
||||
* 合并一批简要信息到指定分类;并维护 girlIds 顺序(去重追加)
|
||||
*/
|
||||
public mergeBriefs(categoryId: string, respOrList: proto.cs.IGirlBrief[]): void {
|
||||
if (!respOrList) return;
|
||||
let allData = this.parseAllGirlBrief(respOrList);
|
||||
if (!allData) return;
|
||||
const bucket = this.ensureBucket(categoryId);
|
||||
// 用一个临时 Set 保存已有的 id,加速去重
|
||||
const existed = new Set<number>(bucket.girlIds);
|
||||
for (const g of allData) {
|
||||
const id = g.id;
|
||||
bucket.briefs.set(id, g);
|
||||
// 去重
|
||||
if (!existed.has(id)) {
|
||||
bucket.girlIds.push(id);
|
||||
existed.add(id);
|
||||
}
|
||||
}
|
||||
console.log("保存技师的简要数据: ", bucket);
|
||||
}
|
||||
|
||||
/** 取分类下的全部 girlIds(若分类不存在返回空数组) */
|
||||
public getGirlIds(categoryId: string): number[] {
|
||||
const b = this.ensureCategories().get(categoryId);
|
||||
return b ? b.girlIds : [];
|
||||
}
|
||||
|
||||
/** 保存技师列表 */
|
||||
public setGirlList(categoryId: string, data: proto.cs.ICSGetGirlListRes): void {
|
||||
if (!data) return;
|
||||
this.setGirlBrief(categoryId, data.girls);
|
||||
this.setGirlUnlock(categoryId, data.girls);
|
||||
this.setGirlFavorability(categoryId, data.girls);
|
||||
}
|
||||
|
||||
/** 保存技师详细数据 */
|
||||
public setGirlDetailData(categoryId: string, data: proto.cs.ICSGetGirlDetailRes): void {
|
||||
if (!data) return;
|
||||
let details = []
|
||||
details.push(data.girl);
|
||||
this.setGirlBrief(categoryId, details);
|
||||
this.setGirlDetail(categoryId, details);
|
||||
this.setGirlUnlock(categoryId, details);
|
||||
this.setGirlChat(categoryId, details);
|
||||
this.setGirlFavorability(categoryId, details);
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 技师的简要数据 --------------------------------------------------------- */
|
||||
|
||||
// 解析技师简要数据,一个
|
||||
private parseOneGirlBrief(data: proto.cs.IGirlBrief): proto.cs.IGirlBrief | null {
|
||||
/**
|
||||
* 合并一个简要数据到指定分类;并维护 girlIds 顺序(去重追加)
|
||||
*/
|
||||
private mergeOneBrief(categoryId: string, data: proto.cs.IGirls): void {
|
||||
if (!data) return;
|
||||
const bucket = this.ensureBucket(categoryId);
|
||||
// 用一个临时 Set 保存已有的 id,加速去重
|
||||
const existed = new Set<number>(bucket.girlIds);
|
||||
let id = data.id;
|
||||
const one = this.parseOneGirlBrief(data);
|
||||
if (!one) return;
|
||||
bucket.briefs.set(id, one);
|
||||
if (!existed.has(id)) {
|
||||
bucket.girlIds.push(id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 合并一批简要数据到指定分类;并维护 girlIds 顺序(去重追加)
|
||||
*/
|
||||
private mergeBriefs(categoryId: string, respOrList: proto.cs.IGirlData[]): void {
|
||||
if (!respOrList) return;
|
||||
const bucket = this.ensureBucket(categoryId);
|
||||
// 用一个临时 Set 保存已有的 id,加速去重
|
||||
const existed = new Set<number>(bucket.girlIds);
|
||||
|
||||
for (const g of respOrList) {
|
||||
const one = this.parseOneGirlBrief(g.girl);
|
||||
if (!one) continue;
|
||||
bucket.briefs.set(g.id, one);
|
||||
|
||||
if (!existed.has(g.id)) {
|
||||
bucket.girlIds.push(g.id);
|
||||
existed.add(g.id);
|
||||
}
|
||||
}
|
||||
console.log("保存技师的简要数据: ", bucket);
|
||||
}
|
||||
|
||||
private parseOneGirlBrief(data: proto.cs.IGirls): GirlBriefData | null {
|
||||
if (!data) return null;
|
||||
const oneData: proto.cs.IGirlBrief = {
|
||||
id: data.id, // id
|
||||
name: data.name, // 名字
|
||||
age: data.age, // 年龄
|
||||
tagKey: data.tagKey, // 标签
|
||||
priceType: data.priceType, // 付费类型
|
||||
price: data.price, // 价格
|
||||
avatar: data.avatar, // 头像
|
||||
star: data.star, // 星级
|
||||
category: data.category, // 主题枚举
|
||||
listAvatarPath: data.listAvatarPath, // list头像路径
|
||||
};
|
||||
let oneData = new GirlBriefData();
|
||||
oneData.init?.(DataId.GirlBrief);
|
||||
oneData.setData(data);
|
||||
return oneData;
|
||||
}
|
||||
|
||||
// 解析技师简要数据,多个
|
||||
private parseAllGirlBrief(data: proto.cs.IGirlBrief[]): proto.cs.IGirlBrief[] | null {
|
||||
if (!data) return null;
|
||||
let allData = [];
|
||||
for (const value of data) {
|
||||
const oneData: proto.cs.IGirlBrief = this.parseOneGirlBrief(value);
|
||||
if (oneData) {
|
||||
allData.push(oneData);
|
||||
}
|
||||
}
|
||||
return allData;
|
||||
}
|
||||
|
||||
/** 保存技师的简要数据 */
|
||||
public setGirlBriefs(categoryId: string, data: proto.cs.ICSGetGirlListRes): void {
|
||||
this.mergeBriefs(categoryId, data.girls);
|
||||
private setGirlBrief(categoryId: string, data: proto.cs.IGirlData[]): void {
|
||||
this.mergeBriefs(categoryId, data);
|
||||
}
|
||||
|
||||
/** 取某分类 + girlId 的简要信息 */
|
||||
private getGrilBrief(categoryId: string, girlId: number): proto.cs.IGirlBrief | null {
|
||||
/** 取某分类 + girlId 的简要数据 */
|
||||
private getGrilBrief(categoryId: string, girlId: number): GirlBriefData | null {
|
||||
const b = this.ensureCategories().get(categoryId);
|
||||
if (!b) return null;
|
||||
return b.briefs.get(girlId) ?? null;
|
||||
}
|
||||
|
||||
/** 获取名字 */
|
||||
/** 获取名字键 */
|
||||
public getGrilName(categoryId: string, girlId: number): string {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return "";
|
||||
return oneData.name;
|
||||
return oneData.getGrilName();
|
||||
}
|
||||
|
||||
/** 获取年龄 */
|
||||
public getGrilAge(categoryId: string, girlId: number): number {
|
||||
public getGrilAge(categoryId: string, girlId: number): string {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return "0";
|
||||
return oneData.getGrilAge();
|
||||
}
|
||||
|
||||
/** 获取主题枚举 */
|
||||
public getGrilCategory(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.age;
|
||||
}
|
||||
return oneData.getGrilCategory();
|
||||
}
|
||||
|
||||
/** 获取标签 */
|
||||
/** 获取标签键 */
|
||||
public getGrilTagKey(categoryId: string, girlId: number): string {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return "";
|
||||
return oneData.tagKey;
|
||||
return oneData.getGrilTagKey();
|
||||
}
|
||||
|
||||
/** 获取付费类型 */
|
||||
public getGrilPriceType(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.priceType;
|
||||
return oneData.getGrilPriceType();
|
||||
}
|
||||
|
||||
/** 获取价格 */
|
||||
public getGrilPrice(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.price;
|
||||
return oneData.getGrilPrice();
|
||||
}
|
||||
|
||||
/** 获取VIP能否解锁 */
|
||||
public getGrilVipUnlock(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.getGrilVipUnlock();
|
||||
}
|
||||
|
||||
/** 获取头像 */
|
||||
/** 获取头像路径 */
|
||||
public getGrilAvatar(categoryId: string, girlId: number): string {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return "";
|
||||
return oneData.avatar;
|
||||
}
|
||||
|
||||
/** 获取星级 */
|
||||
public getGrilStar(categoryId: string, girlId: number): number {
|
||||
return oneData.getGrilAvatar();
|
||||
}
|
||||
|
||||
/** 获取list头像路径 */
|
||||
public getGrilListAvatar(categoryId: string, girlId: number): string {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.star;
|
||||
}
|
||||
|
||||
/** 获取主题枚举 */
|
||||
public getGrilCategory(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.category;
|
||||
if (!oneData) return "";
|
||||
return oneData.getGrilListAvatar();
|
||||
}
|
||||
|
||||
/** 获取主题枚举,根据 id */
|
||||
public getGrilCategoryById(girlId: number): number {
|
||||
const cats = this.ensureCategories();
|
||||
|
||||
// 遍历
|
||||
for (const bucket of cats.values()) {
|
||||
// 先查简要信息
|
||||
const brief = bucket.briefs.get(girlId);
|
||||
if (brief && brief.category) {
|
||||
return brief.category;
|
||||
}
|
||||
// 兜底:若只缓存了详情,也从详情里的 brief 取
|
||||
const detail = bucket.details.get(girlId);
|
||||
if (detail?.brief && typeof detail.brief.category) {
|
||||
return detail.brief.category;
|
||||
if (brief) {
|
||||
return brief.getGrilCategory();
|
||||
}
|
||||
}
|
||||
|
||||
// 未找到
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** 获取list头像路径 */
|
||||
public getGrilListAvatar(categoryId: string, girlId: number): string {
|
||||
let oneData = this.getGrilBrief(categoryId, girlId);
|
||||
if (!oneData) return "";
|
||||
return oneData.listAvatarPath;
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 技师的详细数据 --------------------------------------------------------- */
|
||||
|
||||
// 解析技师图片数据,一个
|
||||
private parseOneGirlPhoto(data: proto.cs.IPurchaseCommercialImage): proto.cs.IPurchaseCommercialImage | null {
|
||||
if (!data) return null;
|
||||
const oneData: proto.cs.IPurchaseCommercialImage = {
|
||||
imageType: data.imageType, // 图片类型
|
||||
imagePrice: data.imagePrice, // 图片价格
|
||||
path: data.path, // 图片资源路径
|
||||
isRelease: data.isRelease, // 是否解锁
|
||||
};
|
||||
return oneData;
|
||||
}
|
||||
|
||||
// 解析技师图片数据,多个
|
||||
private parseAllGirlPhoto(data: proto.cs.IPurchaseCommercialImage[]): proto.cs.IPurchaseCommercialImage[] | null {
|
||||
if (!data) return null;
|
||||
let allData = [];
|
||||
for (const value of data) {
|
||||
const oneData: proto.cs.IPurchaseCommercialImage = this.parseOneGirlPhoto(value);
|
||||
if (oneData) {
|
||||
allData.push(oneData);
|
||||
}
|
||||
}
|
||||
return allData;
|
||||
}
|
||||
|
||||
// 解析技师视频数据,一个
|
||||
private parseOneGirlVideo(data: proto.cs.IPurchaseCommercialVideo): proto.cs.IPurchaseCommercialVideo | null {
|
||||
if (!data) return null;
|
||||
const oneData: proto.cs.IPurchaseCommercialVideo = {
|
||||
path: data.path, // 视频资源路径
|
||||
emotion: data.emotion, // 关联情绪
|
||||
videoPrice: data.videoPrice, // 价格
|
||||
isRelease: data.isRelease, // 是否解锁
|
||||
};
|
||||
return oneData;
|
||||
}
|
||||
|
||||
// 解析技师视频数据,多个
|
||||
private parseAllGirlVideo(data: proto.cs.IPurchaseCommercialVideo[]): proto.cs.IPurchaseCommercialVideo[] | null {
|
||||
if (!data) return null;
|
||||
let allData = [];
|
||||
for (const value of data) {
|
||||
const oneData: proto.cs.IPurchaseCommercialVideo = this.parseOneGirlVideo(value);
|
||||
if (oneData) {
|
||||
allData.push(oneData);
|
||||
}
|
||||
}
|
||||
return allData;
|
||||
}
|
||||
|
||||
// 解析技师详细数据,一个
|
||||
private parseOneGirlDetail(data: proto.cs.IGirlDetail): proto.cs.IGirlDetail | null {
|
||||
private parseOneGirlDetail(data: proto.cs.IGirlsDetail): GirlDetailData | null {
|
||||
if (!data) return null;
|
||||
const photoData = this.parseAllGirlPhoto(data.images);
|
||||
const videoData = this.parseAllGirlVideo(data.videos);
|
||||
const briefData = this.parseOneGirlBrief(data.brief);
|
||||
const oneData: proto.cs.IGirlDetail = {
|
||||
brief: briefData, // 技师简要数据
|
||||
desc: data.desc, // 技师描述
|
||||
isRelease: data.isRelease, // 技师是否解锁
|
||||
chatCount: data.chatCount, // 剩余聊天次数
|
||||
images: photoData, // 技师图片列表
|
||||
videos: videoData, // 技师视频列表
|
||||
};
|
||||
let oneData = new GirlDetailData();
|
||||
oneData.init?.(DataId.GirlDetail);
|
||||
oneData.setData(data);
|
||||
return oneData;
|
||||
}
|
||||
|
||||
// 解析技师详细数据,多个
|
||||
private parseAllGirlDetail(data: proto.cs.IGirlDetail[]): proto.cs.IGirlDetail[] | null {
|
||||
if (!data) return null;
|
||||
let allData = [];
|
||||
for (const value of data) {
|
||||
const oneData: proto.cs.IGirlDetail = this.parseOneGirlDetail(value);
|
||||
if (oneData) {
|
||||
allData.push(oneData);
|
||||
}
|
||||
}
|
||||
return allData;
|
||||
}
|
||||
|
||||
/** 保存技师的详细数据 */
|
||||
public setGirlDetails(categoryId: string, data: proto.cs.ICSGetGirlDetailRes): void {
|
||||
const d = data?.detail;
|
||||
if (!d) return;
|
||||
// 合并简要信息
|
||||
if (d.brief) this.mergeBriefs(categoryId, [d.brief]);
|
||||
const oneDetail = this.parseOneGirlDetail(d);
|
||||
private setGirlDetail(categoryId: string, data: proto.cs.IGirlData[]): void {
|
||||
if (!data) return;
|
||||
const bucket = this.ensureBucket(categoryId);
|
||||
// id
|
||||
const id = d.brief?.id ?? 0;
|
||||
// 写入详情
|
||||
bucket.details.set(id, oneDetail);
|
||||
for (const g of data) {
|
||||
const one = this.parseOneGirlDetail(g.detail);
|
||||
if (!one) continue;
|
||||
bucket.details.set(g.id, one);
|
||||
}
|
||||
console.log("保存技师的详细数据: ", bucket);
|
||||
}
|
||||
|
||||
/** 取某分类 + girlId 的详细信息 */
|
||||
public getGrilDetail(categoryId: string, girlId: number): proto.cs.IGirlDetail | null {
|
||||
/** 取某分类 + girlId 的详细数据 */
|
||||
public getGrilDetail(categoryId: string, girlId: number): GirlDetailData | null {
|
||||
const b = this.ensureCategories().get(categoryId);
|
||||
if (!b) return null;
|
||||
return b.details.get(girlId) ?? null;
|
||||
@@ -324,163 +271,321 @@ export class GirlData extends BaseData {
|
||||
public getGrilDesc(categoryId: string, girlId: number): string {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return "";
|
||||
return oneData.desc;
|
||||
}
|
||||
|
||||
/** 获取技师是否解锁 */
|
||||
public getGrilIsRelease(categoryId: string, girlId: number): boolean {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return false;
|
||||
return oneData.isRelease;
|
||||
}
|
||||
|
||||
/** 获取技师剩余聊天次数 */
|
||||
public getGrilChatCount(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.chatCount;
|
||||
}
|
||||
|
||||
/** 获取所有技师图片数据 */
|
||||
private getAllGrilPhotoData(categoryId: string, girlId: number): proto.cs.IPurchaseCommercialImage[] | null {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData || !oneData.images) return null;
|
||||
return oneData.images;
|
||||
}
|
||||
return oneData.getGirlDesc();
|
||||
}
|
||||
|
||||
/** 获取所有技师图片数据的数量 */
|
||||
public getAllGrilPhotoDataCount(categoryId: string, girlId: number): number {
|
||||
let allData = this.getAllGrilPhotoData(categoryId, girlId);
|
||||
if (!allData) return 0;
|
||||
return allData.length;
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.getAllGrilPhotoDataCount();
|
||||
}
|
||||
|
||||
/** 获取技师图片数据,通过 index */
|
||||
private getGrilPhotoData(categoryId: string, girlId: number, index: number): proto.cs.IPurchaseCommercialImage | null {
|
||||
let allData = this.getAllGrilPhotoData(categoryId, girlId);
|
||||
if (!allData) return null;
|
||||
// 下标越界保护
|
||||
if (index < 0 || index >= allData.length) return null;
|
||||
|
||||
return allData[index] ?? null;
|
||||
}
|
||||
/** 获取所有技师图片数据的id */
|
||||
public getAllGrilPhotoDataId(categoryId: string, girlId: number): number[] {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return [];
|
||||
return oneData.getAllGrilPhotoDataId();
|
||||
}
|
||||
|
||||
/** 获取技师图片的类型 */
|
||||
public getGrilPhotoType(categoryId: string, girlId: number, index: number): number {
|
||||
let oneData = this.getGrilPhotoData(categoryId, girlId, index);
|
||||
public getGrilPhotoType(categoryId: string, girlId: number, id: number): number {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.imageType;
|
||||
return oneData.getGrilPhotoType(id);
|
||||
}
|
||||
|
||||
/** 获取技师图片的聊天触发次数 */
|
||||
public getGrilPhotoUnlockCounts(categoryId: string, girlId: number, id: number): number {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.getGrilPhotoUnlockCounts(id);
|
||||
}
|
||||
|
||||
/** 获取技师图片的价格 */
|
||||
public getGrilPhotoPrice(categoryId: string, girlId: number, index: number): number {
|
||||
let oneData = this.getGrilPhotoData(categoryId, girlId, index);
|
||||
if (!oneData) return 0;
|
||||
return oneData.imagePrice;
|
||||
}
|
||||
|
||||
/** 获取技师图片的路径 */
|
||||
public getGrilPhotoPic(categoryId: string, girlId: number, index: number): string {
|
||||
let oneData = this.getGrilPhotoData(categoryId, girlId, index);
|
||||
if (!oneData) return "";
|
||||
return oneData.path;
|
||||
}
|
||||
|
||||
/** 获取技师图片是否解锁 */
|
||||
public getGrilPhotoIsRelease(categoryId: string, girlId: number, index: number): boolean {
|
||||
let oneData = this.getGrilPhotoData(categoryId, girlId, index);
|
||||
if (!oneData) return false;
|
||||
return oneData.isRelease;
|
||||
}
|
||||
|
||||
/** 获取所有技师视频数据 */
|
||||
private getAllGrilVideoData(categoryId: string, girlId: number): proto.cs.IPurchaseCommercialVideo[] | null {
|
||||
public getGrilPhotoPrice(categoryId: string, girlId: number, id: number): number {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData || !oneData.videos) return null;
|
||||
|
||||
return oneData.videos ?? null;
|
||||
if (!oneData) return 0;
|
||||
return oneData.getGrilPhotoPrice(id);
|
||||
}
|
||||
|
||||
/** 获取技师图片的资源路径 */
|
||||
public getGrilPhotoPic(categoryId: string, girlId: number, id: number): string {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return "";
|
||||
return oneData.getGrilPhotoPath(id);
|
||||
}
|
||||
|
||||
/** 获取所有技师视频数据的数量 */
|
||||
public getAllGrilVideoDataCount(categoryId: string, girlId: number): number {
|
||||
let allData = this.getAllGrilVideoData(categoryId, girlId);
|
||||
if (!allData) return 0;
|
||||
return allData.length;
|
||||
}
|
||||
|
||||
/** 获取技师视频数据,通过 index */
|
||||
private getGrilVideoData(categoryId: string, girlId: number, index: number): proto.cs.IPurchaseCommercialVideo | null {
|
||||
let allData = this.getAllGrilVideoData(categoryId, girlId);
|
||||
if (!allData) return null;
|
||||
// 下标越界保护
|
||||
if (index < 0 || index >= allData.length) return null;
|
||||
|
||||
return allData[index] ?? null;
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.getAllGrilVideoDataCount();
|
||||
}
|
||||
|
||||
/** 获取技师视频的路径 */
|
||||
public getGrilVideoPath(categoryId: string, girlId: number, index: number): string {
|
||||
let oneData = this.getGrilVideoData(categoryId, girlId, index);
|
||||
/** 获取所有技师视频数据的id */
|
||||
public getAllGrilVideoDataId(categoryId: string, girlId: number): number[] {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return [];
|
||||
return oneData.getAllGrilVideoDataId();
|
||||
}
|
||||
|
||||
/** 获取技师视频的资源路径 */
|
||||
public getGrilVideoPath(categoryId: string, girlId: number, id: number): string {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return "";
|
||||
return oneData.path;
|
||||
return oneData.getGrilVideoPath(id);
|
||||
}
|
||||
|
||||
/** 获取技师视频的关联情绪 */
|
||||
public getGrilVideoEmotion(categoryId: string, girlId: number, index: number): number {
|
||||
let oneData = this.getGrilVideoData(categoryId, girlId, index);
|
||||
public getGrilVideoEmotion(categoryId: string, girlId: number, id: number): number {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.emotion;
|
||||
return oneData.getGrilVideoEmotion(id);
|
||||
}
|
||||
|
||||
/** 获取技师视频的价格 */
|
||||
public getGrilVideoPrice(categoryId: string, girlId: number, index: number): number {
|
||||
let oneData = this.getGrilVideoData(categoryId, girlId, index);
|
||||
public getGrilVideoPrice(categoryId: string, girlId: number, id: number): number {
|
||||
let oneData = this.getGrilDetail(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.videoPrice;
|
||||
return oneData.getGrilVideoPrice(id);
|
||||
}
|
||||
|
||||
/** 获取技师视频是否解锁 */
|
||||
public getGrilVideoIsRelease(categoryId: string, girlId: number, index: number): boolean {
|
||||
let oneData = this.getGrilVideoData(categoryId, girlId, index);
|
||||
/** --------------------------------------------------------- 技师的解锁数据 --------------------------------------------------------- */
|
||||
|
||||
// 解析技师解锁数据,一个
|
||||
private parseOneGirlUnlock(data: proto.cs.IGirlData): GirlUnlockData | null {
|
||||
if (!data) return null;
|
||||
let oneData = new GirlUnlockData();
|
||||
oneData.init?.(DataId.GirlUnlock);
|
||||
oneData.setId(data.id);
|
||||
oneData.setIsRelease(data.isRelease);
|
||||
if (data.images) {
|
||||
let ids = [];
|
||||
for (let one of data.images) {
|
||||
ids.push(one.resId);
|
||||
}
|
||||
oneData.setUnlockedImageIds(ids);
|
||||
}
|
||||
if (data.videos) {
|
||||
let ids = [];
|
||||
for (let one of data.videos) {
|
||||
ids.push(one.resId);
|
||||
}
|
||||
oneData.setUnlockedVideoIds(ids);
|
||||
}
|
||||
return oneData;
|
||||
}
|
||||
|
||||
/** 保存技师的解锁数据 */
|
||||
private setGirlUnlock(categoryId: string, data: proto.cs.IGirlData[]): void {
|
||||
if (!data) return;
|
||||
const bucket = this.ensureBucket(categoryId);
|
||||
for (const g of data) {
|
||||
const one = this.parseOneGirlUnlock(g);
|
||||
if (!one) continue;
|
||||
bucket.unlocks.set(g.id, one);
|
||||
}
|
||||
console.log("保存技师的解锁数据: ", bucket);
|
||||
}
|
||||
|
||||
/** 取某分类 + girlId 的解锁数据 */
|
||||
private getGrilUnlock(categoryId: string, girlId: number): GirlUnlockData | null {
|
||||
const b = this.ensureCategories().get(categoryId);
|
||||
if (!b) return null;
|
||||
return b.unlocks.get(girlId) ?? null;
|
||||
}
|
||||
|
||||
/** 获取 付费技师是否已经解锁 */
|
||||
public getIsRelease(categoryId: string, girlId: number): boolean {
|
||||
let oneData = this.getGrilUnlock(categoryId, girlId);
|
||||
if (!oneData) return false;
|
||||
return oneData.isRelease;
|
||||
return oneData.getIsRelease();
|
||||
}
|
||||
|
||||
/** 判断图片是否解锁 */
|
||||
public isImageUnlock(categoryId: string, girlId: number, id: number): boolean {
|
||||
let oneData = this.getGrilUnlock(categoryId, girlId);
|
||||
if (!oneData) return false;
|
||||
return oneData.isImageUnlock(id);
|
||||
}
|
||||
|
||||
/** 解锁图片 */
|
||||
public unlockImage(categoryId: string, girlId: number, id: number): void {
|
||||
let oneData = this.getGrilUnlock(categoryId, girlId);
|
||||
if (!oneData) return;
|
||||
return oneData.unlockImage(id);
|
||||
}
|
||||
|
||||
/** 获取所有解锁图片的 id */
|
||||
public getUnlockedImageIds(categoryId: string, girlId: number): number[] {
|
||||
let oneData = this.getGrilUnlock(categoryId, girlId);
|
||||
if (!oneData) return [];
|
||||
return oneData.getUnlockedImageIds();
|
||||
}
|
||||
|
||||
/** 判断视频是否解锁 */
|
||||
public isVideoUnlock(categoryId: string, girlId: number, id: number): boolean {
|
||||
let oneData = this.getGrilUnlock(categoryId, girlId);
|
||||
if (!oneData) return false;
|
||||
return oneData.isVideoUnlock(id);
|
||||
}
|
||||
|
||||
/** 解锁视频 */
|
||||
public unlockVideo(categoryId: string, girlId: number, id: number): void {
|
||||
let oneData = this.getGrilUnlock(categoryId, girlId);
|
||||
if (!oneData) return;
|
||||
return oneData.unlockVideo(id);
|
||||
}
|
||||
|
||||
/** 获取所有解锁视频的 id */
|
||||
public getUnlockedVideoIds(categoryId: string, girlId: number): number[] {
|
||||
let oneData = this.getGrilUnlock(categoryId, girlId);
|
||||
if (!oneData) return [];
|
||||
return oneData.getUnlockedVideoIds();
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 技师的聊天数据 --------------------------------------------------------- */
|
||||
|
||||
// 解析技师聊天数据,一个
|
||||
private parseOneGirlChat(data: proto.cs.IGirlData): GirlChatData | null {
|
||||
if (!data) return null;
|
||||
let oneData = new GirlChatData();
|
||||
oneData.init?.(DataId.GirlChat);
|
||||
oneData.setChatTotalCount(data.chatTotalCount);
|
||||
oneData.setChatRemainCount(data.chatRemainCount);
|
||||
return oneData;
|
||||
}
|
||||
|
||||
/** 保存技师的聊天数据 */
|
||||
private setGirlChat(categoryId: string, data: proto.cs.IGirlData[]): void {
|
||||
if (!data) return;
|
||||
const bucket = this.ensureBucket(categoryId);
|
||||
for (const g of data) {
|
||||
const one = this.parseOneGirlChat(g);
|
||||
if (!one) continue;
|
||||
bucket.chats.set(g.id, one);
|
||||
}
|
||||
console.log("保存技师的聊天数据: ", bucket);
|
||||
}
|
||||
|
||||
/** 取某分类 + girlId 的聊天数据 */
|
||||
private getGrilChat(categoryId: string, girlId: number): GirlChatData | null {
|
||||
const b = this.ensureCategories().get(categoryId);
|
||||
if (!b) return null;
|
||||
return b.chats.get(girlId) ?? null;
|
||||
}
|
||||
|
||||
/** 获取总聊天次数 */
|
||||
public getChatTotalCount(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilChat(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.getChatTotalCount();
|
||||
}
|
||||
|
||||
/** 保存总聊天次数 */
|
||||
public setChatTotalCount(categoryId: string, girlId: number, value: number): void {
|
||||
let oneData = this.getGrilChat(categoryId, girlId);
|
||||
if (!oneData) return;
|
||||
return oneData.setChatTotalCount(value);
|
||||
}
|
||||
|
||||
/** 获取剩余聊天次数 */
|
||||
public getChatRemainCount(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilChat(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.getChatRemainCount();
|
||||
}
|
||||
|
||||
/** 保存剩余聊天次数 */
|
||||
public setChatRemainCount(categoryId: string, girlId: number, value: number): void {
|
||||
let oneData = this.getGrilChat(categoryId, girlId);
|
||||
if (!oneData) return;
|
||||
return oneData.setChatRemainCount(value);
|
||||
}
|
||||
|
||||
/** 更新剩余聊天次数 */
|
||||
public useChat(categoryId: string, girlId: number, times: number = 1): void {
|
||||
let oneData = this.getGrilChat(categoryId, girlId);
|
||||
if (!oneData) return;
|
||||
return oneData.useChat(times);
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 技师的好感度数据 --------------------------------------------------------- */
|
||||
|
||||
// 解析技师好感度数据,一个
|
||||
private parseOneGirlFavorability(data: proto.cs.IGirlData): GirlFavorabilityData | null {
|
||||
if (!data) return null;
|
||||
let oneData = new GirlFavorabilityData();
|
||||
oneData.init?.(DataId.GirlFavorability);
|
||||
oneData.setStar(data.star);
|
||||
return oneData;
|
||||
}
|
||||
|
||||
/** 保存技师的好感度数据 */
|
||||
private setGirlFavorability(categoryId: string, data: proto.cs.IGirlData[]): void {
|
||||
if (!data) return;
|
||||
const bucket = this.ensureBucket(categoryId);
|
||||
for (const g of data) {
|
||||
const one = this.parseOneGirlFavorability(g);
|
||||
if (!one) continue;
|
||||
bucket.favorability.set(g.id, one);
|
||||
}
|
||||
console.log("保存技师的好感度数据: ", bucket);
|
||||
}
|
||||
|
||||
/** 取某分类 + girlId 的好感度数据 */
|
||||
private getGrilFavorability(categoryId: string, girlId: number): GirlFavorabilityData | null {
|
||||
const b = this.ensureCategories().get(categoryId);
|
||||
if (!b) return null;
|
||||
return b.favorability.get(girlId) ?? null;
|
||||
}
|
||||
|
||||
/** 获取星级 */
|
||||
public getStar(categoryId: string, girlId: number): number {
|
||||
let oneData = this.getGrilFavorability(categoryId, girlId);
|
||||
if (!oneData) return 0;
|
||||
return oneData.getStar();
|
||||
}
|
||||
|
||||
/** --------------------------------------------------------- 每日推荐 --------------------------------------------------------- */
|
||||
|
||||
/** 保存每日推荐:放入特殊分类 DAILY_BUCKET,并维护 id 索引 */
|
||||
public setDailyRecommend(res: proto.cs.ICSDailyRecommendRes): void {
|
||||
this.mergeBriefs(DAILY_BUCKET, res.girls);
|
||||
this._dailyRecommendIds = res.girls.map(g => g.id ?? 0);
|
||||
console.log("保存每日推荐: ", this._dailyRecommendIds);
|
||||
public setDailyRecommend(data: proto.cs.ICSDailyRecommendRes): void {
|
||||
if (!data) return;
|
||||
this.mergeOneBrief(DAILY_BUCKET, data.girl);
|
||||
const bucket = this.ensureBucket(DAILY_BUCKET);
|
||||
console.log("保存每日推荐: ", bucket);
|
||||
}
|
||||
|
||||
/** 获取每日推荐的简要信息 */
|
||||
private getRecommendGrilBrief(categoryId: string, index: number): proto.cs.IGirlBrief | null {
|
||||
const b = this.ensureCategories().get(categoryId);
|
||||
if (!b) return null;
|
||||
if (index < 0 || index >= b.girlIds.length) return null;
|
||||
return b.briefs.get(b.girlIds[index]) ?? null;
|
||||
/** 获取推荐id */
|
||||
public getRecommendGirlId(): number {
|
||||
const bucket = this.ensureBucket(DAILY_BUCKET);
|
||||
const girlIds = bucket.girlIds;
|
||||
const length = girlIds.length;
|
||||
if (length <= 0) return 0;
|
||||
return girlIds[length-1];
|
||||
}
|
||||
|
||||
/** 获取每日推荐的简要数据 */
|
||||
private getRecommendGrilBrief(): GirlBriefData | null {
|
||||
const recId = this.getRecommendGirlId();
|
||||
if (recId <= 0) return null;
|
||||
const data = this.getGrilBrief(DAILY_BUCKET, recId);
|
||||
return data;
|
||||
}
|
||||
|
||||
/** 获取 id */
|
||||
public getRecommendGrilId(index: number): number {
|
||||
let oneData = this.getRecommendGrilBrief(DAILY_BUCKET, index);
|
||||
if (!oneData) return 0;
|
||||
return oneData.id;
|
||||
}
|
||||
|
||||
/** 获取名字 */
|
||||
public getRecommendGrilName(index: number): string {
|
||||
let oneData = this.getRecommendGrilBrief(DAILY_BUCKET, index);
|
||||
public getRecommendGrilName(): string {
|
||||
let oneData = this.getRecommendGrilBrief();
|
||||
if (!oneData) return "";
|
||||
return oneData.name;
|
||||
return oneData.getGrilName();
|
||||
}
|
||||
|
||||
/** 获取头像 */
|
||||
public getRecommendGrilAvatar(index: number): string {
|
||||
let oneData = this.getRecommendGrilBrief(DAILY_BUCKET, index);
|
||||
/** 获取头像路径 */
|
||||
public getRecommendGrilAvatar(): string {
|
||||
let oneData = this.getRecommendGrilBrief();
|
||||
if (!oneData) return "";
|
||||
return oneData.avatar;
|
||||
return oneData.getGrilAvatar();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user