✨ feat(gvg): 排行榜奖励邮件

This commit is contained in:
luying
2023-02-17 11:00:25 +08:00
parent 2eea5d86d9
commit 0804b32db4
9 changed files with 75 additions and 19 deletions
@@ -1,4 +1,3 @@
import { GVGCityType } from './../../../db/GVGCity';
import { GVGRecModel } from '../../../db/GVGRec'; import { GVGRecModel } from '../../../db/GVGRec';
import { GVGAreaInMap, GVGTeamInList, GVGTeamInListOnPoint, GVGTeamSpineInMap, LeagueGood, MyTeamInfo, MyTeamSimpleInfo } from '../../../domain/gvgField/returnData'; import { GVGAreaInMap, GVGTeamInList, GVGTeamInListOnPoint, GVGTeamSpineInMap, LeagueGood, MyTeamInfo, MyTeamSimpleInfo } from '../../../domain/gvgField/returnData';
import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from '../../../db/GVGTeam'; 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 { 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 { addBattleRankScore, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanks, getBirthAreaOfCity, getGVGWarId, getOppHeroes, initRobots, pushTeamMoveMessage, teamBreak } from '../../../services/gvg/gvgBattleService';
import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory'; import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory';
import { nowSeconds } from '../../../pubUtils/timeUtil';
import { GVGBattleRecModel } from '../../../db/GVGBattleRec'; import { GVGBattleRecModel } from '../../../db/GVGBattleRec';
import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService'; import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService';
import { gameData } from '../../../pubUtils/data'; import { gameData } from '../../../pubUtils/data';
import { getAllServerName } from '../../../services/redisService'; import { getAllServerName } from '../../../services/redisService';
import { checkBattleHeroesByHid } from '../../../services/normalBattleService'; import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
import { pick } from 'underscore';
import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb'; import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb';
import { GVG_PERIOD, PUSH_ROUTE, STATUS } from '../../../consts'; import { STATUS } from '../../../consts';
import { sendMessageToGVGAreaByTeamWithSuc, sendMessageToUserWithSuc } from '../../../services/pushService';
import { GVGHeroInfo } from '../../../domain/dbGeneral'; import { GVGHeroInfo } from '../../../domain/dbGeneral';
import { ArtifactModel } from '../../../db/Artifact'; import { ArtifactModel } from '../../../db/Artifact';
import { getHeroesAttributes } from '../../../services/playerCeService'; import { getHeroesAttributes } from '../../../services/playerCeService';
import { gvgBattleEndSchedule, gvgBattleStartSchedule } from '../../../services/timeTaskService';
import { addRoleToAreaChannel, addRoleToAreaTeamChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel } from '../../../services/chatChannelService'; import { addRoleToAreaChannel, addRoleToAreaTeamChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel } from '../../../services/chatChannelService';
export default function (app: Application) { export default function (app: Application) {
@@ -14,7 +14,7 @@ import { GVGUserDataModel } from "../../../db/GVGUserData";
import { sendMessageToGuildWithSuc, sendMessageToUserWithSuc } from "../../../services/pushService"; import { sendMessageToGuildWithSuc, sendMessageToUserWithSuc } from "../../../services/pushService";
import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare"; import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare";
import { createGroupMsg, pushGroupMsgToRoom } from "../../../services/chatService"; 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 { getGVGCities } from "../../../services/gvg/gvgBattleService";
import { guildQuitLeagueRecord } from "../../../services/gvg/gvgRecService"; import { guildQuitLeagueRecord } from "../../../services/gvg/gvgRecService";
import { LeagueLeader } from "../../../domain/rank"; import { LeagueLeader } from "../../../domain/rank";
@@ -637,9 +637,7 @@ export class GVGManageHandler {
const { guildCodes } = myLeague; const { guildCodes } = myLeague;
//下发邮件 //下发邮件
for(let guildCode of guildCodes) { await sendMailToLeagueByContent(MAIL_TYPE.GUILD_MAIL, myLeague.leagueCode, { sendName: `${roleName}`, params: [content] }, myLeague);
await sendMailToGuildByContent(MAIL_TYPE.GUILD_MAIL, guildCode, { sendName: `${roleName}`, params: [content] });
}
return resResult(STATUS.SUCCESS, { isSuccess: true }); return resResult(STATUS.SUCCESS, { isSuccess: true });
} }
@@ -2,8 +2,8 @@ import { GVGTeamMem } from "../../domain/battleField/gvgBattle";
import { GVGLeagueType } from "../../db/GVGLeague"; import { GVGLeagueType } from "../../db/GVGLeague";
import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from "../../db/GVGTeam"; import { GVGTeamModel, GVGTeamType, GVGTeamUpdate } from "../../db/GVGTeam";
import { GVGCityModel, GVGCityType } from "../../db/GVGCity"; import { GVGCityModel, GVGCityType } from "../../db/GVGCity";
import { gameData } from "../../pubUtils/data"; import { gameData, getGVGBattleRankReward } from "../../pubUtils/data";
import { GVG_AREA_TYPE, GVG_TECH_TYPE, PUSH_ROUTE, REDIS_KEY, STATUS } from "../../consts"; 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 { nowSeconds } from "../../pubUtils/timeUtil";
import { DicGVGAreaPoint } from "../../pubUtils/dictionary/DicGVGAreaPoint"; import { DicGVGAreaPoint } from "../../pubUtils/dictionary/DicGVGAreaPoint";
import { getGVGBattleData, getGVGBattleMap } from "./gvgBattleMemory"; import { getGVGBattleData, getGVGBattleMap } from "./gvgBattleMemory";
@@ -16,9 +16,10 @@ import { GVGLeaguePrepareModel } from "../../db/GVGLeaguePrepare";
import { pinus } from "pinus"; import { pinus } from "pinus";
import { dispatch } from "../../pubUtils/dispatcher"; import { dispatch } from "../../pubUtils/dispatcher";
import { Rank } from "../rankService"; import { Rank } from "../rankService";
import { LeagueRankInfo } from "../../domain/rank"; import { LeagueRankInfo, RoleRankInfo } from "../../domain/rank";
import { findKeys, getAllServerName } from "../redisService"; import { findKeys, getAllServerName } from "../redisService";
import { sendMessageToChannel, sendMessageToGVGAreaByTeamWithSuc, sendMessageToGVGAreaWithSuc } from "../pushService"; 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) { for(let { groupId, serverType, cityId } of rankKeys) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId }); let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId });
let ranks = await r.getRankByRange(); let ranks = await r.getRankByRange();
for(let obj of ranks) { // 排名最高 // 排名最高占领城池
for(let obj of ranks) {
let rank = <LeagueRankInfo>obj; let rank = <LeagueRankInfo>obj;
let cnt = guardLeagueCnt.get(rank.code)||0; let cnt = guardLeagueCnt.get(rank.code)||0;
if(cnt < GVG.GVG_CITY_OCCUPIED_NUMBER) { if(cnt < GVG.GVG_CITY_OCCUPIED_NUMBER) {
@@ -310,10 +312,30 @@ export async function gvgBattleEnd() {
break; break;
} }
} }
// 联军排行榜发放奖励
for(let _obj of ranks) {
let obj = <LeagueRankInfo>_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 = <RoleRankInfo>_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 });
}
}
} }
+13 -2
View File
@@ -17,6 +17,7 @@ import { BAG } from "../pubUtils/dicParam";
import { GuildModel, GuildType } from "../db/Guild"; import { GuildModel, GuildType } from "../db/Guild";
import moment = require("moment"); import moment = require("moment");
import { sendMessageToGuildWithSuc, sendMessageToServerWithSuc, sendMessageToUsersWithSuc } from "./pushService"; 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; 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[]) { export async function sendMailsByGmMail(gmmails: GMMailType[]) {
let f = new SendMailFun(); let f = new SendMailFun();
for(let gmmail of gmmails) { 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); let mapTemp = this.mailTemps.get(code);
if(mapTemp.sendTime < nowSeconds()) return; if(mapTemp.sendTime < nowSeconds()) return;
let roleStatus = roleIds.map(roleId => { let roleStatus = roleIds.map(roleId => {
return { roleId, status: MAIL_STATUS.CREATE } 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); if(mapTemp.gmmail) await GMMailModel.sendMail(mapTemp.gmmail._id, mapTemp.sendTime);
this.groupMails.push(originMail); this.groupMails.push(originMail);
} }
+7 -1
View File
@@ -142,4 +142,10 @@ export enum GVG_AREA_TYPE {
CATAPULT = 6, // 6-投石车区 CATAPULT = 6, // 6-投石车区
} }
export const GVG_CATAPULT = 'catapult'; export const GVG_CATAPULT = 'catapult';
export enum GVG_BATTLE_RANK_TYPE {
PLAYER = 1,
GUILD = 2, // 废弃
LEAGUE = 3
}
+2
View File
@@ -66,6 +66,8 @@ export enum MAIL_TYPE {
LEAGUE_KICK = 36, // 被踢出联军 LEAGUE_KICK = 36, // 被踢出联军
LEAGUE_ABDICATE = 37, // 被任命盟主 LEAGUE_ABDICATE = 37, // 被任命盟主
HELP_HARVEST = 38, // 帮收 HELP_HARVEST = 38, // 帮收
GVG_BATTLE_LEAGUE_RANK_REWARD = 39, // 激战期联军排行榜奖励
GVG_BATTLE_PLAYER_RANK_REWARD = 40, // 激战期个人排行榜奖励
}; };
export const SEND_NAME = '系统'; export const SEND_NAME = '系统';
+7 -1
View File
@@ -100,13 +100,19 @@ export default class GVGLeague extends BaseModel {
return league return league
} }
public static async findByCode(leagueCode: string) { public static async findByCode(leagueCode: string, select = '') {
const league: GVGLeagueType = await GVGLeagueModel.findOne({ leagueCode, status: 1 }) 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') .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(); .lean();
return league 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[]) { public static async findByCodes(leagueCodes: string[]) {
const leagues: GVGLeagueType[] = await GVGLeagueModel.find({ leagueCode: { $in: leagueCodes }, status: 1 }) 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') .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')
+2
View File
@@ -23,6 +23,8 @@ export default class GroupMail extends MailTemp {
@prop({ required: false }) @prop({ required: false })
guildCode: string; guildCode: string;
@prop({ required: false })
leagueCode: string;
/** /**
* @description 根据玩家id获得所有有效邮件 * @description 根据玩家id获得所有有效邮件
* @param {String} roleId 玩家id * @param {String} roleId 玩家id
@@ -271,5 +271,19 @@
"sendName": "您忠诚的小跟班", "sendName": "您忠诚的小跟班",
"content": "亲爱的主公,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收", "content": "亲爱的主公,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收",
"time": 720 "time": 720
},
{
"id": 39,
"title": "&",
"sendName": "您忠诚的小跟班",
"content": "激战期联军排行榜奖励",
"time": 720
},
{
"id": 40,
"title": "&",
"sendName": "您忠诚的小跟班",
"content": "激战期个人排行榜奖励",
"time": 720
} }
] ]