排行榜:奖励显示首通信息
This commit is contained in:
@@ -10,6 +10,7 @@ import { reloadResources } from '../../../pubUtils/data';
|
||||
import { GeneralRankParam } from '../../../domain/rank';
|
||||
import { getAllGuildActivityStatus } from '../../../services/guildActivityService';
|
||||
import { MailParam } from '../../../domain/roleField/mail';
|
||||
import { RankFirstType } from '../../../db/RankFirst';
|
||||
|
||||
export default function (app: Application) {
|
||||
new HandlerService(app, {});
|
||||
@@ -188,12 +189,12 @@ export class ChatRemote {
|
||||
* @description 全服推送排行榜更新信息
|
||||
* @param serverId
|
||||
*/
|
||||
public async sendRankTopUpdated(serverId: number, rank: GeneralRankParam & { general: number }) {
|
||||
public async sendRankTopUpdated(serverId: number, ranks: (RankFirstType & {status: number})[]) {
|
||||
|
||||
let roomId = groupRoomId(CHANNEL_PREFIX.WORLD, serverId);
|
||||
let channel = this.channelService.getChannel(roomId, false);
|
||||
if (!channel) return;
|
||||
channel.pushMessage(this.RANK_TOP_UPDATE, resResult(STATUS.SUCCESS, { rank }));
|
||||
channel.pushMessage(this.RANK_TOP_UPDATE, resResult(STATUS.SUCCESS, { ranks }));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -697,7 +697,7 @@ export class GuildHandler {
|
||||
const sid = session.get('sid');
|
||||
const { code, id } = msg;
|
||||
|
||||
const guild = await GuildModel.findByCode(code, serverId, 'lv structure');
|
||||
const guild = await GuildModel.findByCode(code, serverId, 'lv structure activeWeekly lvUpdateTime');
|
||||
if (!guild) {
|
||||
return resResult(STATUS.GUILD_NOT_FOUND);
|
||||
}
|
||||
@@ -717,13 +717,13 @@ export class GuildHandler {
|
||||
}
|
||||
const cost = getStructureConsume(id, curStructure.lv);
|
||||
|
||||
const result = await GuildModel.upStructure(code, id, cost, 'code fund structure lv name');
|
||||
const result = await GuildModel.upStructure(code, id, cost, 'code fund structure lv activeWeekly lvUpdateTime name');
|
||||
if (!result) {
|
||||
return resResult(STATUS.GUILD_FUND_NOT_ENOUGH);
|
||||
}
|
||||
if (id == GUILD_STRUCTURE.ARMY_CENTER) {
|
||||
let r = new Rank(REDIS_KEY.GUILD_LV_RANK, { serverId });
|
||||
await r.setRankWithGuildInfo2(code, guild.lv, guild.activeWeekly, guild.lvUpdateTime, guild);
|
||||
await r.setRankWithGuildInfo2(code, result.lv, result.activeWeekly, result.lvUpdateTime, result);
|
||||
}
|
||||
|
||||
const resultStructure = result.structure.find(cur => cur.id == id);
|
||||
|
||||
@@ -4,7 +4,7 @@ import { STATUS, RANK_TYPE_TO_KEY, ROLE_SELECT, RANK_TYPE, HERO_SELECT, GUILD_SE
|
||||
import { RoleModel } from "../../../db/Role";
|
||||
import { UserGuildModel } from "../../../db/UserGuild";
|
||||
import { GuildModel } from "../../../db/Guild";
|
||||
import { Rank, getGeneralRank } from "../../../services/rankService";
|
||||
import { Rank, getGeneralRank, getRankFirstReward } from "../../../services/rankService";
|
||||
import { nowSeconds } from "../../../pubUtils/timeUtil";
|
||||
import { gameData } from "../../../pubUtils/data";
|
||||
import { addItems } from "../../../services/rewardService";
|
||||
@@ -34,6 +34,20 @@ export class RoleHandler {
|
||||
return resResult(STATUS.SUCCESS, { ranks });
|
||||
}
|
||||
|
||||
|
||||
async getRankReward(msg: {}, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
let roleName = session.get('roleName');
|
||||
let serverId = session.get('serverId');
|
||||
|
||||
let role = await RoleModel.findByRoleId(roleId, 'rankReceived');
|
||||
if (!role) return resResult(STATUS.WRONG_PARMS);
|
||||
|
||||
let ranks = await getRankFirstReward(role, serverId);
|
||||
|
||||
return resResult(STATUS.SUCCESS, { ranks });
|
||||
}
|
||||
|
||||
async getRank(msg: { type: number }, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
let serverId = session.get('serverId');
|
||||
|
||||
@@ -58,7 +58,9 @@ export class RoleHandler {
|
||||
}
|
||||
await createHero.createWithInitInfo(infos, initInfos.figureInfo);
|
||||
await createHero.pushMessage(pinus, sid);
|
||||
console.log('updateRedisRank before', Date.now())
|
||||
await createHero.updateRedisRank(Rank);
|
||||
console.log('updateRedisRank after', Date.now())
|
||||
let heroes = createHero.getResultHeroes();
|
||||
|
||||
console.log('****** createHeroes after', Date.now())
|
||||
|
||||
@@ -4,6 +4,7 @@ import { reloadResources } from '../../../pubUtils/data';
|
||||
import { HeroUpdate } from '../../../db/Hero';
|
||||
import { RoleUpdate } from '../../../db/Role';
|
||||
import { SkinUpdate } from '../../../db/Skin';
|
||||
import { RankFirstModel, RankFirstType } from '../../../db/RankFirst';
|
||||
import { getInitRoleInfo } from '../../../pubUtils/roleUtil';
|
||||
import { DEFAULT_HEROES } from '../../../consts';
|
||||
import { Figure } from '../../../domain/dbGeneral';
|
||||
@@ -18,12 +19,35 @@ export class RoleRemote {
|
||||
this.app = app;
|
||||
this.channelService = app.get('channelService');
|
||||
this.setInitRole();
|
||||
this.loadRankFirst();
|
||||
}
|
||||
private channelService: ChannelService;
|
||||
private initHeroes: Map<number, HeroUpdate> = new Map(); // hid => hero
|
||||
private initRole: RoleUpdate = {};
|
||||
private initSkins: Map<number, SkinUpdate> = new Map(); // hid => skin
|
||||
private figureInfo: {heads: Figure[], frames: Figure[], spines: Figure[]};
|
||||
private rankFirstRewards: Map<number, Map<number, RankFirstType>> = new Map();
|
||||
|
||||
private async loadRankFirst() {
|
||||
let rankFirstRewards = await RankFirstModel.findAllRankRewards();
|
||||
for(let rank of rankFirstRewards) {
|
||||
if(!this.rankFirstRewards.has(rank.serverId)) {
|
||||
this.rankFirstRewards.set(rank.serverId, new Map());
|
||||
}
|
||||
this.rankFirstRewards.get(rank.serverId).set(rank.id, rank);
|
||||
}
|
||||
}
|
||||
|
||||
public setRankFirst(rank: RankFirstType) {
|
||||
if(!this.rankFirstRewards.has(rank.serverId)) {
|
||||
this.rankFirstRewards.set(rank.serverId, new Map());
|
||||
}
|
||||
this.rankFirstRewards.get(rank.serverId).set(rank.id, rank);
|
||||
}
|
||||
|
||||
public getRankFirstById(serverId: number, id: number) {
|
||||
return this.rankFirstRewards.get(serverId)?.get(id);
|
||||
}
|
||||
|
||||
public setInitRole() {
|
||||
let result = getInitRoleInfo();
|
||||
|
||||
@@ -10,7 +10,7 @@ import { FrontendOrBackendSession, pinus } from 'pinus';
|
||||
import { resResult } from '../pubUtils/util';
|
||||
import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE } from '../consts';
|
||||
import { getAllShopList } from './shopService';
|
||||
import { getGeneralRank } from './rankService';
|
||||
import { getGeneralRank, getRankFirstReward } from './rankService';
|
||||
import { getFriendList, getApplyList } from './friendService';
|
||||
import { getDailyBattleList } from './dailyBattleService';
|
||||
import { getExpeditionStatus } from './expeditionService';
|
||||
@@ -77,7 +77,8 @@ async function getModuleData(type: string, data: { role: RoleType, session: Fron
|
||||
case 'shop': // 商店
|
||||
return await getAllShopList(roleId);
|
||||
case 'rank': // 排名
|
||||
return await getGeneralRank(role, serverId);
|
||||
const rewards = await getRankFirstReward(role, serverId);
|
||||
return { rewards }
|
||||
case 'mail': // 邮件
|
||||
return await getMails(roleId, serverId);
|
||||
case 'friend': // 好友
|
||||
|
||||
@@ -10,6 +10,9 @@ import { gameData } from "../pubUtils/data";
|
||||
import { nowSeconds } from "../pubUtils/timeUtil";
|
||||
import { getWorldChannelSid } from "./chatChannelService";
|
||||
import { pinus } from "pinus";
|
||||
import ts = require("typescript");
|
||||
import { RankFirstModel, RankFirstType, RankFirstUpdateParam } from "../db/RankFirst";
|
||||
import { getRandSingleEelm } from "../pubUtils/util";
|
||||
|
||||
|
||||
/**
|
||||
@@ -61,8 +64,7 @@ export class Rank {
|
||||
case REDIS_KEY.GUILD_LV_RANK:
|
||||
this.valueConfig = [
|
||||
new ValueConfig(true, 'lv', 0, false, false),
|
||||
new ValueConfig(false, 'active', 5, false, false),
|
||||
new ValueConfig(false, 'time', 10, true, true)
|
||||
new ValueConfig(false, 'active', 5, false, false)
|
||||
];
|
||||
break;
|
||||
default:
|
||||
@@ -844,22 +846,45 @@ export class Rank {
|
||||
}
|
||||
|
||||
private async checkMyRankAndPush(myId: myIdInter, oldScore: number, newScore: number) {
|
||||
if (this.isInit) return;
|
||||
let ts = this;
|
||||
if (ts.isInit) return;
|
||||
let myRank = await this.getMyRank(myId);
|
||||
console.log('*******', ts.key, myRank, newScore, oldScore);
|
||||
if (myRank == 1 && newScore > oldScore) {
|
||||
let serverId = this.keyName.serverId;
|
||||
let sid = await getWorldChannelSid(serverId);
|
||||
for (let { id, general } of gameData.rank) {
|
||||
let dicRank = gameData.rank.find(({ id }) => {
|
||||
let redisKey = RANK_TYPE_TO_KEY.get(id);
|
||||
if (redisKey == this.key) {
|
||||
let r = new Rank(redisKey, { serverId }, false, 1);
|
||||
let ranks = <RoleRankInfo[]>await r.getRankByRange();
|
||||
if (ranks.length > 0) {
|
||||
let param = new GeneralRankParam(id, ranks[0] || new RoleRankInfo({}, false), general);
|
||||
pinus.app.rpc.chat.chatRemote.sendRankTopUpdated.toServer(sid, serverId, { ...param, general });
|
||||
return redisKey == ts.key
|
||||
});
|
||||
console.log('*******', dicRank);
|
||||
if(dicRank) {
|
||||
let r = new Rank(ts.key, { serverId }, false, 1);
|
||||
let ranks = await r.getRankByRange();
|
||||
let rankFirstRecs: (RankFirstType & { status: number })[] = [];
|
||||
if(ranks.length > 0 && ranks[0]) {
|
||||
let userInfo: RankParam, guildInfo: GuildRankParam;
|
||||
if(ranks[0] instanceof RoleRankInfo) {
|
||||
userInfo = ranks[0];
|
||||
}
|
||||
if(ranks[0] instanceof GuildRankInfo) {
|
||||
guildInfo = ranks[0];
|
||||
}
|
||||
|
||||
break;
|
||||
for(let [id, { rankId, condition }] of gameData.generalRankReward) {
|
||||
console.log(rankId, dicRank.id, oldScore, condition, newScore);
|
||||
if(dicRank.id == rankId && oldScore < condition && newScore >= condition) {
|
||||
let rankFirstRec = await RankFirstModel.createRankFirst(serverId, id, rankId, { userInfo, guildInfo });
|
||||
let roleServers = pinus.app.getServersByType('role');
|
||||
for(let server of roleServers) {
|
||||
pinus.app.rpc.role.roleRemote.setRankFirst.toServer(server.id, rankFirstRec);
|
||||
}
|
||||
rankFirstRecs.push({ ... rankFirstRec, status: 1});
|
||||
}
|
||||
}
|
||||
}
|
||||
if(rankFirstRecs.length > 0) {
|
||||
pinus.app.rpc.chat.chatRemote.sendRankTopUpdated.toServer(sid, serverId, rankFirstRecs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1017,4 +1042,31 @@ export async function getGeneralRank(role: RoleType & { rankReceived: number[] }
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取排行榜总览
|
||||
* @param role 玩家数据
|
||||
* @param serverId 所在服务器
|
||||
*/
|
||||
export async function getRankFirstReward(role: RoleType & { rankReceived: number[] }, serverId: number) {
|
||||
let { rankReceived = [] } = role;
|
||||
|
||||
let result: (RankFirstUpdateParam & {status: number})[] = [];
|
||||
|
||||
for (let [id, { rankId: type } ] of gameData.generalRankReward) {
|
||||
let roleServers = pinus.app.getServersByType('role');
|
||||
let curServer = roleServers.find(cur => cur.id == pinus.app.getServerId());
|
||||
if(!curServer) {
|
||||
curServer = getRandSingleEelm(roleServers);
|
||||
}
|
||||
let rankFirst = await pinus.app.rpc.role.roleRemote.getRankFirstById.toServer(curServer.id, serverId, id);
|
||||
if(rankFirst) {
|
||||
let status = rankReceived.includes(id)?2: 1;
|
||||
result.push({...rankFirst, status});
|
||||
} else {
|
||||
result.push({ id, type, status: 0 });
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user