军团活动:排行榜&军功上报
This commit is contained in:
@@ -10,7 +10,7 @@ import { SystemConfigModel } from '../db/SystemConfig';
|
||||
import { GuildRankParam, GuildLeader, RankParam } from '../domain/rank';
|
||||
import { GuildModel } from '../db/Guild';
|
||||
import { comBtlRanges } from '../pubUtils/gamedata';
|
||||
import { stringify } from 'querystring';
|
||||
import { getNextHourPoint } from '../pubUtils/timeUtil';
|
||||
/**
|
||||
* 在服务重新启动时,将信息存入redis
|
||||
*/
|
||||
@@ -103,14 +103,28 @@ export async function existsRank(key: string, serverId: number) {
|
||||
return result;
|
||||
}
|
||||
|
||||
export function getKeyName(key: string, serverId?: number) {
|
||||
|
||||
/**
|
||||
* 获得redis key的名字
|
||||
* @param key REDIS_KEY中配置的key
|
||||
* @param serverId 服务器id
|
||||
* @param plus 后面再加
|
||||
*/
|
||||
export function getKeyName(key: string, serverId?: number, plus: string = '') {
|
||||
let newKey = '';
|
||||
if(serverId) {
|
||||
return `${key}:${serverId}`;
|
||||
newKey = `${key}:${serverId}`;
|
||||
} else {
|
||||
return key;
|
||||
newKey = key;
|
||||
}
|
||||
|
||||
if(plus) {
|
||||
newKey += `:${plus}`;
|
||||
}
|
||||
return newKey;
|
||||
}
|
||||
|
||||
|
||||
// 更新玩家信息
|
||||
export async function redisUserInfoUpdate(key: string, roleId: string, arr: Array<{field: string, value:(string|number|GuildLeader)}>) {
|
||||
let params = await redisClient().hgetAsync(key, roleId);
|
||||
@@ -129,16 +143,31 @@ export async function redisUserInfoAdd(key: string, roleId: string, params: Rank
|
||||
return await redisClient().hsetAsync(key, roleId, value);
|
||||
}
|
||||
|
||||
// 更新排行榜, 如pvp这样跨服的,serverId传0
|
||||
export async function setRank(key: string, serverId: number, myId: string, score: number, timestamp: number, params: RankParam|GuildRankParam, limit = 100) {
|
||||
/**
|
||||
* 更新排行榜
|
||||
* @param key 配置在REDIS_KEY中的key
|
||||
* @param serverId 区服id 如pvp这样跨服的,serverId传0
|
||||
* @param myId 玩家roleId或军团code
|
||||
* @param score 得分
|
||||
* @param timestamp 时间 13位时间戳
|
||||
* @param params 玩家数据
|
||||
* @param isAtom 是否是原子性的更新
|
||||
* @param limit
|
||||
*/
|
||||
export async function setRank(key: string, serverId: number, myId: string, score: number, timestamp: number, params: RankParam|GuildRankParam, isAtom = false, limit = 100) {
|
||||
|
||||
// 更新分数
|
||||
const _score = encodeScoreWithTime(score, timestamp);
|
||||
await redisClient().zaddAsync(getKeyName(key, serverId), _score, myId);
|
||||
let newScore = score;
|
||||
if(isAtom) {
|
||||
newScore = await updateRankAtom(key, serverId, myId, score, timestamp);
|
||||
} else {
|
||||
const _score = encodeScoreWithTime(score, timestamp);
|
||||
await redisClient().zaddAsync(getKeyName(key, serverId), _score, myId);
|
||||
}
|
||||
// 移除100名以外
|
||||
await redisClient().zremrangebyrankAsync(getKeyName(key, serverId), limit, 10000);
|
||||
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key);
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key)||REDIS_KEY.USER_INFO;
|
||||
// 如果没有信息,更新玩家信息
|
||||
const hasCurUser = await redisClient().hexistsAsync(infoKey, myId);
|
||||
if(!hasCurUser) {
|
||||
@@ -148,12 +177,12 @@ export async function setRank(key: string, serverId: number, myId: string, score
|
||||
}
|
||||
|
||||
// 获取排行榜
|
||||
export async function getRank(key: string, serverId: number, roleId: string) {
|
||||
export async function getRank(key: string, serverId: number, roleId: string, limit = 100) {
|
||||
|
||||
let ranks = [], myRank = null;
|
||||
const rankFromDb = await redisClient().zrevrangebyscoreAsync(getKeyName(key, serverId), '+inf', '-inf', "WITHSCORES", "LIMIT", 0, 100);
|
||||
const rankFromDb = await redisClient().zrevrangebyscoreAsync(getKeyName(key, serverId), '+inf', '-inf', "WITHSCORES", "LIMIT", 0, limit);
|
||||
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key);
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key)||REDIS_KEY.USER_INFO;
|
||||
|
||||
for(let ii = 0; ii < rankFromDb.length; ii+=2) {
|
||||
const _roleId = rankFromDb[ii];
|
||||
@@ -496,6 +525,20 @@ async function setServerList() {
|
||||
}
|
||||
}
|
||||
|
||||
export async function getAllServers() {
|
||||
let servers = await redisClient().hgetallAsync(REDIS_KEY.DB_GAME);
|
||||
let serverlist = new Array<number>();
|
||||
for(let serverStr in servers) {
|
||||
let arr = serverStr.split('_');
|
||||
let serverId = parseInt(arr[1]);
|
||||
|
||||
if(!isNaN(serverId) && !serverlist.includes(serverId)) {
|
||||
serverlist.push(serverId);
|
||||
}
|
||||
}
|
||||
return serverlist;
|
||||
}
|
||||
|
||||
export async function getServerName(serverType: string, serverId: number) {
|
||||
let name = await redisClient().hgetAsync(REDIS_KEY.DB_GAME, `${serverType}_${serverId}`);
|
||||
return name
|
||||
@@ -506,4 +549,96 @@ function redisClient() {
|
||||
return client;
|
||||
}
|
||||
|
||||
/**************** 数据库表end */
|
||||
/**************** 数据库表end */
|
||||
|
||||
/**************** 军团活动排行 */
|
||||
|
||||
/**
|
||||
* 更新排行榜(将得分和时间拆分开)
|
||||
* @param key 配置在REDIS_KEY中的key
|
||||
* @param serverId 区服id
|
||||
* @param field 玩家id/军团id
|
||||
* @param score 得分
|
||||
* @param time 事件
|
||||
*/
|
||||
async function updateRankAtom(key: string, serverId: number, field: string, score: number, timestamp: number) {
|
||||
let originKey = getKeyName(key, serverId);
|
||||
let timeKey = getKeyName(key, serverId, 'time');
|
||||
await redisClient().expireatAsync(originKey, getNextHourPoint(5));
|
||||
await redisClient().expireatAsync(timeKey, getNextHourPoint(5));
|
||||
|
||||
let timelen = 10;
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
|
||||
let newScore = await redisClient().zincrbyAsync(originKey, score, field);
|
||||
await redisClient().zaddAsync(timeKey, pow - 1 - Math.floor(timestamp/1000), field);
|
||||
return newScore;
|
||||
}
|
||||
|
||||
async function generateUnionRank(key: string, serverId: number) {
|
||||
let unionKey = getKeyName(key, serverId, 'union'); // 联合的key
|
||||
let existsKey = await redisClient().existsAsync(unionKey);
|
||||
if(!existsKey) {
|
||||
await redisClient().expireatAsync(unionKey, 10); // 10秒更新一次
|
||||
let originKey = getKeyName(key, serverId);
|
||||
let timeKey = getKeyName(key, serverId, 'time');
|
||||
|
||||
let timelen = 10;
|
||||
let pow = Math.pow(10, timelen + 1);
|
||||
await redisClient().zunionstoreAsync(unionKey, 2, originKey, timeKey, 'WEIGHTS', pow, 1);
|
||||
}
|
||||
return unionKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用updateRankAtom更新的排行榜,使用这个方法获取列表
|
||||
* @param key 配置在REDIS_KEY中的key
|
||||
* @param serverId 区服id
|
||||
* @param roleId 自己的id
|
||||
*/
|
||||
export async function getUnionRank(key: string, serverId: number, roleId: string, limit = 100) {
|
||||
|
||||
let ranks = [], myRank = null;
|
||||
let unionKey = await generateUnionRank(key, serverId);
|
||||
const rankFromDb = await redisClient().zrevrangebyscoreAsync(unionKey, '+inf', '-inf', "WITHSCORES", "LIMIT", 0, limit);
|
||||
|
||||
let infoKey = REDIS_RANK_TO_INFO.get(key)||REDIS_KEY.USER_INFO;
|
||||
|
||||
for(let ii = 0; ii < rankFromDb.length; ii+=2) {
|
||||
const _roleId = rankFromDb[ii];
|
||||
const _score = decodeScoreWithTime(rankFromDb[ii + 1]);
|
||||
const info = await redisClient().hgetAsync(infoKey, _roleId);
|
||||
const _userInfo = JSON.parse(info);
|
||||
const tmp = {..._userInfo, num: _score, rank: Math.floor(ii/2)+1};
|
||||
if(infoKey == REDIS_KEY.USER_INFO) {
|
||||
tmp["roleId"] = _roleId;
|
||||
} else if(infoKey == REDIS_KEY.GUILD_INFO) {
|
||||
tmp["code"] = _roleId;
|
||||
}
|
||||
ranks.push(tmp);
|
||||
if(roleId == _roleId) myRank = tmp;
|
||||
}
|
||||
return {ranks, myRank}
|
||||
}
|
||||
|
||||
// 获取我的排名
|
||||
export async function getMyUnionRank(key: string, serverId: number, roleId: string) {
|
||||
let unionKey = await generateUnionRank(key, serverId);
|
||||
let myRank = await redisClient().zrevrankAsync(unionKey, roleId);
|
||||
return myRank + 1;
|
||||
}
|
||||
|
||||
export async function getRankScore(key: string, serverId: number, field: string) {
|
||||
let score = await redisClient().zscoreAsync(getKeyName(key, serverId), field);
|
||||
return score;
|
||||
}
|
||||
|
||||
/**
|
||||
* 按军团名拼接key
|
||||
* @param key
|
||||
* @param guildCode 军团编号
|
||||
*/
|
||||
export function getGuildKeyName(key: string, guildCode: string) {
|
||||
return `${key}:${guildCode}`;
|
||||
}
|
||||
/**************** 军团活动排行end */
|
||||
Reference in New Issue
Block a user