✨ feat(gvg): 添加城池排行榜定时推送

This commit is contained in:
luying
2023-02-17 13:53:01 +08:00
parent 0e68ee466f
commit b0e0c83fcd
10 changed files with 149 additions and 70 deletions
+2
View File
@@ -219,6 +219,8 @@ async function treatStartLogic(app: _pinus.Application) {
redisService.clearComBtlQueue(); redisService.clearComBtlQueue();
redisService.clearChannelServers(); redisService.clearChannelServers();
redisService.clearGVGHistoryAreas(); redisService.clearGVGHistoryAreas();
redisService.clearGVGHistoryAreaTeam();
redisService.clearGVGHistoryCityTeam();
updateTeamStatus(COM_TEAM_STATUS.DEFAULT, COM_TEAM_STATUS.LOOSE); updateTeamStatus(COM_TEAM_STATUS.DEFAULT, COM_TEAM_STATUS.LOOSE);
updateTeamStatus(COM_TEAM_STATUS.FIGHTING, COM_TEAM_STATUS.LOOSE); updateTeamStatus(COM_TEAM_STATUS.FIGHTING, COM_TEAM_STATUS.LOOSE);
} }
@@ -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 { nowSeconds, getZeroPoint } from '../../../pubUtils/timeUtil';
import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin, getOnlineRoleByUserCode } from '../../../services/redisService'; import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin, getOnlineRoleByUserCode } from '../../../services/redisService';
import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGroupShopChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel } from '../../../services/chatService'; import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGroupShopChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel, leaveGVGCityTeamChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel } from '../../../services/chatService';
import { reportOneOnline, savePlayTime } from '../../../services/authenticateService'; import { reportOneOnline, savePlayTime } from '../../../services/authenticateService';
import { checkTaskInEntry, } from '../../../services/task/taskService'; import { checkTaskInEntry, } from '../../../services/task/taskService';
import { pushData, kickUser, getModuleData, assignServer, leaveServer } from '../../../services/connectorService'; import { pushData, kickUser, getModuleData, assignServer, leaveServer } from '../../../services/connectorService';
@@ -222,6 +222,8 @@ export class EntryHandler {
await leaveGroupShopChannel(roleId, sid); await leaveGroupShopChannel(roleId, sid);
await leaveGVGAreaChannel(roleId, sid); await leaveGVGAreaChannel(roleId, sid);
await leaveGVGAreaTeamChannel(roleId, sid); await leaveGVGAreaTeamChannel(roleId, sid);
await leaveGVGCityTeamChannel(roleId, sid);
} catch(e) { } catch(e) {
console.error(e); console.error(e);
} }
@@ -19,7 +19,7 @@ import { STATUS } from '../../../consts';
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 { addRoleToAreaChannel, addRoleToAreaTeamChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel } from '../../../services/chatChannelService'; import { addRoleToAreaChannel, addRoleToAreaTeamChannel, addRoleToGVGCityChannel, leaveGVGAreaChannel, leaveGVGAreaTeamChannel, leaveGVGCityTeamChannel } from '../../../services/chatChannelService';
export default function (app: Application) { export default function (app: Application) {
new HandlerService(app, {}); new HandlerService(app, {});
@@ -150,6 +150,7 @@ export class GVGBattleHandler {
async enterCity(msg: { cityId: number }, session: BackendSession) { async enterCity(msg: { cityId: number }, session: BackendSession) {
const roleId = session.get('roleId'); const roleId = session.get('roleId');
const sid = session.get('sid');
const roleName = session.get('roleName'); const roleName = session.get('roleName');
const serverId = session.get('serverId'); const serverId = session.get('serverId');
const guildCode = session.get('guildCode'); const guildCode = session.get('guildCode');
@@ -201,6 +202,8 @@ export class GVGBattleHandler {
const recs = await GVGRecModel.findByCity(cityId, configId); const recs = await GVGRecModel.findByCity(cityId, configId);
const teamResult = teams.map(team => new MyTeamInfo(team)); const teamResult = teams.map(team => new MyTeamInfo(team));
const { ranks, myRank } = await getBattleRanks(configId, groupId, serverType, cityId, myLeague); const { ranks, myRank } = await getBattleRanks(configId, groupId, serverType, cityId, myLeague);
await leaveGVGCityTeamChannel(roleId, sid);
await addRoleToGVGCityChannel(roleId, groupId, serverType, cityId, sid);
return resResult(STATUS.SUCCESS, { return resResult(STATUS.SUCCESS, {
cityId, cityId,
@@ -248,6 +251,7 @@ export class GVGBattleHandler {
await leaveGVGAreaChannel(roleId, sid); await leaveGVGAreaChannel(roleId, sid);
await leaveGVGAreaTeamChannel(roleId, sid); await leaveGVGAreaTeamChannel(roleId, sid);
await leaveGVGCityTeamChannel(roleId, sid);
return resResult(STATUS.SUCCESS); return resResult(STATUS.SUCCESS);
} }
+23 -1
View File
@@ -1,5 +1,5 @@
import { addGVGHistoryAreas, addGVGHistoryAreaTeam, addRedisChannel, getGVGHistoryAreas, getGVGHistoryAreaTeam, redisChannelServer } from './redisService'; import { addGVGHistoryAreas, addGVGHistoryAreaTeam, addGVGHistoryCityTeam, addRedisChannel, delGVGHistoryAreas, delGVGHistoryAreaTeam, delGVGHistoryCityTeam, getGVGHistoryAreas, getGVGHistoryAreaTeam, getGVGHistoryCityTeam, redisChannelServer } from './redisService';
import { groupRoomId } from './chatService'; import { groupRoomId } from './chatService';
import { pinus } from 'pinus'; import { pinus } from 'pinus';
import { crc32 } from 'crc'; import { crc32 } from 'crc';
@@ -75,6 +75,11 @@ export async function addRoleToAreaTeamChannel(roleId: string, groupId: number,
await addGVGHistoryAreaTeam(roleId, groupId, serverType, areaId); await addGVGHistoryAreaTeam(roleId, groupId, serverType, areaId);
} }
export async function addRoleToGVGCityChannel(roleId: string, groupId: number, serverType: number, cityId: number, sid: string) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupId}_${serverType}_${cityId}`);
await addRoleToChannel(roomId, roleId, sid);
await addGVGHistoryCityTeam(roleId, groupId, serverType, cityId);
}
async function leaveChannel(roomId: string, roleId: string, sid: string) { async function leaveChannel(roomId: string, roleId: string, sid: string) {
const channelSid = await channelServer(roomId); const channelSid = await channelServer(roomId);
await pinus.app.rpc.chat.chatRemote.leaveChannel.toServer(channelSid, roomId, roleId, sid); await pinus.app.rpc.chat.chatRemote.leaveChannel.toServer(channelSid, roomId, roleId, sid);
@@ -122,6 +127,7 @@ export async function leaveGVGAreaChannel(roleId: string, sid: string) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, key); const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, key);
await leaveChannel(roomId, roleId, sid); await leaveChannel(roomId, roleId, sid);
} }
await delGVGHistoryAreas(roleId);
} }
export async function leaveGVGAreaTeamChannel(roleId: string, sid: string) { export async function leaveGVGAreaTeamChannel(roleId: string, sid: string) {
@@ -130,6 +136,16 @@ export async function leaveGVGAreaTeamChannel(roleId: string, sid: string) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, channelName); const roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, channelName);
await leaveChannel(roomId, roleId, sid); await leaveChannel(roomId, roleId, sid);
} }
await delGVGHistoryAreaTeam(roleId);
}
export async function leaveGVGCityTeamChannel(roleId: string, sid: string) {
let channelName = await getGVGHistoryCityTeam(roleId);
if(channelName) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, channelName);
await leaveChannel(roomId, roleId, sid);
}
await delGVGHistoryCityTeam(roleId);
} }
export async function getWorldChannelSid(serverId: number) { export async function getWorldChannelSid(serverId: number) {
@@ -180,6 +196,12 @@ export async function getGVGAreaTeamChannelSid(groupId: number, serverType: numb
return channelSid; return channelSid;
} }
export async function getGVGCityTeamChannelSid(groupId: number, serverType: number, cityId: number) {
const roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupId}_${serverType}_${cityId}`);
const channelSid = await channelServer(roomId);
return channelSid;
}
async function delChannel(roomId: string) { async function delChannel(roomId: string) {
const channelSid = await channelServer(roomId); const channelSid = await channelServer(roomId);
await pinus.app.rpc.chat.chatRemote.deleteChannel.toServer(channelSid, roomId); await pinus.app.rpc.chat.chatRemote.deleteChannel.toServer(channelSid, roomId);
@@ -7,8 +7,7 @@ import { GVG_AREA_TYPE, GVG_BATTLE_RANK_TYPE, GVG_TECH_TYPE, MAIL_TYPE, PUSH_ROU
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";
import { GVGAreaInMap, GVGCityMapInfo, GVGTeamInList, GVGTeamInListOnPoint, GVGTeamSpineInMap } from "../../domain/gvgField/returnData"; import { GVGCityMapInfo, GVGTeamInList, GVGTeamInListOnPoint, GVGTeamSpineInMap } from "../../domain/gvgField/returnData";
import { pick } from "underscore";
import { GVG } from "../../pubUtils/dicParam"; import { GVG } from "../../pubUtils/dicParam";
import { GVGHeroInfo, PvpEnemies, PvpHeroInfo } from "../../domain/dbGeneral"; import { GVGHeroInfo, PvpEnemies, PvpHeroInfo } from "../../domain/dbGeneral";
import { getGVGConfig } from "./gvgService"; import { getGVGConfig } from "./gvgService";
@@ -18,7 +17,7 @@ import { dispatch } from "../../pubUtils/dispatcher";
import { Rank } from "../rankService"; import { Rank } from "../rankService";
import { LeagueRankInfo, RoleRankInfo } 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, sendMessageToCityWithSuc, sendMessageToGVGAreaByTeamWithSuc, sendMessageToGVGAreaWithSuc, sendMessageToGVGCityWithSuc } from "../pushService";
import { sendMailToLeagueByContent } from "../mailService"; import { sendMailToLeagueByContent } from "../mailService";
@@ -266,7 +265,9 @@ export async function getBattleRanks(configId: number, groupId: number, serverTy
// 每5秒一次结算 // 每5秒一次结算
export async function gvgBattleSeconds() { export async function gvgBattleSeconds() {
const { configId } = getGVGConfig();
const serverNames = await getAllServerName(); const serverNames = await getAllServerName();
let keys: { groupId: number, serverType: number, cityId: number }[] = []
for(let [_key, teamObj] of getGVGBattleMap()) { for(let [_key, teamObj] of getGVGBattleMap()) {
// 每5秒给据点上的人加积分 // 每5秒给据点上的人加积分
let teams = teamObj.findSettledPoint(); let teams = teamObj.findSettledPoint();
@@ -281,11 +282,27 @@ export async function gvgBattleSeconds() {
let dicArea = gameData.gvgArea.get(areaId); let dicArea = gameData.gvgArea.get(areaId);
let teams = teamObj.findTeamsByArea(areaId); let teams = teamObj.findTeamsByArea(areaId);
let result = teams.map(team => new GVGTeamSpineInMap(team, serverNames)); let result = teams.map(team => new GVGTeamSpineInMap(team, serverNames));
sendMessageToGVGAreaWithSuc(teamObj.groupId, teamObj.serverType, areaId, PUSH_ROUTE.GVG_AREA_SPINE_CHANGE, { cityId: dicArea.cityId, areaId, spines: result }); await sendMessageToGVGAreaWithSuc(teamObj.groupId, teamObj.serverType, areaId, PUSH_ROUTE.GVG_AREA_SPINE_CHANGE, { cityId: dicArea.cityId, areaId, spines: result });
let index = keys.findIndex(cur => cur.cityId == dicArea.cityId && cur.groupId == teamObj.groupId && cur.serverType == teamObj.serverType);
if(index == -1) keys.push({ groupId: teamObj.groupId, serverType: teamObj.serverType, cityId: dicArea.cityId });
} }
} }
for(let { groupId, serverType, cityId } of keys) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId });
let rawRanks = await r.getRankByRange();
let ranks = rawRanks.map(obj => {
if(obj instanceof LeagueRankInfo) {
return { rank: obj.rank, leagueCode: obj.code, leagueName: obj.name, score: obj.num }
}
return obj
})
await sendMessageToGVGCityWithSuc(groupId, serverType, cityId, PUSH_ROUTE.GVG_CITY_RANK_UPDATE, { cityId, ranks });
}
} }
export async function gvgBattleEnd() { export async function gvgBattleEnd() {
+9 -3
View File
@@ -1,7 +1,7 @@
import { Channel, pinus } from "pinus"; import { Channel, pinus } from "pinus";
import { CHANNEL_PREFIX, PUSH_BATCH, PUSH_INTERVAL, PUSH_ROUTE, STATUS } from "../consts"; import { CHANNEL_PREFIX, PUSH_BATCH, PUSH_INTERVAL, PUSH_ROUTE, STATUS } from "../consts";
import { genCode, resResult } from "../pubUtils/util"; import { genCode, resResult } from "../pubUtils/util";
import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId, getGroupShopSid, getGVGAreaChannelSid, getGVGAreaTeamChannelSid } from "./chatService"; import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId, getGroupShopSid, getGVGAreaChannelSid, getGVGAreaTeamChannelSid, getGVGCityTeamChannelSid } from "./chatService";
import { getAllOnlineRoles, getAllServers, getRoleOnlineInfo } from "./redisService"; import { getAllOnlineRoles, getAllServers, getRoleOnlineInfo } from "./redisService";
import { errlogger, infologger } from '../util/logger'; import { errlogger, infologger } from '../util/logger';
import { MsgEncrypt } from "../pubUtils/sysUtil"; import { MsgEncrypt } from "../pubUtils/sysUtil";
@@ -64,13 +64,19 @@ export async function sendMessageToGuild(guildCode: string, route: string, data:
export async function sendMessageToGVGAreaWithSuc(groupId: number, serverType: number, areaId: number, route: string, data: any) { export async function sendMessageToGVGAreaWithSuc(groupId: number, serverType: number, areaId: number, route: string, data: any) {
let channelSid = await getGVGAreaChannelSid(groupId, serverType, areaId); let channelSid = await getGVGAreaChannelSid(groupId, serverType, areaId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupId}_${serverType}_${areaId}`); let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREAS, `${groupId}_${serverType}_${areaId}`);
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, data); await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, resResult(STATUS.SUCCESS, data));
} }
export async function sendMessageToGVGAreaByTeamWithSuc(groupId: number, serverType: number, areaId: number, route: string, data: any) { export async function sendMessageToGVGAreaByTeamWithSuc(groupId: number, serverType: number, areaId: number, route: string, data: any) {
let channelSid = await getGVGAreaTeamChannelSid(groupId, serverType, areaId); let channelSid = await getGVGAreaTeamChannelSid(groupId, serverType, areaId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupId}_${serverType}_${areaId}`); let roomId = groupRoomId(CHANNEL_PREFIX.GVG_AREA_BY_TEAM, `${groupId}_${serverType}_${areaId}`);
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, data); await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, resResult(STATUS.SUCCESS, data));
}
export async function sendMessageToGVGCityWithSuc(groupId: number, serverType: number, cityId: number, route: string, data: any) {
let channelSid = await getGVGCityTeamChannelSid(groupId, serverType, cityId);
let roomId = groupRoomId(CHANNEL_PREFIX.GVG_CITY, `${groupId}_${serverType}_${cityId}`);
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, resResult(STATUS.SUCCESS, data));
} }
export async function sendMessageToCityWithSuc(serverId: number, cityId: number, route: string, data: any) { export async function sendMessageToCityWithSuc(serverId: number, cityId: number, route: string, data: any) {
+23
View File
@@ -742,3 +742,26 @@ export async function clearGVGHistoryAreaTeam() {
const result = await redisClient().delAsync(REDIS_KEY.GVG_HISTORY_AREA_TEAM); const result = await redisClient().delAsync(REDIS_KEY.GVG_HISTORY_AREA_TEAM);
return result; return result;
} }
export async function getGVGHistoryCityTeam(roleId: string) {
let channelName = await redisClient().hgetAsync(REDIS_KEY.GVG_HISTORY_CITY, roleId);
return channelName
}
export async function addGVGHistoryCityTeam(roleId: string, groupId: number, serverType: number, cityId: number) {
const result = await redisClient().hsetAsync(REDIS_KEY.GVG_HISTORY_CITY, roleId, `${groupId}_${serverType}_${cityId}`);
return result;
}
export async function delGVGHistoryCityTeam(roleId: string) {
const result = await redisClient().hdelAsync(REDIS_KEY.GVG_HISTORY_CITY, roleId);
return result;
}
export async function clearGVGHistoryCityTeam() {
const result = await redisClient().delAsync(REDIS_KEY.GVG_HISTORY_CITY);
return result;
}
+2
View File
@@ -25,6 +25,7 @@ export const CHANNEL_PREFIX = {
GROUP_SHOP: 'groupShop', // 团购页面 GROUP_SHOP: 'groupShop', // 团购页面
GVG_AREAS: 'gvgAreas', // 大地图界面 GVG_AREAS: 'gvgAreas', // 大地图界面
GVG_AREA_BY_TEAM: 'gvgTeam', // 选中玩家队伍后加入频道 GVG_AREA_BY_TEAM: 'gvgTeam', // 选中玩家队伍后加入频道
GVG_CITY: 'gvgCity', // 玩家进入城池
} }
export const getChannelType = function(prefix: string) { export const getChannelType = function(prefix: string) {
@@ -187,4 +188,5 @@ export const PUSH_ROUTE = {
GVG_AREA_POINT_CHANGE: 'onMyAreaPointChange', // 积分点上的驻守人变更 GVG_AREA_POINT_CHANGE: 'onMyAreaPointChange', // 积分点上的驻守人变更
GVG_PLAYER_AREA_ADD: 'onPlayerAddToArea', // 积分点上的驻守人变更 GVG_PLAYER_AREA_ADD: 'onPlayerAddToArea', // 积分点上的驻守人变更
GVG_PLAYER_LEAVE_AREA: 'onPlayerLeaveArea', // 积分点上的驻守人变更 GVG_PLAYER_LEAVE_AREA: 'onPlayerLeaveArea', // 积分点上的驻守人变更
GVG_CITY_RANK_UPDATE: 'onGVGCityRankUpdate', // 城池积分排名
} }
+1
View File
@@ -263,6 +263,7 @@ export enum REDIS_KEY {
GVG_BATTLE_LEAGUE_RANK = "gvgBattleLeague", // 激战期联军排行榜 GVG_BATTLE_LEAGUE_RANK = "gvgBattleLeague", // 激战期联军排行榜
GVG_HISTORY_AREA ='gvgHisArea', // gvg激战期玩家加入的区域 GVG_HISTORY_AREA ='gvgHisArea', // gvg激战期玩家加入的区域
GVG_HISTORY_AREA_TEAM ='gvgHisAreaTeam', // gvg激战期玩家加入的区域 GVG_HISTORY_AREA_TEAM ='gvgHisAreaTeam', // gvg激战期玩家加入的区域
GVG_HISTORY_CITY ='gvgHisCity', // gvg激战期玩家进入的城池
} }
// 各排行榜对应hash的key // 各排行榜对应hash的key
+60 -60
View File
@@ -2,217 +2,217 @@
{ {
"id": 0, "id": 0,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "%d", "content": "%d",
"time": 24 "time": 24
}, },
{ {
"id": 1, "id": 1,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您对军团%d的申请被拒绝", "content": "您对军团%d的申请被拒绝",
"time": 24 "time": 24
}, },
{ {
"id": 2, "id": 2,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "由于被弹劾,您在军团%d的大将军职务已卸任", "content": "由于被弹劾,您在军团%d的大将军职务已卸任",
"time": 24 "time": 24
}, },
{ {
"id": 3, "id": 3,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您被任命为军团%d的大将军", "content": "您被任命为军团%d的大将军",
"time": 24 "time": 24
}, },
{ {
"id": 4, "id": 4,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您被军团%d踢出", "content": "您被军团%d踢出",
"time": 24 "time": 24
}, },
{ {
"id": 5, "id": 5,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,感谢您对军团的付出,上周的军团活跃奖励现已通过邮件发放,请查收", "content": "亲爱的百家传人,感谢您对军团的付出,上周的军团活跃奖励现已通过邮件发放,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 6, "id": 6,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您被任命为军团%d的管理", "content": "您被任命为军团%d的管理",
"time": 24 "time": 24
}, },
{ {
"id": 7, "id": 7,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您已卸任军团%d的管理", "content": "您已卸任军团%d的管理",
"time": 24 "time": 24
}, },
{ {
"id": 8, "id": 8,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您的军团已开启boss%d,请赶往支援", "content": "您的军团已开启boss%d,请赶往支援",
"time": 24 "time": 24
}, },
{ {
"id": 9, "id": 9,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "军团上下一心,已成功压制boss%d,您在此次压制中获得如下奖励:", "content": "军团上下一心,已成功压制boss%d,您在此次压制中获得如下奖励:",
"time": 720 "time": 720
}, },
{ {
"id": 10, "id": 10,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您上周军团练兵场中有奖励尚未领取,奖励如下:", "content": "您上周军团练兵场中有奖励尚未领取,奖励如下:",
"time": 720 "time": 720
}, },
{ {
"id": 11, "id": 11,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "主公,%d赠送您%d,请查收:", "content": "百家传人,%d赠送您%d,请查收:",
"time": 720 "time": 720
}, },
{ {
"id": 12, "id": 12,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,您在%d赛季结算奖励如下:", "content": "亲爱的百家传人,您在%d赛季结算奖励如下:",
"time": 720 "time": 720
}, },
{ {
"id": 13, "id": 13,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "恭喜主公,您在%d赛季最终获得了第%d名,获得如下奖励:", "content": "恭喜百家传人,您在%d赛季最终获得了第%d名,获得如下奖励:",
"time": 720 "time": 720
}, },
{ {
"id": 14, "id": 14,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,您参与军团活动奖励已通过邮件发放,请查收:", "content": "亲爱的百家传人,您参与军团活动奖励已通过邮件发放,请查收:",
"time": 720 "time": 720
}, },
{ {
"id": 15, "id": 15,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "主公很抱歉,您在拍卖行的出价已被超过,元宝退还给您,请查收:", "content": "百家传人很抱歉,您在拍卖行的出价已被超过,元宝退还给您,请查收:",
"time": 720 "time": 720
}, },
{ {
"id": 16, "id": 16,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "恭喜主公,您已在拍卖行成功拍下以下物品,请查收:", "content": "恭喜百家传人,您已在拍卖行成功拍下以下物品,请查收:",
"time": 720 "time": 720
}, },
{ {
"id": 17, "id": 17,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,您昨日的拍卖分红忘记领取了,现已通过邮件发放,请查收", "content": "亲爱的百家传人,您昨日的拍卖分红忘记领取了,现已通过邮件发放,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 18, "id": 18,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,您的背包中装备数量已满,请及时清理背包哦。溢出装备已通过邮件发放,请查收", "content": "亲爱的百家传人,您的背包中装备数量已满,请及时清理背包哦。溢出装备已通过邮件发放,请查收",
"time": 2160 "time": 2160
}, },
{ {
"id": 19, "id": 19,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,派遣任务已开始下一天的任务,前一天未完成的派遣任务已通过邮件发放,请查收", "content": "亲爱的百家传人,派遣任务已开始下一天的任务,前一天未完成的派遣任务已通过邮件发放,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 20, "id": 20,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,以下是您未领取的【月卡】每日奖励,请查收", "content": "亲爱的百家传人,以下是您未领取的【月卡】每日奖励,请查收",
"time": 2160 "time": 2160
}, },
{ {
"id": 21, "id": 21,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您的名称不合规则,已修改为默认名,这是您的补偿", "content": "您的名称不合规则,已修改为默认名,这是您的补偿",
"time": 720 "time": 720
}, },
{ {
"id": 22, "id": 22,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您军团的名称不合规则,已修改为默认名", "content": "您军团的名称不合规则,已修改为默认名",
"time": 720 "time": 720
}, },
{ {
"id": 23, "id": 23,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您在限时排行%d中达到第%d名,可获得以下奖励", "content": "您在限时排行%d中达到第%d名,可获得以下奖励",
"time": 720 "time": 720
}, },
{ {
"id": 24, "id": 24,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您昨日的军团活跃宝箱奖励没有领取,现已发送至您的邮箱,请查收", "content": "您昨日的军团活跃宝箱奖励没有领取,现已发送至您的邮箱,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 25, "id": 25,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您昨日的军团捐献所宝箱奖励没有领取,现已发送至您的邮箱,请查收", "content": "您昨日的军团捐献所宝箱奖励没有领取,现已发送至您的邮箱,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 26, "id": 26,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "感谢您昨日为军团演武台所做的贡献,且有奖励尚未领取,现已发送至您的邮箱,请查收", "content": "感谢您昨日为军团演武台所做的贡献,且有奖励尚未领取,现已发送至您的邮箱,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 27, "id": 27,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "竞技新赛季开始啦,您在上赛季的巅峰之路中有奖励尚未领取,现已发送至您邮箱,请查收", "content": "竞技新赛季开始啦,您在上赛季的巅峰之路中有奖励尚未领取,现已发送至您邮箱,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 28, "id": 28,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您昨日在招财进宝中有宝箱没有领取,现已发送至您的邮箱,请查收", "content": "您昨日在招财进宝中有宝箱没有领取,现已发送至您的邮箱,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 29, "id": 29,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "很抱歉,您的军团已被解散,振作起来寻找新的军团加入吧", "content": "很抱歉,您的军团已被解散,振作起来寻找新的军团加入吧",
"time": 720 "time": 720
}, },
{ {
"id": 30, "id": 30,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "您在今日的名将擂台中获得了第%d名,排名奖励已发送至您的邮箱,请查收", "content": "您在今日的名将擂台中获得了第%d名,排名奖励已发送至您的邮箱,请查收",
"time": 720 "time": 720
}, },
@@ -226,64 +226,64 @@
{ {
"id": 32, "id": 32,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,欢迎回来!感谢您在封测期间的支持,您在测试期间共充值%d元,现将获得%d元宝返还。请查收", "content": "亲爱的百家传人,欢迎回来!感谢您在封测期间的支持,您在测试期间共充值%d元,现将获得%d元宝返还。请查收",
"time": 720 "time": 720
}, },
{ {
"id": 33, "id": 33,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,在诸位百家传人的火热购买下,糜氏集市折上加折!您购买的%d最终达成%d折,现退还您%d元宝,请查收", "content": "亲爱的百家传人,在诸位百家传人的火热购买下,糜氏集市折上加折!您购买的%d最终达成%d折,现退还您%d元宝,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 34, "id": 34,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "主公很抱歉,您的军团已解散,请寻找新的军团加入吧", "content": "百家传人很抱歉,您的军团已解散,请寻找新的军团加入吧",
"time": 720 "time": 720
}, },
{ {
"id": 35, "id": 35,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "主公很抱歉,您的联军%d已解散", "content": "百家传人很抱歉,您的联军%d已解散",
"time": 720 "time": 720
}, },
{ {
"id": 36, "id": 36,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "主公很抱歉,您的军团已被联军%d踢出", "content": "百家传人很抱歉,您的军团已被联军%d踢出",
"time": 720 "time": 720
}, },
{ {
"id": 37, "id": 37,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,您被任命为联军%d的盟主", "content": "亲爱的百家传人,您被任命为联军%d的盟主",
"time": 720 "time": 720
}, },
{ {
"id": 38, "id": 38,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "亲爱的主公,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收", "content": "亲爱的百家传人,联军伙伴们已帮忙收取您在领地农田中的成熟粮食,您的种植奖励已发送至邮箱,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 39, "id": 39,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "激战期联军排行榜奖励", "content": "亲爱的百家传人,在您和联军成员团结一心、不懈努力下,联军在逐鹿中原激战期中表现不俗,荣获第%d名,奖励现已发送至邮箱,请查收",
"time": 720 "time": 720
}, },
{ {
"id": 40, "id": 40,
"title": "&", "title": "&",
"sendName": "您忠诚的小跟班", "sendName": "学宫驿使",
"content": "激战期个人排行榜奖励", "content": "亲爱的百家传人,逐鹿中原激战期内,您为联军做出重要贡献,荣获第%d名,奖励现已发送至邮箱,请查收",
"time": 720 "time": 720
} }
] ]