✨ feat(离线icon): 到8110dd75c

This commit is contained in:
luying
2023-09-01 11:01:35 +08:00
parent a89392eb27
commit 94cce57ce6
9 changed files with 150 additions and 48 deletions
@@ -6,7 +6,7 @@ import { STATUS } from '../../../consts/statusCode';
import { arrToMap, resResult } from '../../../pubUtils/util'; import { arrToMap, resResult } from '../../../pubUtils/util';
import { getTimeFunM } from '../../../pubUtils/timeUtil'; import { getTimeFunM } from '../../../pubUtils/timeUtil';
import { LadderMatchModel, LadderUpdateInter } from '../../../db/LadderMatch'; import { LadderMatchModel, LadderUpdateInter } from '../../../db/LadderMatch';
import { battleEndWhenChange, checkRank, generateInitRecInfo, generateOppPlayers, getBuyCntCost, getLadderData, getLadderEnemies, getLadderOppDetailData, getLadderOppStatus, getNumberArr, ladderBattleEndReward, refreshLadderDaily, refreshLadderEnemies, sendLadderDailyReward, uniqueArr } from '../../../services/ladderService'; import { battleEndWhenChange, checkRank, generateInitRecInfo, generateOppPlayers, getBuyCntCost, getLadderData, getLadderEnemies, getLadderOppDetailData, getLadderOppStatus, getNumberArr, ladderBattleEndReward, pushLadderIconShow, refreshLadderDaily, refreshLadderEnemies, sendLadderDailyReward, uniqueArr } from '../../../services/ladderService';
import { LadderDataReturn, LadderDefense, LadderDefenseHero, LadderOppDetailReturn, LadderOppLineupReturn, LadderOppPlayerHeroInfo, LadderOppPlayerReturn } from '../../../domain/battleField/ladder'; import { LadderDataReturn, LadderDefense, LadderDefenseHero, LadderOppDetailReturn, LadderOppLineupReturn, LadderOppPlayerHeroInfo, LadderOppPlayerReturn } from '../../../domain/battleField/ladder';
import { LadderMatchRecModel } from '../../../db/LadderMatchRec'; import { LadderMatchRecModel } from '../../../db/LadderMatchRec';
import { HeroModel } from '../../../db/Hero'; import { HeroModel } from '../../../db/Hero';
@@ -234,6 +234,8 @@ export class LadderHandler {
let { battleGoods = [], breakGoods = [] } = rewardResult||{}; let { battleGoods = [], breakGoods = [] } = rewardResult||{};
await checkTaskInLadderEnd(serverId, roleId, sid, isSuccess, historyRank, atkLadderMatch.rank); await checkTaskInLadderEnd(serverId, roleId, sid, isSuccess, historyRank, atkLadderMatch.rank);
if (isSuccess || !rec.defenseInfo?.isRobot) await pushLadderIconShow(rec.roleId2, true);
return resResult(STATUS.SUCCESS, {...pick(result, ['rank', 'historyRank', 'challengeCnt','status', 'time', 'oppPlayers']), battleGoods, breakGoods}); return resResult(STATUS.SUCCESS, {...pick(result, ['rank', 'historyRank', 'challengeCnt','status', 'time', 'oppPlayers']), battleGoods, breakGoods});
} }
@@ -159,6 +159,7 @@ export class EntryHandler {
session.set('channel', user.channelInfo?.platformAppid||'pc'); session.set('channel', user.channelInfo?.platformAppid||'pc');
session.set('isNewUser', user['isNewUser']||false); session.set('isNewUser', user['isNewUser']||false);
session.set('version', version); session.set('version', version);
session.set('quitTime', role.quitTime ? (role.quitTime * 1000) : Date.now())
session.push('userid', () => { }); session.push('userid', () => { });
session.push('sid', () => { }); session.push('sid', () => { });
session.push('roleId', () => { }); session.push('roleId', () => { });
@@ -173,6 +174,8 @@ export class EntryHandler {
session.push('channel', () => { }); session.push('channel', () => { });
session.push('version', () => { }); session.push('version', () => { });
session.push('isNewUser', () => { }); session.push('isNewUser', () => { });
session.push('quitTime', () => { })
assignServer(role.roleId, session); assignServer(role.roleId, session);
// console.log('#####', role.serverId, role.guildCode) // console.log('#####', role.serverId, role.guildCode)
@@ -19,7 +19,7 @@ import { GVG } from "../../../pubUtils/dicParam";
import { RewardInter, pvpEndParamInter } from "../../../pubUtils/interface"; import { RewardInter, pvpEndParamInter } from "../../../pubUtils/interface";
import { parseGoodStr, resResult } from "../../../pubUtils/util"; import { parseGoodStr, resResult } from "../../../pubUtils/util";
import { isHeroHidden } from "../../../services/dataService"; import { isHeroHidden } from "../../../services/dataService";
import { calBreakGoods, checkHeroIsUsedInOtherVestige, checkVestige, checkVestigeOppStatus, checkVestigeRank, generateAttackHeroInfo, generateAttackInfo, generateDefenseInfo, getDayKeyInfo, getMyVestigeRank, getOppDetailData, getOppPlayerByRanks, getVestigeRecStatus, getVestigeRank, getVestigeUsedHeroes, isRobot, refreshVestigeOppRanks, saveScoreToRank, updateMyVestigeRank, saveVestigeRankSchedule, calVestigeLeagueBoxRewards, checkFightTime, savePlayerRank } from "../../../services/gvg/gvgFightService"; import { calBreakGoods, checkHeroIsUsedInOtherVestige, checkVestige, checkVestigeOppStatus, checkVestigeRank, generateAttackHeroInfo, generateAttackInfo, generateDefenseInfo, getDayKeyInfo, getMyVestigeRank, getOppDetailData, getOppPlayerByRanks, getVestigeRecStatus, getVestigeRank, getVestigeUsedHeroes, isRobot, refreshVestigeOppRanks, saveScoreToRank, updateMyVestigeRank, saveVestigeRankSchedule, calVestigeLeagueBoxRewards, checkFightTime, savePlayerRank, pushGvgFightIconShow } from "../../../services/gvg/gvgFightService";
import { addGVGReward, combinePushItem, handleGVGCost } from "../../../services/gvg/gvgItemService"; import { addGVGReward, combinePushItem, handleGVGCost } from "../../../services/gvg/gvgItemService";
import { addGVGActive, getGVGActive } from "../../../services/gvg/gvgPrepareService"; import { addGVGActive, getGVGActive } from "../../../services/gvg/gvgPrepareService";
import { addVestigeBattleEndRec } from "../../../services/gvg/gvgRecService"; import { addVestigeBattleEndRec } from "../../../services/gvg/gvgRecService";
@@ -378,6 +378,7 @@ export class GVGProduceHandler {
await saveScoreToRank(rec); await saveScoreToRank(rec);
addVestigeBattleEndRec(rec); addVestigeBattleEndRec(rec);
if (isSuccess && !rec.defenseInfo?.isRobot) await pushGvgFightIconShow(rec.defenseRoleId, battleCode);
return resResult(STATUS.SUCCESS, { return resResult(STATUS.SUCCESS, {
vestigeId: rec.vestigeId, vestigeId: rec.vestigeId,
+34 -3
View File
@@ -6,9 +6,9 @@ import { recentGuildMsgs, recentLeagueMsgs, recentPrivateChatInfos, recentServer
import { getCurTask, getPvpTask } from './task/taskService'; import { getCurTask, getPvpTask } from './task/taskService';
import { RoleModel, RoleType } from '../db/Role'; import { RoleModel, RoleType } from '../db/Role';
import { Application, FrontendOrBackendSession, pinus, RpcClient } from 'pinus'; import { Application, BackendSession, FrontendOrBackendSession, pinus, RpcClient } from 'pinus';
import { compareVersion, getRandEelmWithWeight, resResult } from '../pubUtils/util'; import { compareVersion, getRandEelmWithWeight, resResult } from '../pubUtils/util';
import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE, HERO_SELECT, ENTERY_ROLE_PICK, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE, ARTIFACT_SELECT, ACTIVITYITEM_SELECT, SNS_LINK_TYPE } from '../consts'; import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE, HERO_SELECT, ENTERY_ROLE_PICK, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE, ARTIFACT_SELECT, ACTIVITYITEM_SELECT, SNS_LINK_TYPE, VESTIGE_STATUS } from '../consts';
import { getAllShopList } from './shopService'; import { getAllShopList } from './shopService';
import { getGeneralRank, getRankFirstReward } from './rankService'; import { getGeneralRank, getRankFirstReward } from './rankService';
import { getFriendList, getApplyList } from './friendService'; import { getFriendList, getApplyList } from './friendService';
@@ -17,7 +17,7 @@ import { getExpeditionStatus } from './expeditionService';
import { getTowerStatus, getHungupRewards, getTasks } from './battleService'; import { getTowerStatus, getHungupRewards, getTasks } from './battleService';
import { getAllAssistCnt, getCapExtraCnt, getComBtlLvByPlayerLv } from './battle/comBattleService'; import { getAllAssistCnt, getCapExtraCnt, getComBtlLvByPlayerLv } from './battle/comBattleService';
import { getDungeonData } from './dungeonService'; import { getDungeonData } from './dungeonService';
import { nowSeconds, getZeroPoint } from '../pubUtils/timeUtil'; import { nowSeconds, getZeroPoint, getTimeFunM } from '../pubUtils/timeUtil';
import { getGachaList, getVisitedHeroList } from './activity/gachaService'; import { getGachaList, getVisitedHeroList } from './activity/gachaService';
import { getSchoolList } from './roleService'; import { getSchoolList } from './roleService';
import { addRoleToGuildChannel } from './chatChannelService'; import { addRoleToGuildChannel } from './chatChannelService';
@@ -55,6 +55,10 @@ import { getHiddenData } from './memoryCache/hiddenData';
import { AuthorBookModel } from '../db/AuthorBook'; import { AuthorBookModel } from '../db/AuthorBook';
import { gameData } from '../pubUtils/data'; import { gameData } from '../pubUtils/data';
import { getRougeData } from './battle/rougeService'; import { getRougeData } from './battle/rougeService';
import { LadderMatchRecModel } from '../db/LadderMatchRec';
import { GVGVestigeRecModel, GVGVestigeRecUpdate } from '../db/GVGVestigeRec';
import { getVestigeRecStatus } from './gvg/gvgFightService';
import { getRemoteRplPrefix } from '../pubUtils/battleUtils';
/** /**
* init: 初始的时候是否推送 true-推 false-不推 * init: 初始的时候是否推送 true-推 false-不推
@@ -91,6 +95,8 @@ const modules = [
{ id: 27, type: 'ladder', init: false, refresh: true, guild: false }, { id: 27, type: 'ladder', init: false, refresh: true, guild: false },
{ id: 28, type: 'hiddenData', init: true, refresh: true, guild: false }, { id: 28, type: 'hiddenData', init: true, refresh: true, guild: false },
{ id: 29, type: 'rouge', init: true, refresh: true, guild: false }, { id: 29, type: 'rouge', init: true, refresh: true, guild: false },
{ id: 30, type: 'iconShow', init: true, refresh: true, guild: false },
] ]
export async function pushData(hasInit: boolean, role: RoleType, session: FrontendOrBackendSession, pushType: 'entry' | 'refresh' = 'entry') { export async function pushData(hasInit: boolean, role: RoleType, session: FrontendOrBackendSession, pushType: 'entry' | 'refresh' = 'entry') {
@@ -233,6 +239,8 @@ export async function getModuleData(type: string, data: { role: RoleType, sessio
return getHiddenData(); return getHiddenData();
case 'rouge': case 'rouge':
return await getRougeData(role.roleId); return await getRougeData(role.roleId);
case 'iconShow':
return await getIconShow(role.roleId, session);
default: default:
return null; return null;
} }
@@ -449,3 +457,26 @@ async function getAuthorBook(roleId: string) {
} }
return result return result
} }
async function getIconShow(roleId: string, session:FrontendOrBackendSession) {
let quitTime = session.get('quitTime');
if (!roleId) return;
let ladderIconShow = await LadderMatchRecModel.findRecByRoleId(roleId, quitTime);
let list = await GVGVestigeRecModel.findRecCurDay(roleId, Math.max(quitTime, getZeroPoint()*1000));
let result: (GVGVestigeRecUpdate & { rplFileUrl: string })[] = [];
for (let rec of list) {
const { attackRoleId, battleCode, hasRpl, remoteUrl } = rec;
const rplFileUrl = battleCode && hasRpl ? remoteUrl : '';
const obj = getVestigeRecStatus(rec);
if (obj.status == VESTIGE_STATUS.COMPLETE && result.length < 10) result.push({ ...rec, endTime: obj.time, rplFileUrl });
}
let gvgFightRecs = { list: result, rplPrefixUrl: getRemoteRplPrefix(pinus.app.get('env')) };
return { ladderIconShow, gvgFightRecs }
}
export async function pushIconShow(roleId: string, ladderIconShow?: boolean, gvgFightRecs?) {
if (!roleId) return;
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.LADDER_OR_GVG_ICON_SHOW, { ladderIconShow, gvgFightRecs });
}
@@ -10,7 +10,7 @@ import { GVGVestigeModel } from "../../db/GVGVestige";
import { GVGVestigeLeagueRankModel, GVGVestigeLeagueRankType } from "../../db/GVGVestigeLeagueRank"; import { GVGVestigeLeagueRankModel, GVGVestigeLeagueRankType } from "../../db/GVGVestigeLeagueRank";
import { GVGVestigeLockModel } from "../../db/GVGVestigeLock"; import { GVGVestigeLockModel } from "../../db/GVGVestigeLock";
import { GVGVestigeRankModel, GVGVestigeRankType, GVGVestigeRankUpdate } from "../../db/GVGVestigeRank"; import { GVGVestigeRankModel, GVGVestigeRankType, GVGVestigeRankUpdate } from "../../db/GVGVestigeRank";
import { GVGVestigeRecType } from "../../db/GVGVestigeRec"; import { GVGVestigeRecModel, GVGVestigeRecType, GVGVestigeRecUpdate } from "../../db/GVGVestigeRec";
import { GVGVestigeSumRankModel, GVGVestigeSumRankType } from "../../db/GVGVestigeSumRank"; import { GVGVestigeSumRankModel, GVGVestigeSumRankType } from "../../db/GVGVestigeSumRank";
import { HeroModel, HeroType } from "../../db/Hero"; import { HeroModel, HeroType } from "../../db/Hero";
import { RoleModel } from "../../db/Role"; import { RoleModel } from "../../db/Role";
@@ -34,6 +34,9 @@ import { calFighterContribute } from "./gvgPrepareService";
import { addVestigeLeagueRankRec, addVestigeRankMessage } from "./gvgRecService"; import { addVestigeLeagueRankRec, addVestigeRankMessage } from "./gvgRecService";
import { getGroupKey, getGVGServerType, getPeriodByTime } from "./gvgService"; import { getGroupKey, getGVGServerType, getPeriodByTime } from "./gvgService";
import { Combo } from "../../domain/battleField/pvp"; import { Combo } from "../../domain/battleField/pvp";
import { getRemoteRplPrefix } from "../../pubUtils/battleUtils";
import { pinus } from "pinus";
import { pushIconShow } from "../connectorService";
let gvgFightTime = undefined; let gvgFightTime = undefined;
@@ -531,3 +534,15 @@ export function calVestigeLeagueBoxRewards(canReceiveRanks: { rank: number }[],
leagueReward, rewards, boxPreview, canReceiveBox: canReceiveRanks.length > 0 || canReceivePlayerRanks.length > 0 leagueReward, rewards, boxPreview, canReceiveBox: canReceiveRanks.length > 0 || canReceivePlayerRanks.length > 0
} }
} }
export async function pushGvgFightIconShow(roleId: string, battleCode: string) {
const rec = await GVGVestigeRecModel.findByBattleCode(battleCode);
let result: (GVGVestigeRecUpdate & { rplFileUrl: string })[] = [];
const { attackRoleId, hasRpl, remoteUrl } = rec;
const rplFileUrl = battleCode && hasRpl ? remoteUrl : '';
const obj = getVestigeRecStatus(rec);
if (obj.status == VESTIGE_STATUS.COMPLETE) result.push({ ...rec, endTime: obj.time, rplFileUrl });
let gvgFightRecs = { list: result, rplPrefixUrl: getRemoteRplPrefix(pinus.app.get('env')) };
await pushIconShow(roleId, false, gvgFightRecs)
}
@@ -10,6 +10,7 @@ import { gameData, getDicLadderMatchByMyRank, getLadderRankReward } from "../pub
import { EXTERIOR, LADDER } from "../pubUtils/dicParam"; import { EXTERIOR, LADDER } from "../pubUtils/dicParam";
import { ItemInter, RewardInter } from "../pubUtils/interface"; import { ItemInter, RewardInter } from "../pubUtils/interface";
import { getRandValueByMinMax, shouldRefresh } from "../pubUtils/util"; import { getRandValueByMinMax, shouldRefresh } from "../pubUtils/util";
import { pushIconShow } from "./connectorService";
import { sendMailByContent } from "./mailService"; import { sendMailByContent } from "./mailService";
import { getHeroesAttributes } from "./playerCeService"; import { getHeroesAttributes } from "./playerCeService";
import { sendMessageToUserWithSuc } from "./pushService"; import { sendMessageToUserWithSuc } from "./pushService";
@@ -440,3 +441,10 @@ export async function getLadderOppDetailData(rec: LadderMatchRecType) {
} }
return result; return result;
} }
export async function pushLadderIconShow(roleId: string, ladderIconShow:boolean) {
console.log('-x-11111x--x-x-x-x-x-xx- roleId', roleId)
console.log('-x-x--x11111-x-x-x-x-xx- ladderIconShow', ladderIconShow)
if (!roleId) return;
await pushIconShow(roleId, ladderIconShow);
}
+1 -1
View File
@@ -214,5 +214,5 @@ export const PUSH_ROUTE = {
GVG_REC_ADD: 'onGVGRecAdd', // 动态更新 GVG_REC_ADD: 'onGVGRecAdd', // 动态更新
ROUGE_COLLECT_UPDATE: 'onRougeCollectUpdate', // 更新图鉴 ROUGE_COLLECT_UPDATE: 'onRougeCollectUpdate', // 更新图鉴
ROUGE_CHALLENGE_UPDATE: 'onRougeChallengeUpdate', //更新学宫挑战进度 ROUGE_CHALLENGE_UPDATE: 'onRougeChallengeUpdate', //更新学宫挑战进度
LADDER_OR_GVG_ICON_SHOW: 'onLadderOrGvgIconShow', //名将擂台icon提示
} }
+17
View File
@@ -127,6 +127,23 @@ export default class GVGVestigeRec extends BaseModel {
}).select({ battleCode: 1, attackRoleId: 1, defenseRoleId: 1, _id: 0, endTime: 1, attackInfo: 1, defenseInfo: 1, hasRpl: 1, remoteUrl: 1 }).limit(1000).lean(); }).select({ battleCode: 1, attackRoleId: 1, defenseRoleId: 1, _id: 0, endTime: 1, attackInfo: 1, defenseInfo: 1, hasRpl: 1, remoteUrl: 1 }).limit(1000).lean();
return recs; return recs;
} }
public static async findRecCurDay(roleId: string, startMs:number) {
const pipeline = [
{ $match: {endTime: { $gt: startMs }, $or: [{ attackRoleId: roleId }, { defenseRoleId: roleId }]} },
{ $sort: { endTime: -1 } },
// { $limit: 1000 },
];
let result:GVGVestigeRecType[] = []
const recs: GVGVestigeRecType[] = await GVGVestigeRecModel.aggregate(pipeline);
if (recs.length > 0) {
for(const obj of recs){
if(obj.defenseRoleId == roleId && (!obj.defenseInfo.isSuccess)) result.push(obj);
}
}
return result;
}
} }
export const GVGVestigeRecModel = getModelForClass(GVGVestigeRec); export const GVGVestigeRecModel = getModelForClass(GVGVestigeRec);
+25
View File
@@ -122,6 +122,31 @@ export default class LadderMatchRec extends BaseModel {
return recs; return recs;
} }
/**
* 查找包含roleId最新一条记录
* @param roleId
* @returns true--表示查到最新一条roleId作为守方失败
*/
// public static async findOneRecByRoleId(roleId: string) {
// let recs: LadderMatchRecType = await LadderMatchRecModel.findOne({ $or: [{ roleId1: roleId }, { roleId2: roleId }], status: LADDER_STATUS.COMPLETE }).sort({ endTime: -1 }).limit(1).lean();
// if (recs && recs.roleId2 == roleId && (!recs.defenseInfo.isSuccess)) return true;
// return false;
// }
public static async findRecByRoleId(roleId: string, quitTime: number) {
const pipeline = [
{ $match: { endTime: { $gt: quitTime }, $or: [{ roleId1: roleId }, { roleId2: roleId }], status: LADDER_STATUS.COMPLETE } },
{ $sort: { endTime: -1 } },
// { $limit: 1 },
{ $project: { _id: 0, roleId2: 1, "defenseInfo.isSuccess": 1 } }
];
const recs: LadderMatchRecType[] = await LadderMatchRecModel.aggregate(pipeline);
for (let obj of recs) {
if (obj.roleId2 === roleId && !obj.defenseInfo.isSuccess) return true;
}
return false;
}
public static async checkByRank(serverId: number, roleId2: string) { public static async checkByRank(serverId: number, roleId2: string) {
const result = await LadderMatchRecModel.exists({ serverId, roleId2, status: { $in: [LADDER_STATUS.BATTLE, LADDER_STATUS.CHECK] } }); const result = await LadderMatchRecModel.exists({ serverId, roleId2, status: { $in: [LADDER_STATUS.BATTLE, LADDER_STATUS.CHECK] } });
return result; return result;