寻宝:信息边窗

This commit is contained in:
luying
2022-07-07 13:27:43 +08:00
parent b1dc091453
commit 460d0d6955
15 changed files with 153 additions and 38 deletions
+14 -10
View File
@@ -13,7 +13,9 @@ import { getRoleOnlineInfo } from './redisService';
import { ChatInfoModel } from '../db/ChatInfo';
import { AccuseRecModel, AccueseParam } from '../db/AccuseRec';
import { getSimpleRoleInfo, getSimpleRoleInfos } from './roleService';
import { sendMessageToCityWithSuc, sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToTeam, sendMessageToUserWithSuc } from './pushService';
import { sendMessageToAllWithSuc, sendMessageToCityWithSuc, sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToTeam, sendMessageToUserWithSuc } from './pushService';
import { comBtlLvInvalid } from './comBattleService';
import { gameData } from '../pubUtils/data';
export * from './chatChannelService';
export * from './sysChatService';
@@ -163,6 +165,12 @@ export async function pushGroupMsgToRoom(msg: GroupMessageType) {
}
}
export async function pushGroupMsgToAll(msg: GroupMessageType, filterCb?: ({ lv, topLineupCe }) => boolean) {
if (!msg) return;
const roleInfo = await getSimpleRoleInfo(msg.roleId);
await sendMessageToAllWithSuc(PUSH_ROUTE.GROUP_MSG, { ...msg, roleInfo }, filterCb);
}
/**
* @description 获取私聊历史消息
* @export
@@ -369,16 +377,12 @@ export async function delPrivateMsg(roleId: string, targetRoleId: string) {
* @description 发送组队一键邀请消息
* @param {string} teamCode 队伍唯一标识
*/
export async function pushTeamInviteMsg(roleId: string, roleName: string, serverId: number, guildCode: string, teamCode: string, blueprtId: number) {
export async function pushTeamInviteMsg(roleId: string, roleName: string, serverId: number, teamCode: string, blueprtId: number, blueprtLv: number, ceLimit: number) {
let msgDataWorld = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.WORLD, `${serverId}`, MSG_TYPE.RICH_TEXT, MSG_SOURCE.TEAM_INVITE, JSON.stringify({ roleName, teamCode, blueprtId }), null, null);
await pushGroupMsgToRoom(msgDataWorld);
let msgDataGuild: GroupMessageType;
if(guildCode) {
msgDataGuild = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.GUILD, `${guildCode}`, MSG_TYPE.RICH_TEXT, MSG_SOURCE.TEAM_INVITE, JSON.stringify({ roleName, teamCode, blueprtId }), null, null);
await pushGroupMsgToRoom(msgDataGuild);
}
return { msgDataWorld, msgDataGuild };
await pushGroupMsgToAll(msgDataWorld, (data: {lv: number, topLineupCe: number}) => {
return data.topLineupCe >= ceLimit && !comBtlLvInvalid(data.lv, [blueprtLv]);
});
return { msgDataWorld };
}
/**
@@ -335,6 +335,16 @@ export function comBtlLvInvalid(playerLv: number, blueprtLvs: number[]) {
return false
}
export function getComBtlLvByPlayerLv(playerLv: number) {
let lvs: number[] = [];
for(let [lv, {min, max}] of gameData.comBtlLvRange) {
if(playerLv >= min && playerLv <= max) lvs.push(lv);
}
let minLv = Math.min(...lvs);
let maxLv = Math.max(...lvs);
return { minLv, maxLv }
}
export async function dismissTeam(teamStatus: MemComBtlTeam, teamMap: Map<string, MemComBtlTeam>, roleId: string, teamDisTimer: Map<string, NodeJS.Timer>) {
const { teamCode } = teamStatus;
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
+13 -4
View File
@@ -15,7 +15,7 @@ import { getFriendList, getApplyList } from './friendService';
import { getDailyBattleList } from './dailyBattleService';
import { getExpeditionStatus } from './expeditionService';
import { getTowerStatus, getHungupRewards, getTasks } from './battleService';
import { getAllAssistCnt } from './comBattleService';
import { getAllAssistCnt, getComBtlLvByPlayerLv } from './comBattleService';
import { getDungeonData } from './dungeonService';
import { PvpSeasonResultModel } from '../db/PvpSeasonResult';
import { nowSeconds, getZeroPoint } from '../pubUtils/timeUtil';
@@ -44,6 +44,7 @@ import { HeroParam } from '../domain/roleField/hero';
import { pick } from 'underscore';
import { sendMessageToAllWithSuc, sendMessageToServerWithSuc, sendMessageToUser, sendMessageToUserWithSuc } from './pushService';
import { getSurvey } from './gmService';
import { ComBattleTeamModel } from '../db/ComBattleTeam';
/**
* init: 初始的时候是否推送 true-推 false-不推
@@ -146,9 +147,7 @@ export async function getModuleData(type: string, data: { role: RoleType, sessio
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 }
return await getComBattleEntryData(role);
case 'dungeon': // 秘境
return await getDungeonData(role);
case 'pvp': // pvp
@@ -289,6 +288,16 @@ async function getGuildEntryData(role: RoleType, sid: string, session: FrontendO
return { hasGuild: false }
}
async function getComBattleEntryData(role: RoleType) {
let { roleId, lv, topLineupCe } = role;
const assistCnt = await getAllAssistCnt(roleId);
const blueprts = await Item.findByRoleAndType(roleId, CONSUME_TYPE.BLUEPRT);
let { minLv, maxLv } = getComBtlLvByPlayerLv(lv);
let refreshTime = nowSeconds() - 60;
const invitations = await ComBattleTeamModel.findInvitations(roleId, minLv, maxLv, topLineupCe, refreshTime, 1);
return { assistCnt, blueprts, hasInvitation: invitations.length > 0, invitationTime: invitations.length > 0?invitations[0].inviteTime: 0 }
}
export async function pushRefreshTime() {
let todayZeroPoint = getZeroPoint();
await sendMessageToAllWithSuc(PUSH_ROUTE.REFRESH_TIME, { todayZeroPoint });
@@ -2,7 +2,7 @@
import { HeroModel, HeroType } from '../db/Hero';
import Role, { RoleModel, RoleType } from '../db/Role'
import { getLvByExp, getExpByLv, gameData, getDicApByLv } from '../pubUtils/data';
import { updateUserInfo } from './redisService';
import { updateRoleOnlineInfo, updateUserInfo } from './redisService';
// import { switchOnFunc } from './funcSwitchService';
import { FUNC_OPT_TYPE, TASK_TYPE, WAR_TYPE, STATUS, KING_EXP_RATIO_TYPE, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, HERO_SYSTEM_TYPE, PUSH_ROUTE } from '../consts';
import { BackendSession, pinus } from 'pinus';
@@ -49,6 +49,8 @@ export async function roleLevelup(type: KING_EXP_RATIO_TYPE, roleId: string, kin
await checkPopUpCondition(serverId, roleId, POP_UP_SHOP_CONDITION_TYPE.LV_TO, { oldLv: lv, newLv })
// await calculateCeWithRole(HERO_SYSTEM_TYPE.ROLE_LV, roleId, serverId, sid, { lv: newLv });
await updateRoleOnlineInfo(roleId, { lv: newLv });
}
let actordata: { lv: number, exp: number, getExp: number, mostExp: number }[] = [];
for (let i = lv; i <= newLv; i++) {
+4 -3
View File
@@ -7,7 +7,7 @@ import { EPlace, HeroModel, HeroType, HeroUpdate } from '../db/Hero';
import { RoleUpdate, RoleType, RoleModel } from '../db/Role';
import { Rank } from './rankService';
import { HERO_SYSTEM_TYPE, PUSH_ROUTE, REDIS_KEY } from '../consts';
import { updateUserInfo } from './redisService';
import { updateRoleOnlineInfo, updateUserInfo } from './redisService';
import { GuildModel, GuildType } from '../db/Guild';
import { CalCe } from './role/calCe';
import { RoleCeModel, RoleCeUpdate } from '../db/RoleCe';
@@ -359,11 +359,12 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve
}
}
let { topLineup, topLineupCe } = calCe.getTopLineup();
let { topLineup, topLineupCe, hasTopCeChange } = calCe.getTopLineup();
let roleCeUpdate: RoleCeUpdate = calCe.getRoleCeTable();
if(topLineupCe > roleCe?.historyLineupCe??0) {
roleCeUpdate = { ...roleCeUpdate, historyLineupCe: topLineupCe };
}
roleCe = await RoleCeModel.updateRoleCe(roleId, roleCeUpdate);
let role = await RoleModel.incRoleInfo(roleId, { ...roleIncUpdate, ce: roleInc }, { ...roleUpdate, topLineup, topLineupCe });
let guild = await GuildModel.updateCe(roleId, roleInc); // 公会更新战力
@@ -371,7 +372,7 @@ export async function calculateCes(type: HERO_SYSTEM_TYPE, roleId: string, serve
saveCeChangeLog(role, roleInc, role.ce, type, changeHids);
updateRank(roleId, serverId, topLineupCe, role, pushHeros, guild);
sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PLAYER_CE_UPDATE, { ce: role.ce, heros: pushHeros, topLineupCe }, sid);
if(hasTopCeChange) await updateRoleOnlineInfo(roleId, { topLineupCe });
if(guild) {
await updateUserInfo(REDIS_KEY.GUILD_INFO, guild.code, [{ field: 'guildCe', value: guild.guildCe }]);
}
+6 -3
View File
@@ -5,12 +5,15 @@ import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId
import { getAllOnlineRoles, getRoleOnlineInfo } from "./redisService";
import { errlogger, infologger } from '../util/logger';
export async function sendMessageToAllWithSuc(route: string, data: any) {
await sendMessageToAll(route, resResult(STATUS.SUCCESS, data));
export async function sendMessageToAllWithSuc(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) {
await sendMessageToAll(route, resResult(STATUS.SUCCESS, data), filterCb);
}
export async function sendMessageToAll(route: string, data: any) {
export async function sendMessageToAll(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) {
let allOnlineUsers = await getAllOnlineRoles();
if(filterCb) {
allOnlineUsers = allOnlineUsers.filter(filterCb);
}
let n = Math.ceil(allOnlineUsers.length / PUSH_BATCH); // 一共多少批
let sendToUser = (i: number) => {
let users = allOnlineUsers.slice(i * PUSH_BATCH, (i + 1) * PUSH_BATCH - 1);
+17 -8
View File
@@ -310,10 +310,17 @@ export async function clearChannelServers() {
* @param userCode user表唯一字符串标识
* @param sid connector服的那个sid
*/
export async function roleLogin(roleId: string, userCode: string, sid: string, pkgName: string, createTime: number, serverId: number) {
export async function roleLogin(roleId: string, userCode: string, sid: string, createTime: number, serverId: number, lv: number, topLineupCe: number) {
await redisClient().hincrbyAsync(REDIS_KEY.ONLINE_CNT, roleId, 1);
await redisClient().hsetAsync(REDIS_KEY.USER_CODE, userCode, roleId);
return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${userCode}|${sid}|${pkgName}|${createTime}|${serverId}`);
return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${userCode}|${sid}|${createTime}|${serverId}|${lv}|${topLineupCe}`);
}
export async function updateRoleOnlineInfo(roleId: string, updateData: {lv?: number, topLineupCe?: number}) {
let info = await getRoleOnlineInfo(roleId);
if(info.isOnline) {
return await redisClient().hsetAsync(REDIS_KEY.ONLINE_USERS, roleId, `${info.userCode}|${info.sid}|${info.createtime}|${info.serverId}|${updateData?.lv??info.lv}|${updateData?.topLineupCe??info.topLineupCe}`);
}
}
/**
@@ -354,11 +361,13 @@ export async function getRoleOnlineInfo(roleId: string) {
if(str) {
try {
let result = str.split('|');
let [userCode, sid, pkgName, createTime, serverId] = result;
let [userCode, sid, createTime, serverId, lv, topLineupCe] = result;
return {
isOnline: true, userCode, sid, pkgName,
isOnline: true, userCode, sid,
createtime: parseInt(createTime),
serverId: parseInt(serverId)
serverId: parseInt(serverId),
lv: parseInt(lv),
topLineupCe: parseInt(topLineupCe)
}
} catch(e) {
return { isOnline: false }
@@ -385,13 +394,13 @@ export async function getRoleCreateTime(roleId: string, role?: RoleType) {
*/
export async function getAllOnlineRoles() {
let allRoles = await redisClient().hgetallAsync(REDIS_KEY.ONLINE_USERS);
let result = new Array<{roleId: string, userCode: string, sid: string, pkgName: string, serverId: number}>();
let result = new Array<{roleId: string, userCode: string, sid: string, serverId: number, lv: number, topLineupCe: number}>();
for(let roleId in allRoles) {
try{
let param = allRoles[roleId].split('|');
let [userCode, sid, pkgName, _createTime, serverId] = param;
let [userCode, sid, _createTime, serverId, lv, topLineupCe] = param;
result.push({ roleId, userCode, sid, pkgName, serverId: parseInt(serverId) });
result.push({ roleId, userCode, sid, serverId: parseInt(serverId), lv: parseInt(lv), topLineupCe: parseInt(topLineupCe) });
} catch(e) {
continue;
+3 -1
View File
@@ -15,6 +15,7 @@ export class CalCe {
resultCes: Map<number, number> = new Map(); // hid => ce
data: CalCeData;
attrsByHid: Map<number, { id: number, val: number, str: string }[]> = new Map();
originTopHeroCe: number;
constructor(roleId: string) {
this.roleId = roleId;
@@ -23,6 +24,7 @@ export class CalCe {
public setRoleCe(roleCe: RoleCeType) {
this.data = new CalCeData(roleCe)
this.originCes = this.calHeroCe();
this.originTopHeroCe = this.getTopLineup().topLineupCe;
}
public clearRoleCe() {
@@ -126,7 +128,7 @@ export class CalCe {
topLineupCe += ce;
}
}
return { topLineup, topLineupCe };
return { topLineup, topLineupCe, hasTopCeChange: topLineupCe == this.originTopHeroCe };
}
// 玩家等级