From 6cc38053e7713e74e3c0be101bb304d70e06dc0f Mon Sep 17 00:00:00 2001 From: luying Date: Thu, 5 Jan 2023 20:50:41 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(gvg):=20=E7=BB=84=E5=BB=BA?= =?UTF-8?q?=E6=9C=9F=E8=81=8A=E5=A4=A9=E5=92=8C=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app.ts | 4 +- .../app/servers/chat/handler/chatHandler.ts | 5 +- .../app/servers/chat/remote/chatRemote.ts | 9 +++ .../servers/connector/handler/entryHandler.ts | 2 +- .../connector/remote/connectorRemote.ts | 9 +++ .../servers/guild/handler/gvgManageHandler.ts | 58 ++++++++++++++++++- game-server/app/services/chatService.ts | 21 +++++++ game-server/app/services/connectorService.ts | 5 +- game-server/app/services/gvg/gvgService.ts | 8 ++- .../app/services/gvg/gvgTeamService.ts | 2 + game-server/app/services/timeTaskService.ts | 3 +- shared/consts/constModules/chatConst.ts | 4 ++ shared/consts/constModules/gvgConst.ts | 2 + shared/resource/jsons/dic_email_content.json | 25 +++++++- .../resource/jsons/dic_zyz_chat_system.json | 10 ++++ shared/resource/jsons/server_const.json | 2 +- 16 files changed, 156 insertions(+), 13 deletions(-) diff --git a/game-server/app.ts b/game-server/app.ts index 6fed02341..c8e4b72ef 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -193,7 +193,6 @@ async function treatStartLogic(app: _pinus.Application) { if(app.getServerType() == 'guild') { initGuildActivityIndexInPinus() .then(resetJoinWoodenHorse); - setGVGServerGroup(); } if(app.getServerType() == 'battle'|| app.getServerType() == 'role'|| app.getServerType() == 'connector') { timeTaskService.setPvpSeasonNum(); @@ -202,6 +201,9 @@ async function treatStartLogic(app: _pinus.Application) { if(app.getServerType() != 'systimer') { timeTaskService.initHiddenData(); } + if(app.getServerType() == 'battle'|| app.getServerType() == 'chat'|| app.getServerType() == 'connector') { + setGVGServerGroup(); + } if(app.isMaster()) { redisService.initAllRank(); diff --git a/game-server/app/servers/chat/handler/chatHandler.ts b/game-server/app/servers/chat/handler/chatHandler.ts index d3c90eb36..73c41ff0f 100644 --- a/game-server/app/servers/chat/handler/chatHandler.ts +++ b/game-server/app/servers/chat/handler/chatHandler.ts @@ -2,7 +2,7 @@ import { CHANNEL_PREFIX, MSG_SOURCE, getChannelType } from './../../../consts/co import { Application, BackendSession, HandlerService, } from 'pinus'; import { resResult } from '../../../pubUtils/util'; import { DEFAULT_MSG_PER_PAGE, STATUS, TASK_TYPE } from '../../../consts'; -import { createAccuseData, createGroupMsg, createPrivateMsg, getPrivateMessages, pushGroupMsgToRoom, pushMsgToRole, updatePrivateMsgReadInfo, recentPrivateChatInfos, recentWorldMsgs, recentSysMsgs, recentGuildMsgs, updatePrivateMsgIsTop, delPrivateMsg } from '../../../services/chatService'; +import { createAccuseData, createGroupMsg, createPrivateMsg, getPrivateMessages, pushGroupMsgToRoom, pushMsgToRole, updatePrivateMsgReadInfo, recentPrivateChatInfos, recentWorldMsgs, recentSysMsgs, recentGuildMsgs, updatePrivateMsgIsTop, delPrivateMsg, recentServerGroupMsgs } from '../../../services/chatService'; import { getSimpleRoleInfo } from '../../../services/roleService'; import { checkTask } from '../../../services/task/taskService'; import { RoleModel } from '../../../db/Role'; @@ -107,8 +107,9 @@ export class ChatHandler { const worldMsgs = await recentWorldMsgs(serverId); const sysMsgs = await recentSysMsgs(serverId); const guildMsgs = await recentGuildMsgs(guildCode); + const gvgMsgs = await recentServerGroupMsgs(serverId); - return resResult(STATUS.SUCCESS, { worldMsgs, sysMsgs, guildMsgs }) + return resResult(STATUS.SUCCESS, { worldMsgs, sysMsgs, guildMsgs, gvgMsgs }) } /** diff --git a/game-server/app/servers/chat/remote/chatRemote.ts b/game-server/app/servers/chat/remote/chatRemote.ts index f3eea73f3..217138120 100644 --- a/game-server/app/servers/chat/remote/chatRemote.ts +++ b/game-server/app/servers/chat/remote/chatRemote.ts @@ -6,6 +6,7 @@ import { errlogger } from '../../../util/logger'; import { addUserToChannel, sendMessageToChannel, sendMessgeToChannelByBatch, setKvToMemory } from '../../../services/pushService'; import { setApiIsClose } from '../../../services/chatService'; import { setHiddenData } from '../../../services/dataService'; +import { setGVGServerGroup } from '../../../services/gvg/gvgService'; export default function (app: Application) { new HandlerService(app, {}); @@ -173,4 +174,12 @@ export class ChatRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setGVGServerGroup() { + try { + return setGVGServerGroup(); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index 2449e5d45..54569e624 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -11,7 +11,7 @@ import { COM_BTL_QUALITY, HERO_SELECT, DEBUG_MAGIC_WORD, REDIS_KEY, TASK_TYPE, E import { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil'; import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin, getOnlineRoleByUserCode } from '../../../services/redisService'; -import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGroupShopChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService'; +import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGroupShopChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel } from '../../../services/chatService'; import { reportOneOnline, savePlayTime } from '../../../services/authenticateService'; import { checkTaskInEntry, } from '../../../services/task/taskService'; import { pushData, kickUser, getModuleData, assignServer, leaveServer } from '../../../services/connectorService'; diff --git a/game-server/app/servers/connector/remote/connectorRemote.ts b/game-server/app/servers/connector/remote/connectorRemote.ts index 4de30a9bd..c4de76f0e 100644 --- a/game-server/app/servers/connector/remote/connectorRemote.ts +++ b/game-server/app/servers/connector/remote/connectorRemote.ts @@ -13,6 +13,7 @@ import { setApiIsClose } from '../../../services/chatService'; import { setPvpSeasonNum, setPvpSettleSeasonNum } from '../../../services/timeTaskService'; import { setHiddenData } from '../../../services/dataService'; import { setKvToMemory } from '../../../services/pushService'; +import { setGVGServerGroup } from '../../../services/gvg/gvgService'; export default function (app: Application) { new HandlerService(app, {}); @@ -202,4 +203,12 @@ export class ConnectorRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async setGVGServerGroup() { + try { + return setGVGServerGroup(); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/servers/guild/handler/gvgManageHandler.ts b/game-server/app/servers/guild/handler/gvgManageHandler.ts index 914ba2296..44dadbc1e 100644 --- a/game-server/app/servers/guild/handler/gvgManageHandler.ts +++ b/game-server/app/servers/guild/handler/gvgManageHandler.ts @@ -1,11 +1,11 @@ import { Application, BackendSession, ChannelService, HandlerService } from "pinus"; -import { GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, PUSH_ROUTE, STATUS } from "../../../consts"; +import { CHANNEL_PREFIX, GUILD_AUTH, GVG_APPLY_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_AUTH, LEAGUE_MANAGE_TYPE, MAIL_TYPE, MSG_SOURCE, MSG_TYPE, PUSH_ROUTE, STATUS } from "../../../consts"; import { resResult } from "../../../pubUtils/util"; import { GuildModel, GuildType } from "../../../db/Guild"; import { UserGuildModel } from "../../../db/UserGuild"; import { GVGLeagueModel, GVGLeagueType } from "../../../db/GVGLeague"; import { GVGLeagueApplyModel } from "../../../db/GVGLeagueApply"; -import { getGVGPeriodData, getGVGServerType, getServersOfSameGroup } from "../../../services/gvg/gvgService"; +import { getGroupIdOfServer, getGVGPeriodData, getGVGServerType, getServersOfSameGroup } from "../../../services/gvg/gvgService"; import { checkCanManage, checkGuildLeader, checkLeagueAuth, createLeague, getLeagueApplyData, getLeagueInviteData, getMyAuth, joinGuildToLeague } from "../../../services/gvg/gvgTeamService"; import { LeagueGuildInfo, LeagueListInfo, LeagueMemberListInfo, LeagueSimpleInfo } from "../../../domain/gvgField/returnData"; import { getAllServerName, getServerName } from "../../../services/redisService"; @@ -14,6 +14,8 @@ import { RoleModel } from "../../../db/Role"; import { GVGUserDataModel } from "../../../db/GVGUserData"; import { sendMessageToGuildWithSuc, sendMessageToUserWithSuc } from "../../../services/pushService"; import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare"; +import { createGroupMsg, pushGroupMsgToRoom } from "../../../services/chatService"; +import { sendMailToGuildByContent } from "../../../services/mailService"; export default function (app: Application) { new HandlerService(app, {}); @@ -571,4 +573,56 @@ export class GVGManageHandler { icon: myLeague.icon, }); } + + // 团长发送消息给军团内所有成员的邮箱 + async sendMail(msg: { content: string }, session: BackendSession) { + + const roleId = session.get('roleId'); + const roleName = session.get('roleName'); + const guildCode = session.get('guildCode'); + const { content } = msg; + // 权限 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.SEND_MAIL); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + + const { guildCodes } = myLeague; + //下发邮件 + for(let guildCode of guildCodes) { + await sendMailToGuildByContent(MAIL_TYPE.GUILD_MAIL, guildCode, { sendName: `${roleName}`, params: [content] }); + } + + return resResult(STATUS.SUCCESS, { isSuccess: true }); + } + + // 团长发送世界频道 + async recruit(msg: { content: string }, session: BackendSession) { + + const roleId = session.get('roleId'); + const roleName = session.get('roleName'); + const serverId = session.get('serverId'); + const guildCode = session.get('guildCode'); + + const { content } = msg; + // 检查时间 + const checkResult = await checkCanManage(serverId); + if(checkResult.code != 0) return checkResult; + + // 权限 + let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); + if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.RERUIT); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + // 发送战区频道消息 + const groupId = await getGroupIdOfServer(serverId); + let channelId = `${groupId}`; + const msgData = await createGroupMsg(roleId, roleName, CHANNEL_PREFIX.GVG, channelId, MSG_TYPE.RICH_TEXT, MSG_SOURCE.GVG_RECURIT, JSON.stringify({ leagueCode: myLeague.leagueCode, name: myLeague.name, info: content }), '', ''); + if (!msgData) return resResult(STATUS.WRONG_PARMS); + await pushGroupMsgToRoom(msgData); + + return resResult(STATUS.SUCCESS, { isSuccess: true }); + } } \ No newline at end of file diff --git a/game-server/app/services/chatService.ts b/game-server/app/services/chatService.ts index 0052613fc..53beb2ef9 100644 --- a/game-server/app/services/chatService.ts +++ b/game-server/app/services/chatService.ts @@ -17,6 +17,7 @@ import { sendMessageToAllWithSuc, sendMessageToCityWithSuc, sendMessageToGuildWi import { comBtlLvInvalid } from './comBattleService'; import { gameData } from '../pubUtils/data'; import { RegionModel } from '../db/Region'; +import { getGroupIdOfServer, getServersByGroupId } from './gvg/gvgService'; export * from './chatChannelService'; export * from './sysChatService'; @@ -163,6 +164,12 @@ export async function pushGroupMsgToRoom(msg: GroupMessageType) { } else if (msg.channel == CHANNEL_PREFIX.CITY) { let arr = msg.channelId.split('_'); await sendMessageToCityWithSuc(parseInt(arr[0]), parseInt(arr[1]), PUSH_ROUTE.GROUP_MSG, { ...msg, roleInfo }); + } else if (msg.channel == CHANNEL_PREFIX.GVG) { + let groupId = parseInt(msg.channelId); + let serverIds = await getServersByGroupId(groupId); + for(let serverId of serverIds) { + await sendMessageToServerWithSuc(serverId, PUSH_ROUTE.GROUP_MSG, { ...msg, roleInfo }); + } } } @@ -215,6 +222,20 @@ async function recentGroupMsgs(roomId: string, count?: number) { return result.filter(cur => cur) || []; } +/** + * @description 获取最近的战区聊天消息 + * @export + * @param {number} serverId 用区服编号做房间标识 + * @param {number} [count] + * @returns + */ +export async function recentServerGroupMsgs(serverId: number, count?: number) { + let groupId = await getGroupIdOfServer(serverId); + console.log('####', groupId); + const result = await recentGroupMsgs(groupRoomId(CHANNEL_PREFIX.GVG, groupId), count); + return result; +} + /** * @description 获取最近的世界聊天消息 * @export diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index 5d2a6521b..0c449ef88 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -2,7 +2,7 @@ * entry触发后引起的下发 */ import { getMails } from './mailService'; -import { recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from './chatService'; +import { recentGuildMsgs, recentPrivateChatInfos, recentServerGroupMsgs, recentSysMsgs, recentWorldMsgs } from './chatService'; import { getCurTask, getPvpTask } from './task/taskService'; import { RoleType } from '../db/Role'; @@ -203,8 +203,9 @@ export async function getModuleData(type: string, data: { role: RoleType, sessio const worldMsgs = await recentWorldMsgs(serverId); const sysMsgs = await recentSysMsgs(serverId); const guildMsgs = await recentGuildMsgs(guildCode); + const gvgMsgs = await recentServerGroupMsgs(serverId); const recentPrivateChats = await recentPrivateChatInfos(roleId, roleName); - return { worldMsgs, sysMsgs, guildMsgs, recentPrivateChats }; + return { worldMsgs, sysMsgs, guildMsgs, gvgMsgs, recentPrivateChats }; case 'event': return await getEvent(role.eventStatus, roleId, roleName); case 'battle': diff --git a/game-server/app/services/gvg/gvgService.ts b/game-server/app/services/gvg/gvgService.ts index e4528ebdb..b86a280dd 100644 --- a/game-server/app/services/gvg/gvgService.ts +++ b/game-server/app/services/gvg/gvgService.ts @@ -19,6 +19,8 @@ export async function createNewGVGConfig() { setGVGConfigToRemote(config); // TODO 每周自动解散一些联军 await pinus.app.rpc.guild.guildRemote.setGVGServerGroup.broadcast(); + await pinus.app.rpc.chat.chatRemote.setGVGServerGroup.broadcast(); + await pinus.app.rpc.connector.connectorRemote.setGVGServerGroup.broadcast(); return config; } @@ -157,12 +159,16 @@ export async function getServersOfSameGroup(type: GVG_SERVER_TYPE, id: number) { if(type == GVG_SERVER_TYPE.SINGLE) return [id]; let groupId = await getGroupIdOfServer(id); + return await getServersByGroupId(groupId); +} + +export async function getServersByGroupId(groupId: number) { let arr: { serverId: number; groupId: number }[] = pinus.app.get('gvgServerGroup')||[]; let serverCreateTimes = await getAllServerCreateTime(); return arr.filter(obj => { let openTime = parseInt(serverCreateTimes[obj.serverId]); - return obj.groupId == groupId && getServerTypeByTime(openTime) == type; + return obj.groupId == groupId && getServerTypeByTime(openTime) == GVG_SERVER_TYPE.MULTI; }).map(obj => obj.serverId); } diff --git a/game-server/app/services/gvg/gvgTeamService.ts b/game-server/app/services/gvg/gvgTeamService.ts index 2bad88776..239518418 100644 --- a/game-server/app/services/gvg/gvgTeamService.ts +++ b/game-server/app/services/gvg/gvgTeamService.ts @@ -190,11 +190,13 @@ function getAuthFromManageType(type: LEAGUE_MANAGE_TYPE) { case LEAGUE_MANAGE_TYPE.KICK: case LEAGUE_MANAGE_TYPE.DISSMISS: case LEAGUE_MANAGE_TYPE.ABDICATE: + case LEAGUE_MANAGE_TYPE.RERUIT: return [LEAGUE_AUTH.LEADER]; case LEAGUE_MANAGE_TYPE.QUIT: case LEAGUE_MANAGE_TYPE.BE_ABDICATED: return [LEAGUE_AUTH.SUB_LEADER]; case LEAGUE_MANAGE_TYPE.SET_INFO: + case LEAGUE_MANAGE_TYPE.SEND_MAIL: return [LEAGUE_AUTH.LEADER, LEAGUE_AUTH.SUB_LEADER]; } } diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 1b4af1a0b..dfb6bdea1 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -901,8 +901,9 @@ export async function initGVGConfigSchedule() { let config = await GVGConfigModel.findConfig(); if(!config) { config = await createNewGVGConfig(); + } else { + setGVGConfigToRemote(config); } - setGVGConfigToRemote(config); if(nowSeconds() > config.scheduleTime) { config = await createNewGVGConfig(); diff --git a/shared/consts/constModules/chatConst.ts b/shared/consts/constModules/chatConst.ts index 08f83e1a9..c04eb0b03 100644 --- a/shared/consts/constModules/chatConst.ts +++ b/shared/consts/constModules/chatConst.ts @@ -17,6 +17,7 @@ export const CHANNEL_PREFIX = { SYS: 'sys', WORLD: 'world', GUILD: 'guild', + GVG: 'gvg', // 战区 TEAM: 'com_btl_team', CITY: 'city', // 军团活动,诸侯混战,按城池分channel GUILD_AUCTION: 'g_auction', // 军团拍卖 @@ -36,6 +37,8 @@ export const getChannelType = function(prefix: string) { return 4; case 'private': return 5; + case CHANNEL_PREFIX.GVG: + return 6; } } @@ -83,6 +86,7 @@ export const MSG_SOURCE = { EQUIP_QUALITY_UP: 26, LADDER_FIRST_CHANGE: 27, GET_UR_HERO: 28, + GVG_RECURIT: 29, } export const DEFAULT_MSG_PER_PAGE = 10; diff --git a/shared/consts/constModules/gvgConst.ts b/shared/consts/constModules/gvgConst.ts index 4d60eb885..69c06ed8a 100644 --- a/shared/consts/constModules/gvgConst.ts +++ b/shared/consts/constModules/gvgConst.ts @@ -31,4 +31,6 @@ export enum LEAGUE_MANAGE_TYPE { ABDICATE = 6, // 转让 BE_ABDICATED = 7, // 被转让 SET_INFO = 8, // 设置信息 + RERUIT = 9, // 招募 + SEND_MAIL = 9, // 招募 } \ No newline at end of file diff --git a/shared/resource/jsons/dic_email_content.json b/shared/resource/jsons/dic_email_content.json index 400f4ad5a..e339045a1 100644 --- a/shared/resource/jsons/dic_email_content.json +++ b/shared/resource/jsons/dic_email_content.json @@ -241,7 +241,28 @@ "id": 34, "title": "&", "sendName": "您忠诚的小跟班", - "content": "亲爱的主公,您的背包中宝物数量已满,请及时清理背包哦。溢出装备已通过邮件发放,请查收", - "time": 2160 + "content": "主公很抱歉,您的军团已解散,请寻找新的军团加入吧", + "time": 720 + }, + { + "id": 35, + "title": "&", + "sendName": "您忠诚的小跟班", + "content": "主公很抱歉,您的联军%d已解散", + "time": 720 + }, + { + "id": 36, + "title": "&", + "sendName": "您忠诚的小跟班", + "content": "主公很抱歉,您的军团已被联军%d踢出", + "time": 720 + }, + { + "id": 37, + "title": "&", + "sendName": "您忠诚的小跟班", + "content": "亲爱的主公,您被任命为联军%d的盟主", + "time": 720 } ] \ No newline at end of file diff --git a/shared/resource/jsons/dic_zyz_chat_system.json b/shared/resource/jsons/dic_zyz_chat_system.json index 667abf6f1..6466184b1 100644 --- a/shared/resource/jsons/dic_zyz_chat_system.json +++ b/shared/resource/jsons/dic_zyz_chat_system.json @@ -288,5 +288,15 @@ "worldchat": "恭喜%d时来运转,获得神话武将%d", "bubble": "恭喜%d时来运转,获得神话武将%d", "comments": "1:%d(玩家名);2:%d(武将名)" + }, + { + "id": 29, + "name": "GVG_RECURIT", + "mean": "联军招募", + "type": "6&", + "template": "%d正在扩充兵马:%d,欢迎各军团加入建设", + "worldchat": "%d正在扩充兵马:%d,欢迎各军团加入建设", + "bubble": "%d正在扩充兵马:%d,欢迎各军团加入建设", + "comments": "1:%d(联军名);2:%d(联军招募内容)" } ] \ No newline at end of file diff --git a/shared/resource/jsons/server_const.json b/shared/resource/jsons/server_const.json index 8a7d9bb03..e9d1ce6c6 100644 --- a/shared/resource/jsons/server_const.json +++ b/shared/resource/jsons/server_const.json @@ -33,6 +33,6 @@ "DEBUG_TIME": 1, "CHECK_WORD": 1, "CAN_PAY": 1, - "SKIP_ENCODE": 1, + "SKIP_ENCODE": 0, "NEED_REBATE": 0 } \ No newline at end of file