添加排行榜
This commit is contained in:
@@ -11,6 +11,7 @@ import { STATUS } from '../consts/statusCode';
|
||||
import { HangUpSpdUpRecModel } from '../db/HangUpSpdUpRec';
|
||||
import { TowerTaskRecModel } from '../db/TowerTaskRec';
|
||||
import { setRank } from './redisService';
|
||||
import { RankParam } from '../pubUtils/interface';
|
||||
|
||||
export async function checkTowerWar(roleId: string, battleId: number, heroes: Array<number>) {
|
||||
const battleIdStr = `${battleId}`;
|
||||
@@ -71,8 +72,9 @@ export async function towerBattleEnd(sid: string, roleId: string, serverId: numb
|
||||
if (inc === 1) {
|
||||
let role = await RoleModel.towerLvUp(roleId);
|
||||
// 更新redis
|
||||
let { roleName, towerLv, towerUpTime, lv, vLv } = role;
|
||||
await setRank(REDIS_KEY.TOWER_RANK, serverId, roleId, towerLv, towerUpTime.getTime(), {roleName, lv, vLv, guildName:"", head: "zhaoyun"});
|
||||
let { roleName, towerLv, towerUpTime, lv, vLv, headHid, sHid, title } = role;
|
||||
let rankRank = new RankParam(roleName, lv, vLv, headHid, sHid, title);
|
||||
await setRank(REDIS_KEY.TOWER_RANK, serverId, roleId, towerLv, towerUpTime.getTime(), rankRank);
|
||||
|
||||
const nextTowerInfo = getTowerDataByLv(towerLv + 1);
|
||||
if (nextTowerInfo) {
|
||||
|
||||
@@ -3,14 +3,15 @@
|
||||
*/
|
||||
import { PvpDefenseModel, Heroes, OppPlayers, Robot, PvpDefenseType, HeroScores } from '../db/PvpDefense';
|
||||
import { RoleType } from '../db/Role';
|
||||
import { PVP_HERO_POS, ROBOT_NAME } from '../consts';
|
||||
import { PVP_HERO_POS, ROBOT_NAME, REDIS_KEY } from '../consts';
|
||||
|
||||
import { dicPvpOpponent, DicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent";
|
||||
import { getRandomIndexByLen, genCode, getRandomByLen } from '../pubUtils/util';
|
||||
import { oppPlayersInter } from '../pubUtils/interface';
|
||||
import { oppPlayersInter, RankParam } from '../pubUtils/interface';
|
||||
import { gameData, getPLvByScore } from "../pubUtils/data";
|
||||
import { PVP } from '../pubUtils/dicParam';
|
||||
import { SystemConfigModel } from '../db/SystemConfig'
|
||||
import { setRank, getMyRank } from './redisService';
|
||||
const _ = require('underscore');
|
||||
|
||||
|
||||
@@ -33,7 +34,12 @@ export async function initPvpInfo(role: RoleType) {
|
||||
let {warId, seasonNum } = await SystemConfigModel.findSystemConfig();
|
||||
let challengeCnt = PVP.PVP_CHALLENGE_COUNTS;
|
||||
let result = await PvpDefenseModel.createPvpDefense({ roleId: role.roleId, roleName: role.roleName, role: role._id, heroes, oppPlayers, defCe: role.topFiveCe, seasonNum, warId, challengeCnt });
|
||||
//加入排行榜 TODO
|
||||
|
||||
//加入排行榜
|
||||
let { roleId, roleName, lv, vLv, headHid, sHid, title } = role;
|
||||
let params = new RankParam(roleName, lv, vLv, headHid, sHid, title);
|
||||
await setRank(REDIS_KEY.PVP_RANK, 0, roleId, result.score, result.updatedAt.getTime(), params);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -51,7 +57,7 @@ export async function checkPvp(role: RoleType) {
|
||||
* @param oppPlayers pvpDefense表中的oppPlayers字段,需要populate过的
|
||||
* @param pLv 玩家本人的队伍等级
|
||||
*/
|
||||
export function getEnemies(oppPlayers: OppPlayers[], winStreakNum: number) {
|
||||
export async function getEnemies(oppPlayers: OppPlayers[], winStreakNum: number) {
|
||||
let result = new Array<oppPlayersInter>();
|
||||
for(let {pos, isRobot, oppDef, robot} of oppPlayers) {
|
||||
let dicOpponent = dicPvpOpponent.get(pos);
|
||||
@@ -68,10 +74,11 @@ export function getEnemies(oppPlayers: OppPlayers[], winStreakNum: number) {
|
||||
let role = <RoleType>opp.role;
|
||||
let { roleId, roleName, headHid, sHid } = role;
|
||||
let { pLv, defCe } = opp;
|
||||
let rankLv = await getMyRank(REDIS_KEY.PVP_RANK, 0, roleId);
|
||||
result.push({
|
||||
pos, roleId, roleName, headHid, sHid, pLv, defCe,
|
||||
addScore: dicOpponent.score,
|
||||
rankLv: 0, // TODO读取排名
|
||||
rankLv, // 读取排名
|
||||
plusScore: getPlusScore(winStreakNum)
|
||||
});
|
||||
}
|
||||
@@ -108,7 +115,9 @@ async function matchPlayer(oppPlayers: OppPlayers[], roleId: string, pLv: number
|
||||
let result = range[index];
|
||||
if(!result) return false;
|
||||
if(result.roleId == roleId) {
|
||||
console.log(range.length)
|
||||
range.splice(index, 1);
|
||||
console.log(JSON.stringify(range))
|
||||
if(range.length <= 0) return false;
|
||||
index = getRandomIndexByLen(range.length);
|
||||
result = range[index];
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import { GOOD_QUALITY } from './../consts';
|
||||
import { RoleModel } from "../db/Role";
|
||||
import { RoleModel, RoleType } from "../db/Role";
|
||||
import * as Redis from 'redis';
|
||||
import {REDIS_KEY} from '../consts'
|
||||
import { GameModel } from "../db/Game";
|
||||
import { promisifyAll } from 'bluebird';
|
||||
import { pinus } from 'pinus';
|
||||
import { PvpDefenseModel } from '../db/PvpDefense';
|
||||
import { RankParam } from '../pubUtils/interface';
|
||||
|
||||
/**
|
||||
* 在服务重新启动时,将信息存入redis
|
||||
@@ -13,6 +15,7 @@ export async function initAllRank() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
const serverList = await GameModel.getAllServerList();
|
||||
await client.delAsync(REDIS_KEY.USER_INFO);
|
||||
await client.delAsync(REDIS_KEY.PVP_RANK);
|
||||
for(let {id} of serverList) {
|
||||
await client.delAsync(getKeyName(REDIS_KEY.TOWER_RANK, id));
|
||||
await initRank(id);
|
||||
@@ -23,13 +26,27 @@ export async function initRank(serverId: number) {
|
||||
// console.log('*****', 'initRank')
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
await client.expireAsync(getKeyName(REDIS_KEY.TOWER_RANK, serverId), 30 * 24 * 60 * 60);
|
||||
await client.expireAsync(REDIS_KEY.PVP_RANK, 30 * 24 * 60 * 60);
|
||||
await client.expireAsync(REDIS_KEY.USER_INFO, 30 * 24 * 60 * 60);
|
||||
|
||||
let ranks = await RoleModel.getRank('tower', serverId, ['roleId', 'roleName', 'towerLv', 'lv', 'vLv']);
|
||||
for(let {towerLv, roleId, roleName, lv, vLv, towerUpTime} of ranks) {
|
||||
let ranks = await RoleModel.getRank('tower', serverId, ['roleId', 'roleName', 'towerLv', 'lv', 'vLv', 'headHid', 'sHid', 'title', 'updatedAt']);
|
||||
for(let {towerLv, roleId, roleName, lv, vLv, towerUpTime, headHid, sHid, title} of ranks) {
|
||||
// console.log(roleId);
|
||||
await client.zaddAsync(getKeyName(REDIS_KEY.TOWER_RANK, serverId), encodeScoreWithTime(towerLv, towerUpTime?towerUpTime.getTime():0), roleId);
|
||||
await redisUserInfoAdd(roleId, {roleName, lv, vLv, guildName:"", head: "zhaoyun"});
|
||||
let rankPram = new RankParam(roleName, lv, vLv, headHid, sHid, title);
|
||||
await redisUserInfoAdd(roleId, rankPram);
|
||||
}
|
||||
let pvpRank = await PvpDefenseModel.getRank();
|
||||
for(let {roleId, role: _role, score, updatedAt } of pvpRank) {
|
||||
let role = <RoleType>_role;
|
||||
let { roleName, headHid, sHid, title, lv, vLv } = role;
|
||||
await client.zaddAsync(getKeyName(REDIS_KEY.PVP_RANK), encodeScoreWithTime(score, updatedAt?updatedAt.getTime():0), roleId);
|
||||
|
||||
const hasCurUser = await client.hexistsAsync(REDIS_KEY.USER_INFO, roleId);
|
||||
if(!hasCurUser) {
|
||||
let rankPram = new RankParam(roleName, lv, vLv, headHid, sHid, title);
|
||||
await redisUserInfoAdd(roleId, rankPram);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,8 +57,12 @@ export async function existsRank(key: string, serverId: number) {
|
||||
return result;
|
||||
}
|
||||
|
||||
export function getKeyName(key: string, serverId: number) {
|
||||
return `${key}:${serverId}`;
|
||||
export function getKeyName(key: string, serverId?: number) {
|
||||
if(serverId) {
|
||||
return `${key}:${serverId}`;
|
||||
} else {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
|
||||
// 更新玩家信息
|
||||
@@ -58,21 +79,21 @@ export async function redisUserInfoUpdate(roleId: string, arr: Array<{field: str
|
||||
}
|
||||
|
||||
// 添加玩家信息缓存
|
||||
export async function redisUserInfoAdd(roleId: string, params: {roleName: string, lv: number, vLv: number, guildName: string, head: string}) {
|
||||
export async function redisUserInfoAdd(roleId: string, params: RankParam) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let value = JSON.stringify(params);
|
||||
return await client.hsetAsync(REDIS_KEY.USER_INFO, roleId, value);
|
||||
}
|
||||
|
||||
// 更新排行榜
|
||||
export async function setRank(key: string, serverId: number, roleId: string, score: number, timestamp: number, params: {roleName: string, lv: number, vLv: number, guildName: string, head: string}) {
|
||||
// 更新排行榜, 如pvp这样跨服的,serverId传0
|
||||
export async function setRank(key: string, serverId: number, roleId: string, score: number, timestamp: number, params: RankParam, limit = 100) {
|
||||
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
// 更新分数
|
||||
const _score = encodeScoreWithTime(score, timestamp);
|
||||
await client.zaddAsync(getKeyName(key, serverId), _score, roleId);
|
||||
// 移除100名以外
|
||||
await client.zremrangebyrankAsync(getKeyName(key, serverId), 100, 10000);
|
||||
await client.zremrangebyrankAsync(getKeyName(key, serverId), limit, 10000);
|
||||
// 如果没有信息,更新玩家信息
|
||||
const hasCurUser = await client.hexistsAsync(REDIS_KEY.USER_INFO, roleId);
|
||||
if(!hasCurUser) {
|
||||
@@ -99,16 +120,23 @@ export async function getRank(key: string, serverId: number, roleId: string) {
|
||||
return {ranks, myRank}
|
||||
}
|
||||
|
||||
// 获取我的排名
|
||||
export async function getMyRank(key: string, serverId: number, roleId: string) {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
let myRank = await client.zrevrankAsync(getKeyName(key, serverId), roleId);
|
||||
return myRank + 1;
|
||||
}
|
||||
|
||||
// 有序排行综合时间和得分排序
|
||||
function encodeScoreWithTime(score: number, timestamp: number): number {
|
||||
// value = score * Math.power(10, 14) + max_time - timestamp
|
||||
let timelen = 13;
|
||||
let timelen = 10;
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
return score * pow + pow - 1 - timestamp
|
||||
return score * pow + pow - 1 - Math.floor(timestamp/1000)
|
||||
}
|
||||
|
||||
function decodeScoreWithTime(num: string): number {
|
||||
let timelen = 13;
|
||||
let timelen = 10;
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
let _num = parseInt(num);
|
||||
return Math.floor(_num/pow);
|
||||
@@ -184,7 +212,7 @@ export async function checkRoleInQueue(roleId: string, sid: string, qualityArr:
|
||||
export async function clearComBtlQueue() {
|
||||
const client: Redis.RedisClient = pinus.app.get('redis');
|
||||
for (let q of GOOD_QUALITY) {
|
||||
client.delAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`);
|
||||
await client.delAsync(`${REDIS_KEY.COM_TEAM_SEARCH_PRE}${q}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user