Files
ZYZ/game-server/app/servers/guild/handler/gateActivityHandler.ts
2021-03-18 11:59:53 +08:00

186 lines
7.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Application, BackendSession, ChannelService } from "pinus";
import { setMedianCe, getMedianCe, getGuildActivityStatus, getRecordScore } from "../../../services/guildActivityService";
import { resResult } from "../../../pubUtils/util";
import { STATUS, GUILD_ACTIVITY_TYPE } from "../../../consts";
import { GameModel } from "../../../db/Game";
import { ServerlistModel } from "../../../db/Serverlist";
import { UserGuildActivityRecModel, Record } from "../../../db/UserGuildActivityRec";
import { UserGuildModel } from "../../../db/UserGuild";
import { GUILDACTIVITY } from "../../../pubUtils/dicParam";
import { GuildActivityRecordModel } from "../../../db/GuildActivityRec";
import { RoleModel, RoleType } from "../../../db/Role";
import { GuildModel } from "../../../db/Guild";
import { RankParam, GuildRankParam } from "../../../domain/rank";
import { setRank, getGuildKeyName, getRankScore, getRank, getUnionRank } from "../../../services/redisService";
import { REDIS_KEY } from "../../../consts";
export default function (app: Application) {
return new GateActivityHandler(app);
}
export class GateActivityHandler {
channelService: ChannelService;
constructor(private app: Application) {
this.channelService = app.get('channelService');
}
private gateHp: Map<string, number> = new Map(); // 城门血条,每个军团有一条血条
private members: Map<string, Array<string>> = new Map(); // 每个军团参与的成员
private aid = GUILD_ACTIVITY_TYPE.GATE_ACTIVITY; // 蛮夷入侵id
// 进入蛮夷入侵界面
async getGateActivity(msg: {}, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const serverId = session.get('serverId');
const guildCode = session.get('guildCode');
let statusResult = getGuildActivityStatus(this.aid);
if(!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid);
if(!guildActivityRec) return resResult(STATUS.INTERNAL_ERR);
let { code: sourceCode } = guildActivityRec;
let myGuildActivityRec = await UserGuildActivityRecModel.getRecord(roleId, roleName, guildCode, serverId, sourceCode, [], this.aid);
let { challengeCnt } = myGuildActivityRec;
// TODO 处理多余字段
let {ranks: guildRank, myRank: myGuildRank} = await getUnionRank(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode, 10);
let {ranks: memberRank, myRank: myMemberRank} = await getRank(getGuildKeyName(REDIS_KEY.USER_GUILD_ACTIVITY, guildCode), serverId, roleId);
if(!myGuildRank) {
let guild = await GuildModel.findByCode(guildCode, serverId, 'name');
myGuildRank = {
rank: 0,
code: guildCode,
name: guild.name,
num: 0
}
}
if(!myMemberRank) {
myMemberRank = {
rank: 0,
roleId,
roleName,
num: 0
}
}
return resResult(STATUS.SUCCESS, {
...statusResult,
challengeCnt: GUILDACTIVITY.GATEACTIVITY_CHALLENGE_TIMES - challengeCnt,
guildRank, myGuildRank,
memberRank, myMemberRank
})
}
// 开启挑战
async checkBattle(msg: { heroes: number[] }, session: BackendSession) {
let { heroes } = msg;
if(!heroes || heroes.length <= 0) return resResult(STATUS.WRONG_PARMS);
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const serverId = session.get('serverId');
const guildCode = session.get('guildCode');
if(!guildCode) return resResult(STATUS.GUILD_AUTH_NOT_ENOUGH);
let statusResult = getGuildActivityStatus(this.aid);
if(!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let guildActivityRec = await GuildActivityRecordModel.getRecord(guildCode, serverId, this.aid);
if(!guildActivityRec) return resResult(STATUS.INTERNAL_ERR);
let { code: sourceCode } = guildActivityRec;
let myGuildActivityRec = await UserGuildActivityRecModel.getRecord(roleId, roleName, guildCode, serverId, sourceCode, heroes, this.aid);
let { code, challengeCnt } = myGuildActivityRec;
// 返回当前军团总军功
let guildScore = await getRankScore(REDIS_KEY.GUILD_ACTIVITY, serverId, guildCode);
// 城门血条
let gateHp = this.gateHp.get(guildCode)||GUILDACTIVITY.GATEACTIVITY_GATEHP;
// 前一天中位数战力
let medianCe = await getMedianCe(serverId);
return resResult(STATUS.SUCCESS, {
code,
...statusResult,
guildScore: guildScore||0,
myScore: 0,
gateHp,
challengeCnt: GUILDACTIVITY.GATEACTIVITY_CHALLENGE_TIMES - challengeCnt,
medianCe
});
}
// 上报玩家获得军功
async action(msg: { code: string, record: { round: number, dataId: number }[] }, session: BackendSession) {
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let guildCode = session.get('guildCode');
let serverId = session.get('serverId');
let { code, record } = msg;
let statusResult = getGuildActivityStatus(this.aid);
if(!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND);
// 计算record内得分
// TODO 防刷分,应加入记录玩家操作
let scoreResult = getRecordScore(this.aid, record);
if(!scoreResult) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let { score, newRecords } = scoreResult;
// 更新redis数据
let role = await RoleModel.findByRoleId(roleId);
let { lv, vLv, head, frame, spine, title } = role;
let userParam = new RankParam(roleName, lv, vLv, head, frame, spine, title);
let myScore = await setRank(getGuildKeyName(REDIS_KEY.USER_GUILD_ACTIVITY, guildCode), serverId, guildCode, score, Date.now(), userParam);
let guild = await GuildModel.findByCode(guildCode, serverId);
let leader = <RoleType>guild.leader;
let params = new GuildRankParam(guild.icon, guild.name, guild.lv, leader);
let guildScore = await setRank(REDIS_KEY.GUILD_ACTIVITY, serverId, guild.code, 0, Date.now(), params, true);
// 更新数据库
let rec = await UserGuildActivityRecModel.pushRecord(code, newRecords);
let gateHp = this.gateHp.get(guildCode)||GUILDACTIVITY.GATEACTIVITY_GATEHP;
return resResult(STATUS.SUCCESS, {
code: rec.code,
...statusResult,
guildScore: guildScore||0,
myScore: myScore||0,
gateHp
});
}
// 上报敌军攻打城门情况
async hitGate(msg: {}, session: BackendSession) {
}
// 结束挑战
async battleEnd(msg: { count: number }, session: BackendSession) {
}
// TODO debug接口可以不用
async newServer() {
let serverlist = await GameModel.getAllServerList();
for(let server of serverlist) {
await ServerlistModel.newServer(server.id, server.serverType, {...server});
}
}
async test() {
let result = await setMedianCe();
return resResult(STATUS.SUCCESS, {result});
}
}