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

This commit is contained in:
luying
2023-02-17 10:00:19 +08:00
parent 2eea5d86d9
commit 0804b32db4
9 changed files with 75 additions and 19 deletions

View File

@@ -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) {

View File

@@ -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 });
}

View File

@@ -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 = <LeagueRankInfo>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 = <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 });
}
}
}

View File

@@ -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);
}

View File

@@ -142,4 +142,10 @@ export enum GVG_AREA_TYPE {
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
}

View File

@@ -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 = '系统';

View File

@@ -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')

View File

@@ -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

View File

@@ -271,5 +271,19 @@
"sendName": "您忠诚的小跟班",
"content": "亲爱的主公,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收",
"time": 720
},
{
"id": 39,
"title": "&",
"sendName": "您忠诚的小跟班",
"content": "激战期联军排行榜奖励",
"time": 720
},
{
"id": 40,
"title": "&",
"sendName": "您忠诚的小跟班",
"content": "激战期个人排行榜奖励",
"time": 720
}
]