diff --git a/game-server/app/servers/activity/handler/gachaHandler.ts b/game-server/app/servers/activity/handler/gachaHandler.ts index 01bc61194..88f5b3fb0 100644 --- a/game-server/app/servers/activity/handler/gachaHandler.ts +++ b/game-server/app/servers/activity/handler/gachaHandler.ts @@ -1,6 +1,6 @@ import { Application, BackendSession } from "pinus"; -import { resResult, getRandomWithWeight, getRandEelm } from "../../../pubUtils/util"; -import { STATUS, GACHA_ID, HERO_QUALITY_TYPE, TASK_TYPE } from "../../../consts"; +import { resResult, getRandomWithWeight, getRandEelm, shouldRefresh } from "../../../pubUtils/util"; +import { STATUS, GACHA_ID, HERO_QUALITY_TYPE, TASK_TYPE, REFRESH_HOUR } from "../../../consts"; import { gameData } from "../../../pubUtils/data"; import { GachaListReturn, GachaResult, GachaData } from "../../../domain/activityField/gachaField"; import { UserGachaModel } from "../../../db/UserGacha"; @@ -9,7 +9,7 @@ import { RoleModel } from "../../../db/Role"; import { HeroModel, HeroUpdate } from "../../../db/Hero"; import { RewardInter } from "../../../pubUtils/interface"; import { handleCost, createHeroes, addItems } from "../../../services/rewardService"; -import { getAfterDateByDay } from "../../../pubUtils/timeUtil"; +import { getAfterDateByDay, getTodayZeroDate, getZeroDate } from "../../../pubUtils/timeUtil"; import { UserGachaRecModel } from "../../../db/UserGachaRec"; import { ActivityModel } from "../../../db/Activity"; import { checkTask } from "../../../services/taskService"; @@ -17,6 +17,7 @@ import { RECRUIT } from "../../../pubUtils/dicParam"; import { getAllHeroByQuality } from "../../../services/gachaService"; import { transPiece } from "../../../pubUtils/itemUtils"; import { CreateHeroParam } from "../../../domain/roleField/hero"; +import roleHandler from "../../role/handler/roleHandler"; export default function (app: Application) { return new GachaHandler(app); @@ -278,4 +279,62 @@ export class GachaHandler { }); } + + /** + * @description 今天拜访过的武将 + * @param {{ }} msg + * @param {BackendSession} session + * @memberof GachaHandler + */ + async getVisitedHero(msg: { }, session: BackendSession) { + const roleId: string = session.get('roleId'); + + let { visitedHero, refVisitedTime } = await UserGachaModel.findByRole(roleId, GACHA_ID.NORMAL, 0); + if(shouldRefresh(refVisitedTime, new Date(), REFRESH_HOUR)) { + visitedHero = []; + } + + return resResult(STATUS.SUCCESS, { + hids: visitedHero + }); + } + + /** + * @description 拜访武将 + * @param {{ hid: number }} msg + * @param {BackendSession} session + * @memberof GachaHandler + */ + async visitHero(msg: { hid: number }, session: BackendSession) { + const roleId: string = session.get('roleId'); + const roleName: string = session.get('roleName'); + const sid: string = session.get('sid'); + const { hid } = msg; + + let dicHero = gameData.hero.get(hid); + if(!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND); + if(!dicHero.recruit) return resResult(STATUS.DIC_DATA_NOT_FOUND); + let { pieceId } = dicHero; + + let { visitedHero, refVisitedTime } = await UserGachaModel.findByRole(roleId, GACHA_ID.NORMAL, 0); + if(shouldRefresh(refVisitedTime, new Date(), REFRESH_HOUR)) { + visitedHero = []; + refVisitedTime = getTodayZeroDate(REFRESH_HOUR); + } + if(visitedHero.includes(hid)) { + return resResult(STATUS.GACHA_HAS_VISITED); + } + if(visitedHero.length >= RECRUIT.RECRUIT_DAILY_RECRUIT_SHARD) { + return resResult(STATUS.GACHA_VISITED_COUNT_OVER); + } + + visitedHero.push(hid); + let userGacha = await UserGachaModel.updateInfo(roleId, GACHA_ID.NORMAL, 0, { visitedHero, refVisitedTime }); + let goods = await addItems(roleId, roleName, sid, [{ id: pieceId, count: RECRUIT.RECRUIT_SHARD_LIMIT }]); + + return resResult(STATUS.SUCCESS, { + hids: userGacha.visitedHero, + goods + }); + } } \ No newline at end of file diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 89d473584..46895c9bc 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -327,6 +327,8 @@ export const STATUS = { GACHA_HOPE_NOT_GOLD: { code: 31103, simStr: '武将品质错误' }, GACHA_CAN_NOT_PICK: { code: 31004, simStr: '不可选择该武将' }, GACHA_TURNTABLE_POINT_NOT_ENOUGH: { code: 31005, simStr: '转盘积分不足' }, + GACHA_HAS_VISITED: { code: 31006, simStr: '该武将已拜访过' }, + GACHA_VISITED_COUNT_OVER: { code: 31007, simStr: '今天武将拜访已超过次数' }, // 社交相关状态 40000 - 49999 SYS_CHANNEL_AUTH_NOT_ENOUGH: { code: 40000, simStr: '无法在系统频道发送消息' }, UPDATE_PRIVATE_MSG_READ_TIME_ERR: { code: 40001, simStr: '更新私聊阅读时间失败' }, diff --git a/shared/db/UserGacha.ts b/shared/db/UserGacha.ts index ddd2dd131..e31a44b58 100644 --- a/shared/db/UserGacha.ts +++ b/shared/db/UserGacha.ts @@ -78,6 +78,12 @@ export default class UserGacha extends BaseModel { @prop({ required: true, default: 0 }) pickHero: number; // 玩家指定武将 + @prop({ required: true, default: [], type: Number }) + visitedHero: number[]; // 玩家指定武将 + + @prop({ required: true, default: () => { return getTodayZeroDate(REFRESH_HOUR) } }) + refVisitedTime: Date; // 玩家指定武将 + public static async findAllByRole(roleId: string) { let rec: UserGachaType[] = await UserGachaModel.find({ roleId }).lean(); return rec;