✨ feat(gvg): 排行榜奖励邮件
This commit is contained in:
@@ -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 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,3 +143,9 @@ export enum GVG_AREA_TYPE {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const GVG_CATAPULT = 'catapult';
|
export const GVG_CATAPULT = 'catapult';
|
||||||
|
|
||||||
|
export enum GVG_BATTLE_RANK_TYPE {
|
||||||
|
PLAYER = 1,
|
||||||
|
GUILD = 2, // 废弃
|
||||||
|
LEAGUE = 3
|
||||||
|
}
|
||||||
@@ -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 = '系统';
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
Reference in New Issue
Block a user