HJ_Server/src/public/xstask.ts
DESKTOP-15R5JU0\legu 97e070ea81 init
2023-11-17 12:02:12 +08:00

139 lines
5.2 KiB
TypeScript

import { OptionalId, UpdateFilter } from 'mongodb';
import { ApiCall } from 'tsrpc';
import { playerInfoType } from '../module/collection_palyerInfo';
import { CollectionXstask } from '../module/collection_xstask';
import { PublicShared } from '../shared/public/public';
export class XstaskFun {
/**所有玩家的悬赏任务缓存 */
static uidTask: k_v<CollectionXstask[]> = {};
/**获取单个悬赏任务 */
static async getTask(uid: string, _id: string) {
return this.uidTask[uid]?.find(task => task._id == _id) || await G.mongodb.collection('xstask').findOne({ uid: uid, _id: G.mongodb.conversionId(_id) });
}
/**获取所有悬赏任务 */
static async getAllTask(uid: string) {
let taskList = this.uidTask[uid];
if (!taskList) {
taskList = this.uidTask[uid] = (await G.mongodb.collection('xstask').find({ uid: uid }).toArray()).map(task => G.mongodb.conversionIdObj(task));
};
return taskList;
}
/**完成任务标记 */
static async finishTask(uid: string, _id: string) {
// 修改数据库
G.mongodb.collection('xstask').updateOne({ uid: uid, _id: G.mongodb.conversionId(_id) }, { $set: { 'receiveData.rec': true } });
// 修改缓存
let index = this.uidTask[uid]?.findIndex(task => task._id == _id);
this.uidTask[uid][index].receiveData.rec = true
return
}
/**更新任务单个 */
static async updateTask(uid: string, _id: string, taskId: string) {
G.mongodb.collection('xstask').updateOne({ uid: uid, _id: G.mongodb.conversionId(_id) }, { $unset: { receiveData: 1 }, $set: {taskId: taskId} });
let index = this.uidTask[uid]?.findIndex(task => task._id == _id);
delete this.uidTask[uid][index].receiveData;
this.uidTask[uid][index].taskId = taskId;
}
/**删除单个悬赏任务 */
static async delTask(uid: string, _id: string) {
let task = this.uidTask[uid]?.find(task => task._id == _id);
task && this.uidTask[uid].removeOne(task);
G.mongodb.collection('xstask').deleteOne({ uid: uid, _id: G.mongodb.conversionId(_id) });
}
/**删除多个悬赏任务 */
static async delTasks(uid: string, _id: string[]) {
for (let id of _id) await this.delTask(uid, id);
}
/**添加多个悬赏任务 */
static async addTasks(uid: string, taskArr: { taskId: string; }[]) {
let taskList = taskArr.map(task => {
return {
taskId: task.taskId,
uid: uid,
};
});
let result = await G.mongodb.collection('xstask').insertMany(taskList);
this.uidTask[uid] = this.uidTask[uid] || [];
taskList.forEach((task, index) => {
this.uidTask[uid].push(G.mongodb.conversionIdObj({
_id: result.insertedIds[index],
...task
}));
});
return this.uidTask[uid];
}
/**派遣任务任务 */
static async receiveTask(uid: string, _id: string, d: CollectionXstask['receiveData']) {
let cache = this.uidTask[uid]?.find(task => task._id == _id);
if (cache) cache.receiveData = d;
G.mongodb.collection('xstask').updateOne({ uid: uid, _id: G.mongodb.conversionId(_id) }, { $set: { receiveData: d } });
}
/**获取所有已被派遣的英雄 */
static async getAllReceiveHero(uid: string) {
let heroIds: string[] = [];
let allTask = await this.getAllTask(uid);
allTask.forEach(task => heroIds = heroIds.concat(task.receiveData?.heros || []));
return heroIds;
}
/**获取悬赏任务记录信息 */
static async getInfo(uid: string) {
return await G.mongodb.collection('playerInfo', 'xstask').findOne({ uid: uid, type: 'xstask' });
}
/**修改悬赏任务记录信息 */
static async changeInfo(uid: string, change: Pick<UpdateFilter<OptionalId<playerInfoType['xstask']>>, '$inc' | '$set'>) {
G.mongodb.collection('playerInfo', 'xstask').updateOne(
{ uid: uid, type: 'xstask' },
change,
{ upsert: true }
);
}
/**随机任务 */
static randomTasks(lv: number, num: number) {
let tasks = Object.values(G.gc.xstask).filter(task => G.gc.xstaskcom.lv[lv].taskColor.includes(task.colour)).sort(function () {
return Math.random() - 0.5;
});
return (PublicShared.randomDropGroup(0, num, [tasks] as any) as any as typeof tasks).map(v => {
return {
taskId: v.id.toString()
};
});
}
/**红点 */
static async getHongDian(call: ApiCall) {
let _res = {
show: false
};
let _xstasks = await this.getAllTask(call.uid);
_res.show = _xstasks.every(v => !v.receiveData);
for (let index = 0; index < _xstasks.length; index++) {
const element = _xstasks[index];
// 未派遣
if (!element.receiveData) continue;
let taskConf = G.gc.xstask[element?.taskId];
// 派遣时间不足
if (element.receiveData.time + taskConf.time > G.time) continue;
_res.show = true;
break;
}
return _res;
}
}