/** * entry触发后引起的下发 */ import { getMails } from './mailService'; import { recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from './chatService'; import { getCurTask } from './taskService'; import { RoleType } from '../db/Role'; import { FrontendOrBackendSession, pinus } from 'pinus'; import { resResult } from '../pubUtils/util'; import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE } from '../consts'; import { getAllShopList } from './shopService'; import { getGeneralRank } from './rankService'; import { getFriendList, getApplyList } from './friendService'; import { getDailyBattleList } from './dailyBattleService'; import { getExpeditionStatus } from './expeditionService'; import { getTowerStatus, getHungupRewards, getTasks } from './battleService'; import { getAllAssistCnt } from './comBattleService'; import { getDungeonData } from './dungeonService'; import { PvpSeasonResultModel } from '../db/PvpSeasonResult'; import { nowSeconds, getZeroPoint } from '../pubUtils/timeUtil'; import { getGachaList, getVisitedHeroList } from './gachaService'; import { getSchoolList } from './roleService'; import { addRoleToGuildChannel } from './chatChannelService'; import { getMyGuildInfo, getGuildWithRefActive, getUserGuildWithRefActive, getWishPool } from './guildService'; import { getAuction } from './auctionService'; import { getGuildTrainInstance } from './guildTrainService'; import { BossInstanceModel } from '../db/BossInstance'; import { getBossInstanceInfo } from './guildBossService'; import { getEvent } from './eventSercive'; import { getBattleListOfMain } from './normalBattleService'; import { GuildType } from '../db/Guild'; import UserGuild, { UserGuildType } from '../db/UserGuild'; import { setMedianCe, getAllGuildActivityStatus } from './guildActivityService'; import { getAllOnlineRoles } from './redisService'; import Item from '../db/Item'; import { PvpDefenseModel } from '../db/PvpDefense'; import { findPvpDefAllByRoleId } from './pvpService'; export async function pushData(role: RoleType, session: FrontendOrBackendSession, pushType: 'entry'|'refresh' = 'entry') { try{ const { roleId } = role; const sid = session.get('sid'); pushEntryStart(roleId, sid); // 军团 const guildData = await getGuildEntryData(role, sid, session); let modules = ['shop', 'rank', 'mail', 'friend', 'daily', 'expedition', 'tower', 'comBattle', 'dungeon', 'pvp', 'gacha', 'school', 'task', 'chat', 'event', 'battle']; if(guildData.hasGuild) { modules.push('guild', 'auction', 'train', 'boss', 'wishPool', 'guildActivity'); } let notIncludeModule: string[] = []; if(pushType == 'refresh') { notIncludeModule = ['rank', 'mail', 'school', 'auction', 'train', 'chat', 'battle']; } for(let type of modules) { if(notIncludeModule.indexOf(type) == -1) { let data = await getModuleData(type, { role, session }, guildData); if(data) { pushEntryData(type, roleId, sid, data); } } } pushEntryEnd(roleId, sid); }catch(e) { console.error(e.stack); } } async function getModuleData(type: string, data: {role: RoleType, session: FrontendOrBackendSession}, guildData: { hasGuild: boolean, guild?: GuildType, userGuild?: UserGuildType, guildResult?: any} = { hasGuild: false }) { let { role, session } = data; const { roleId, serverId, roleName, guildCode } = role; let { hasGuild, guild, userGuild, guildResult } = guildData; console.log('*********', type) switch(type) { case 'shop': // 商店 return await getAllShopList(roleId); case 'rank': // 排名 return await getGeneralRank(role, serverId); case 'mail': // 邮件 return await getMails(roleId, serverId); case 'friend': // 好友 const friendList = await getFriendList(role); const applyList = await getApplyList(roleId); return { friendList, applyList } case 'daily': // 每日 return await getDailyBattleList(role); case 'expedition': // 远征 return await getExpeditionStatus(roleId, roleName); case 'tower': // 镇念塔 return await getTowerEntryData(role); case 'comBattle': // 寻宝 const assistCnt = await getAllAssistCnt(roleId); const blueprts = await Item.findByRoleAndType(roleId, CONSUME_TYPE.BLUEPRT); return { assistCnt, blueprts } case 'dungeon': // 秘境 return await getDungeonData(role); case 'pvp': // pvp return await getPvpEntryData(roleId); case 'gacha': const gachalist = await getGachaList(roleId); const visitList = await getVisitedHeroList(roleId); return { gachalist, visitList } case 'school': return await getSchoolList(roleId); case 'guild': return hasGuild? await guildResult: null; case 'auction': return hasGuild? await getAuction(guildCode, session): null; case 'train': return hasGuild? await getGuildTrainInstance(roleId, guild, userGuild): null; case 'boss': if(hasGuild) { const bossInstance = await BossInstanceModel.findBossInstance(guild.code); if(bossInstance) { return await getBossInstanceInfo(bossInstance, roleId); } } return null; case 'wishPool': return hasGuild? await getWishPool(userGuild): null; case 'task': return await getCurTask(role.roleId, session); case 'chat': const worldMsgs = await recentWorldMsgs(serverId); const sysMsgs = await recentSysMsgs(serverId); const guildMsgs = await recentGuildMsgs(guildCode); const recentPrivateChats = await recentPrivateChatInfos(roleId, roleName); return { worldMsgs, sysMsgs, guildMsgs, recentPrivateChats }; case 'event': return await getEvent(role.eventStatus, roleId, roleName); case 'battle': return await getBattleListOfMain(role); case 'guildActivity': return getAllGuildActivityStatus(); default: return null; } } function pushEntryData(type: string, roleId: string, sid: string, param: T) { let uids = [{ uid: roleId, sid }]; let data = { type }; data[type] = param; pinus.app.channelService.pushMessageByUids('onEntryData', resResult(STATUS.SUCCESS, data), uids);//通知在线玩家练兵场重置, } function pushEntryStart(roleId: string, sid: string) { let uids = [{ uid: roleId, sid }]; pinus.app.channelService.pushMessageByUids('onEntryDataStart', resResult(STATUS.SUCCESS), uids);//通知在线玩家练兵场重置, } function pushEntryEnd(roleId: string, sid: string) { let uids = [{ uid: roleId, sid }]; pinus.app.channelService.pushMessageByUids('onEntryDataEnd', resResult(STATUS.SUCCESS), uids);//通知在线玩家练兵场重置, } /** * 镇念塔初始数据 * @param role */ async function getTowerEntryData(role: RoleType) { const { roleId } = role; const status = await getTowerStatus(role); const hungUp = await getHungupRewards(roleId); const tasks = await getTasks(role); if(hungUp.status == -1) { return { status, hungUp: {}, tasks } } else { return { status, hungUp: hungUp.data, tasks } } } /** * 获取是否存在pvp赛季奖励 * @param roleId */ async function getPvpEntryData(roleId: string) { let pvpDefense = await PvpDefenseModel.findByRoleIdIncludeAll(roleId); if(pvpDefense) { let { pvpDefense, } = await findPvpDefAllByRoleId(roleId); let { challengeCnt, receivedBox, score, hisScore } = pvpDefense; return { challengeCnt, score, hisScore, receivedBox } } else { return null } } /** * 获取军团信息,并加入军团频道 * @param role * @param sid * @param session */ async function getGuildEntryData(role: RoleType, sid: string, session: FrontendOrBackendSession) { if (role.hasGuild) { let userGuild = await getUserGuildWithRefActive(role.roleId, 'job auth guildCode receivedActive activeRecord activeDaily activeWeekly wishDntCnt wishGoods'); if (userGuild) { let guild = await getGuildWithRefActive(userGuild.guildCode, role.serverId); if (guild) { addRoleToGuildChannel(role.roleId, sid, userGuild.guildCode); let result = await getMyGuildInfo(role.roleId, sid, userGuild, guild, role.serverId, session); return { hasGuild: true, guild, userGuild, guildResult: result}; } } } return { hasGuild: false } } export async function everydayRefresh() { let allOnlineUsers = await getAllOnlineRoles(); let todayZeroPoint = getZeroPoint(); let n = Math.ceil(allOnlineUsers.length / PUSH_BATCH); // 一共多少批 console.log(n) let i = -1; let interval = setInterval(() => { if(++i < n) { let users = allOnlineUsers.slice(i * PUSH_BATCH, (i + 1) * PUSH_BATCH - 1); for(let { roleId, sid } of users) { pinus.app.channelService.pushMessageByUids('onRefreshTime', resResult(STATUS.SUCCESS, { todayZeroPoint } ), [{uid: roleId, sid: sid}]); } } else { clearInterval(interval); } }, PUSH_INTERVAL) setMedianCe(); }