diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index d901835fe..08bf00cf1 100644 --- a/game-server/app/servers/guild/handler/gvgBattleHandler.ts +++ b/game-server/app/servers/guild/handler/gvgBattleHandler.ts @@ -1,4 +1,3 @@ -import { GVGCityType } from './../../../db/GVGCity'; import { GVGRecModel } from '../../../db/GVGRec'; import { GVGAreaInMap, GVGTeamInList, GVGTeamInListOnPoint, GVGTeamSpineInMap, LeagueGood, MyTeamInfo, MyTeamSimpleInfo } from '../../../domain/gvgField/returnData'; import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from '../../../db/GVGTeam'; @@ -10,20 +9,16 @@ import { GVGLeagueModel } from '../../../db/GVGLeague'; import { checkGVGPeriod, getGroupIdOfServer, getGVGConfig, getGVGPeriodData, getGVGServerType } from '../../../services/gvg/gvgService'; import { addBattleRankScore, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanks, getBirthAreaOfCity, getGVGWarId, getOppHeroes, initRobots, pushTeamMoveMessage, teamBreak } from '../../../services/gvg/gvgBattleService'; import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory'; -import { nowSeconds } from '../../../pubUtils/timeUtil'; import { GVGBattleRecModel } from '../../../db/GVGBattleRec'; import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService'; import { gameData } from '../../../pubUtils/data'; import { getAllServerName } from '../../../services/redisService'; import { checkBattleHeroesByHid } from '../../../services/normalBattleService'; -import { pick } from 'underscore'; import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb'; -import { GVG_PERIOD, PUSH_ROUTE, STATUS } from '../../../consts'; -import { sendMessageToGVGAreaByTeamWithSuc, sendMessageToUserWithSuc } from '../../../services/pushService'; +import { STATUS } from '../../../consts'; import { GVGHeroInfo } from '../../../domain/dbGeneral'; import { ArtifactModel } from '../../../db/Artifact'; import { getHeroesAttributes } from '../../../services/playerCeService'; -import { gvgBattleEndSchedule, gvgBattleStartSchedule } from '../../../services/timeTaskService'; import { addRoleToAreaChannel, addRoleToAreaTeamChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel } from '../../../services/chatChannelService'; export default function (app: Application) { diff --git a/game-server/app/servers/guild/handler/gvgManageHandler.ts b/game-server/app/servers/guild/handler/gvgManageHandler.ts index 25baac021..88b0185e1 100644 --- a/game-server/app/servers/guild/handler/gvgManageHandler.ts +++ b/game-server/app/servers/guild/handler/gvgManageHandler.ts @@ -14,7 +14,7 @@ import { GVGUserDataModel } from "../../../db/GVGUserData"; import { sendMessageToGuildWithSuc, sendMessageToUserWithSuc } from "../../../services/pushService"; import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare"; import { createGroupMsg, pushGroupMsgToRoom } from "../../../services/chatService"; -import { sendMailByContent, sendMailToGuildByContent } from "../../../services/mailService"; +import { sendMailByContent, sendMailToGuildByContent, sendMailToLeagueByContent } from "../../../services/mailService"; import { getGVGCities } from "../../../services/gvg/gvgBattleService"; import { guildQuitLeagueRecord } from "../../../services/gvg/gvgRecService"; import { LeagueLeader } from "../../../domain/rank"; @@ -637,9 +637,7 @@ export class GVGManageHandler { const { guildCodes } = myLeague; //下发邮件 - for(let guildCode of guildCodes) { - await sendMailToGuildByContent(MAIL_TYPE.GUILD_MAIL, guildCode, { sendName: `${roleName}`, params: [content] }); - } + await sendMailToLeagueByContent(MAIL_TYPE.GUILD_MAIL, myLeague.leagueCode, { sendName: `${roleName}`, params: [content] }, myLeague); return resResult(STATUS.SUCCESS, { isSuccess: true }); } diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 342f4df7a..6629bed26 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -2,8 +2,8 @@ import { GVGTeamMem } from "../../domain/battleField/gvgBattle"; import { GVGLeagueType } from "../../db/GVGLeague"; import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from "../../db/GVGTeam"; import { GVGCityModel, GVGCityType } from "../../db/GVGCity"; -import { gameData } from "../../pubUtils/data"; -import { GVG_AREA_TYPE, GVG_TECH_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts"; +import { gameData, getGVGBattleRankReward } from "../../pubUtils/data"; +import { GVG_AREA_TYPE, GVG_BATTLE_RANK_TYPE, GVG_TECH_TYPE, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts"; import { nowSeconds } from "../../pubUtils/timeUtil"; import { DicGVGAreaPoint } from "../../pubUtils/dictionary/DicGVGAreaPoint"; import { getGVGBattleData, getGVGBattleMap } from "./gvgBattleMemory"; @@ -16,9 +16,10 @@ import { GVGLeaguePrepareModel } from "../../db/GVGLeaguePrepare"; import { pinus } from "pinus"; import { dispatch } from "../../pubUtils/dispatcher"; import { Rank } from "../rankService"; -import { LeagueRankInfo } from "../../domain/rank"; +import { LeagueRankInfo, RoleRankInfo } from "../../domain/rank"; import { findKeys, getAllServerName } from "../redisService"; import { sendMessageToChannel, sendMessageToGVGAreaByTeamWithSuc, sendMessageToGVGAreaWithSuc } from "../pushService"; +import { sendMailToLeagueByContent } from "../mailService"; /** @@ -301,7 +302,8 @@ export async function gvgBattleEnd() { for(let { groupId, serverType, cityId } of rankKeys) { let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId }); let ranks = await r.getRankByRange(); - for(let obj of ranks) { // 排名最高 + // 排名最高占领城池 + for(let obj of ranks) { let rank = obj; let cnt = guardLeagueCnt.get(rank.code)||0; if(cnt < GVG.GVG_CITY_OCCUPIED_NUMBER) { @@ -310,10 +312,30 @@ export async function gvgBattleEnd() { break; } } + // 联军排行榜发放奖励 + for(let _obj of ranks) { + let obj = _obj; + let dicRank = getGVGBattleRankReward(GVG_BATTLE_RANK_TYPE.LEAGUE, obj.rank); + await sendMailToLeagueByContent(MAIL_TYPE.GVG_BATTLE_LEAGUE_RANK_REWARD, obj.code, { params: [`${obj.rank}`], goods: dicRank.reward }); + } } - // 排行榜发放奖励 + // 个人排行榜发放奖励 + let playerKeys = await findKeys(`${REDIS_KEY.GVG_BATTLE_RANK}:${configId}:`); + for(let key of playerKeys) { + let [,, _groupId, _serverType, _cityId] = key.split(':'); + let groupId = parseInt(_groupId); + let serverType = parseInt(_serverType); + let cityId = parseInt(_cityId); + let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId }); + let ranks = await r.getRankByRange(); + for(let _obj of ranks) { + let obj = _obj; + let dicRank = getGVGBattleRankReward(GVG_BATTLE_RANK_TYPE.PLAYER, obj.rank); + await sendMailToLeagueByContent(MAIL_TYPE.GVG_BATTLE_PLAYER_RANK_REWARD, obj.roleId, { params: [`${obj.rank}`], goods: dicRank.reward }); + } + } } diff --git a/game-server/app/services/mailService.ts b/game-server/app/services/mailService.ts index 97bbe6b5d..2f5cb673a 100644 --- a/game-server/app/services/mailService.ts +++ b/game-server/app/services/mailService.ts @@ -17,6 +17,7 @@ import { BAG } from "../pubUtils/dicParam"; import { GuildModel, GuildType } from "../db/Guild"; import moment = require("moment"); import { sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToUsersWithSuc } from "./pushService"; +import { GVGLeagueModel, GVGLeagueType } from "../db/GVGLeague"; /** * 获取邮件信息 @@ -71,6 +72,16 @@ export async function sendMailToGuildByContent(contentId: MAIL_TYPE, guildCode: return true; } +export async function sendMailToLeagueByContent(contentId: MAIL_TYPE, leagueCode: string, params: { sendName?: string, endTime?: number, params?: string[], goods?: RewardInter[] }, league?: GVGLeagueType) { + if(!league) league = await GVGLeagueModel.findByCodeWithoutPopulate(leagueCode); + if(!league) return false; + let f = new SendMailFun(); + let code = f.setWithContentId(contentId, params); + await f.createGroupMails(code, league.members.map(cur => cur.roleId), null, leagueCode); + await f.pushToUsers(); + return true; +} + export async function sendMailsByGmMail(gmmails: GMMailType[]) { let f = new SendMailFun(); for(let gmmail of gmmails) { @@ -224,13 +235,13 @@ export class SendMailFun { } // 生成多人邮件 - public async createGroupMails(code: string, roleIds: string[], guildCode?: string) { + public async createGroupMails(code: string, roleIds: string[], guildCode?: string, leagueCode?: string) { let mapTemp = this.mailTemps.get(code); if(mapTemp.sendTime < nowSeconds()) return; let roleStatus = roleIds.map(roleId => { return { roleId, status: MAIL_STATUS.CREATE } }) - let originMail = await GroupMailModel.addMail({ roleStatus, guildCode, ...mapTemp.getCreateMailParams() }); + let originMail = await GroupMailModel.addMail({ roleStatus, guildCode, leagueCode, ...mapTemp.getCreateMailParams() }); if(mapTemp.gmmail) await GMMailModel.sendMail(mapTemp.gmmail._id, mapTemp.sendTime); this.groupMails.push(originMail); } diff --git a/shared/consts/constModules/gvgConst.ts b/shared/consts/constModules/gvgConst.ts index fe4cb5587..91f738e80 100644 --- a/shared/consts/constModules/gvgConst.ts +++ b/shared/consts/constModules/gvgConst.ts @@ -142,4 +142,10 @@ export enum GVG_AREA_TYPE { CATAPULT = 6, // 6-投石车区 } -export const GVG_CATAPULT = 'catapult'; \ No newline at end of file +export const GVG_CATAPULT = 'catapult'; + +export enum GVG_BATTLE_RANK_TYPE { + PLAYER = 1, + GUILD = 2, // 废弃 + LEAGUE = 3 +} \ No newline at end of file diff --git a/shared/consts/constModules/mailConst.ts b/shared/consts/constModules/mailConst.ts index aebd57b11..be47d77d4 100644 --- a/shared/consts/constModules/mailConst.ts +++ b/shared/consts/constModules/mailConst.ts @@ -66,6 +66,8 @@ export enum MAIL_TYPE { LEAGUE_KICK = 36, // 被踢出联军 LEAGUE_ABDICATE = 37, // 被任命盟主 HELP_HARVEST = 38, // 帮收 + GVG_BATTLE_LEAGUE_RANK_REWARD = 39, // 激战期联军排行榜奖励 + GVG_BATTLE_PLAYER_RANK_REWARD = 40, // 激战期个人排行榜奖励 }; export const SEND_NAME = '系统'; diff --git a/shared/db/GVGLeague.ts b/shared/db/GVGLeague.ts index 845984207..3789f81c9 100644 --- a/shared/db/GVGLeague.ts +++ b/shared/db/GVGLeague.ts @@ -100,13 +100,19 @@ export default class GVGLeague extends BaseModel { return league } - public static async findByCode(leagueCode: string) { + public static async findByCode(leagueCode: string, select = '') { const league: GVGLeagueType = await GVGLeagueModel.findOne({ leagueCode, status: 1 }) .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, _id: 0 }, 'Role') + .select(select) .lean(); return league } + public static async findByCodeWithoutPopulate(leagueCode: string, select = '') { + const league: GVGLeagueType = await GVGLeagueModel.findOne({ leagueCode, status: 1 }).select(select).lean(); + return league + } + public static async findByCodes(leagueCodes: string[]) { const leagues: GVGLeagueType[] = await GVGLeagueModel.find({ leagueCode: { $in: leagueCodes }, status: 1 }) .populate('leader', { roleId: 1, roleName: 1, head: 1, frame: 1, spine: 1, lv: 1, quitTime: 1, ce: 1, title: 1, serverId: 1, guildName: 1, _id: 0 }, 'Role') diff --git a/shared/db/GroupMail.ts b/shared/db/GroupMail.ts index d1efba83f..8a317c4ae 100644 --- a/shared/db/GroupMail.ts +++ b/shared/db/GroupMail.ts @@ -23,6 +23,8 @@ export default class GroupMail extends MailTemp { @prop({ required: false }) guildCode: string; + @prop({ required: false }) + leagueCode: string; /** * @description 根据玩家id获得所有有效邮件 * @param {String} roleId 玩家id diff --git a/shared/resource/jsons/dic_email_content.json b/shared/resource/jsons/dic_email_content.json index f58fb879a..7bb86f536 100644 --- a/shared/resource/jsons/dic_email_content.json +++ b/shared/resource/jsons/dic_email_content.json @@ -271,5 +271,19 @@ "sendName": "您忠诚的小跟班", "content": "亲爱的主公,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收", "time": 720 + }, + { + "id": 39, + "title": "&", + "sendName": "您忠诚的小跟班", + "content": "激战期联军排行榜奖励", + "time": 720 + }, + { + "id": 40, + "title": "&", + "sendName": "您忠诚的小跟班", + "content": "激战期个人排行榜奖励", + "time": 720 } ] \ No newline at end of file