feat(破解封号): 防破解实时封号

This commit is contained in:
zhangxk
2023-07-07 15:19:09 +08:00
committed by luying
parent 43b629ee70
commit c5cb462d86
2 changed files with 90 additions and 37 deletions

View File

@@ -3,7 +3,7 @@ import { BattleRecordModel } from '../../../db/BattleRecord';
import { BattleSweepRecordModel } from '../../../db/BattleSweepRecord';
import { BattleCheatRecModel } from '../../../db/BattleCheatRec';
import { genCode, getReasonByWarType, getWarTypeName } from '../../../pubUtils/util';
import { WAR_TYPE, EVENT_STATUS, REDIS_KEY, KING_EXP_RATIO_TYPE, TA_EVENT, ITEM_CHANGE_REASON } from '../../../consts';
import { WAR_TYPE, EVENT_STATUS, REDIS_KEY, KING_EXP_RATIO_TYPE, TA_EVENT, ITEM_CHANGE_REASON, BLOCK_TYPE, CHECT_BLOCK_TYPE, CHECT_BATTLE_TYPE } from '../../../consts';
import { checkDaily, checkDailyAndIncrease } from '../../../services/dailyBattleService';
import { checkTowerWar, towerBattleEnd } from '../../../services/battleService';
import { WarReward } from '../../../services/warRewardService';
@@ -33,6 +33,7 @@ import { addItems } from '../../../services/role/rewardService';
import { treasureHuntChallengeConsume } from '../../../services/activity/treasureHuntService';
import { combineItems } from '../../../services/role/util';
import { isHeroHidden } from '../../../services/dataService';
import { getRoleOnlineInfo, redisClient, roleLeave } from '../../../services/redisService';
export default function (app: Application) {
new HandlerService(app, {});
@@ -61,7 +62,7 @@ export class NormalBattleHandler {
if (ap < warInfo.cost) {
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
}
if(role.lv < warInfo.lvLimited) {
if (role.lv < warInfo.lvLimited) {
return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH);
}
// 前置关卡是否挑战过
@@ -75,7 +76,7 @@ export class NormalBattleHandler {
let { isOK, hids, heroes, lineup } = await checkBattleHeroes(roleId, seqIds);
if (!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND);
if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN);
if (isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN);
const battleCode = genCode(8); // 关卡唯一值
let dailyNum = {};
@@ -177,7 +178,7 @@ export class NormalBattleHandler {
}
let role = await RoleModel.findByRoleId(roleId, 'lv vipStartTime warStar warCount refWarCount roleId');
let apJson = await setAp(serverId, roleId, ip, role.lv, isSuccess? -1 * warInfo.cost: 0, sid, getReasonByWarType(warInfo.warType)); // 扣除体力
let apJson = await setAp(serverId, roleId, ip, role.lv, isSuccess ? -1 * warInfo.cost : 0, sid, getReasonByWarType(warInfo.warType)); // 扣除体力
if (!apJson) {
return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
}
@@ -192,17 +193,17 @@ export class NormalBattleHandler {
let dailyNum = {};
let towerStatus = null;
let dungeonNum = {};
if(warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) {
if(!isFirst) {
let checkResult = await checkWarCountAndInc(battleId, isSuccess?1:0, role, false);
if (warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) {
if (!isFirst) {
let checkResult = await checkWarCountAndInc(battleId, isSuccess ? 1 : 0, role, false);
if (checkResult.code != 0) {
return checkResult
}
}
}
}
if (warInfo.warType == WAR_TYPE.DAILY) {
let checkResult = await checkDailyAndIncrease(roleId, warStar, battleId, isSuccess?1:0, false, stars, role);
let checkResult = await checkDailyAndIncrease(roleId, warStar, battleId, isSuccess ? 1 : 0, false, stars, role);
if (checkResult.status == -1) {
return checkResult.resResult;
}
@@ -224,7 +225,7 @@ export class NormalBattleHandler {
warReward.setFixReward(towerEndResult.data.towerReward)
}
} else if (warInfo.warType == WAR_TYPE.MYSTERY) {
let checkResult = await checkDungeonAndIncrease(roleId, isSuccess?1:0, false, battleId);
let checkResult = await checkDungeonAndIncrease(roleId, isSuccess ? 1 : 0, false, battleId);
let role = await RoleModel.saveDungeonHero(roleId, battleId, heroes, isSuccess);
if (role) {
await saveDungeonFirst(role, battleId, BattleRecord);
@@ -235,7 +236,7 @@ export class NormalBattleHandler {
}
dungeonNum = Object.assign(dungeonNum, checkResult.data)
} else if (warInfo.warType == WAR_TYPE.NORMAL) {
if(isSuccess) {
if (isSuccess) {
let role = await RoleModel.updateMainWarId(roleId, battleId, nowSeconds());
if (role) {
let r = new Rank(REDIS_KEY.MAIN_RANK, { serverId });
@@ -243,7 +244,7 @@ export class NormalBattleHandler {
}
}
} else if (warInfo.warType == WAR_TYPE.MAIN_ELITE) {
if(isSuccess) {
if (isSuccess) {
let role = await RoleModel.updateMainEliteWarId(roleId, battleId, nowSeconds());
if (role) {
let r = new Rank(REDIS_KEY.MAIN_ELITE_RANK, { serverId });
@@ -266,7 +267,7 @@ export class NormalBattleHandler {
isFirst = await challengeNewHeroGK(serverId, roleId, activityId, battleId)
}
} else if (warInfo.warType == WAR_TYPE.ACT_TREASURE_HUNT) {
if(isSuccess) {
if (isSuccess) {
await treasureHuntChallengeConsume(serverId, roleId, sid);
}
}
@@ -276,7 +277,7 @@ export class NormalBattleHandler {
if (isFirst) {
// await switchOnFunc(roleId, FUNC_OPT_TYPE.BATTLE_END, battleId, session);
warReward.setCondition(0, true);
reportTAEvent(roleId, TA_EVENT.GK_FIRST_PASS, { war_id: battleId, war_type: getWarTypeName(warInfo.warType), pass_time: Date.now(), pass_duration: nowSeconds() - getSeconds(createdAt), hero_list: dbHeroes });
reportTAEvent(roleId, TA_EVENT.GK_FIRST_PASS, { war_id: battleId, war_type: getWarTypeName(warInfo.warType), pass_time: Date.now(), pass_duration: nowSeconds() - getSeconds(createdAt), hero_list: dbHeroes });
pushMysteryFirstMsg(roleId, roleName, serverId, warInfo.warType, warInfo.war_id);
pushVestigeFirstMsg(roleId, roleName, serverId, warInfo.warType, warInfo.war_id);
}
@@ -319,7 +320,7 @@ export class NormalBattleHandler {
let sid = session.get('sid');
let serverId = session.get('serverId');
let ip = session.get('ip');
let warInfo = gameData.war.get(battleId);
if (!warInfo) {
return resResult(STATUS.BATTLE_MISS_INFO);
@@ -331,13 +332,13 @@ export class NormalBattleHandler {
return resResult(STATUS.BATTLE_SWEEP_CONDITION_STAR);
}
let role = await RoleModel.findByRoleId(roleId, 'lv warCount refWarCount roleId');
if(role.lv < warInfo.lvLimited) {
if (role.lv < warInfo.lvLimited) {
return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH);
}
// 扫荡次数
let dailyNum = {};
let dungeonNum = {};
if(warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) {
if (warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) {
let checkResult = await checkWarCountAndInc(battleId, count, role, true);
if (checkResult.code != 0) {
return checkResult
@@ -383,7 +384,7 @@ export class NormalBattleHandler {
return resResult(STATUS.SUCCESS, {
battleId, count,
battleGoods: result,
battleGoods: result,
dailyNum, dungeonNum,
...actordata
});
@@ -432,11 +433,11 @@ export class NormalBattleHandler {
let vipStartTime: number = session.get('vipStartTime');
let battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode);
if(!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) {
if (!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) {
return resResult(STATUS.WRONG_PARMS);
}
let maxRegretCnt = getVipRegretCnt(vipStartTime);
return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt||0, maxRegretCnt });
return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt || 0, maxRegretCnt });
}
// 记录悔棋次数
@@ -447,17 +448,17 @@ export class NormalBattleHandler {
let vipStartTime: number = session.get('vipStartTime');
let battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode);
if(!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) {
if (!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) {
return resResult(STATUS.WRONG_PARMS);
}
let maxRegretCnt = getVipRegretCnt(vipStartTime);
let regretCnt = battleRecord.regretCnt||0;
if(regretCnt + count > maxRegretCnt) {
let regretCnt = battleRecord.regretCnt || 0;
if (regretCnt + count > maxRegretCnt) {
return resResult(STATUS.BATTLE_REGRET_MAX);
}
battleRecord = await BattleRecordModel.incRegretCnt(battleCode, count);
return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt||0, maxRegretCnt });
return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt || 0, maxRegretCnt });
}
async getMainStarBox(msg: {}, session: BackendSession) {
@@ -471,8 +472,8 @@ export class NormalBattleHandler {
// 关卡列表
async receiveChapterBox(msg: { chapter: number, id: number, warType: number }, session: BackendSession) {
const { id, chapter, warType } = msg;
if(!isNumber(id)) return resResult(STATUS.WRONG_PARMS);
if (!isNumber(id)) return resResult(STATUS.WRONG_PARMS);
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let sid = session.get('sid');
@@ -482,18 +483,18 @@ export class NormalBattleHandler {
let rewards: RewardInter[] = [];
let star = getStarOfChapter(role.warStar, warType, chapter);
let boxIds = id == 0? gameData.mainBoxByChapter.get(`${warType}_${chapter}`): [id];
let boxIds = id == 0 ? gameData.mainBoxByChapter.get(`${warType}_${chapter}`) : [id];
for(let id of boxIds) {
for (let id of boxIds) {
let dicBox = gameData.mainBox.get(id);
if(dicBox && dicBox.chapter == chapter && dicBox.warType == warType) {
if(star >= dicBox.star && role.receivedBox.indexOf(id) == -1) {
if (dicBox && dicBox.chapter == chapter && dicBox.warType == warType) {
if (star >= dicBox.star && role.receivedBox.indexOf(id) == -1) {
rewards.push(...dicBox.reward);
ids.push(id);
}
}
}
if(ids.length <= 0) return resResult(STATUS.BATTLE_NO_BOX_CAN_RECEIVE);
if (ids.length <= 0) return resResult(STATUS.BATTLE_NO_BOX_CAN_RECEIVE);
role = await RoleModel.receivedBox(roleId, ids);
let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX)
@@ -506,7 +507,7 @@ export class NormalBattleHandler {
// 关卡列表
async receiveWarReward(msg: { chapter: number, warType: number }, session: BackendSession) {
const { chapter, warType } = msg;
let roleId = session.get('roleId');
let roleName = session.get('roleName');
let sid = session.get('sid');
@@ -515,16 +516,16 @@ export class NormalBattleHandler {
let { warStar, receivedWarIds = [] } = role;
let warIds: number[] = [];
let rewards: RewardInter[] = [];
let mainWarRewards = gameData.mainWarReward.get(`${warType}_${chapter}`)??[];
let mainWarRewards = gameData.mainWarReward.get(`${warType}_${chapter}`) ?? [];
for(let { warId, cityReward } of mainWarRewards) {
for (let { warId, cityReward } of mainWarRewards) {
let index = warStar.findIndex(cur => cur.id == warId);
if(index != -1 && receivedWarIds.indexOf(warId) == -1) {
if (index != -1 && receivedWarIds.indexOf(warId) == -1) {
rewards.push(...cityReward);
warIds.push(warId);
}
}
if(warIds.length <= 0) return resResult(STATUS.BATTLE_NO_WAR_REWARD_CAN_RECEIVE);
if (warIds.length <= 0) return resResult(STATUS.BATTLE_NO_WAR_REWARD_CAN_RECEIVE);
role = await RoleModel.receiveWarRewards(roleId, warIds);
let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX)
@@ -543,6 +544,47 @@ export class NormalBattleHandler {
if (!rec) {
return resResult(STATUS.BATTLE_CHECK_REC_SAVE_ERR);
}
await this.blockByRecordBattleCheat(roleId, type);
return resResult(STATUS.SUCCESS);
}
/**
* 防破解实时封号
* @param {string} roleId
* @param {number} type 查封类型(封除类型不为200)
* @returns
*/
async blockByRecordBattleCheat(roleId: string, type: number) {
if (type && type === CHECT_BATTLE_TYPE) {
// console.log("blockByRecordBattleCheat----type=", type);
return;
}
// 设置redis开关
const isCheckBlock = await redisClient().getAsync(REDIS_KEY.IS_CHECT_BLOCK);
if (!isCheckBlock || isCheckBlock == undefined) {
await redisClient().setAsync(REDIS_KEY.IS_CHECT_BLOCK, `${CHECT_BLOCK_TYPE.OPEN}`);;
}
if (isCheckBlock && parseInt(isCheckBlock) != CHECT_BLOCK_TYPE.OPEN) {
console.log("blockByRecordBattleCheat-防破解查封功能已关闭!!!");
return;
}
const blockType: BLOCK_TYPE = BLOCK_TYPE.BLOCK;
const blockReason: string = "使用第三方软件, 封停账号, 封停时间为:" + new Date();;
let role = await RoleModel.updateRoleInfo(roleId, { blockType, blockReason });
if (!role) return resResult(STATUS.ROLE_NOT_FOUND);
let { isOnline, sid } = await getRoleOnlineInfo(roleId);
if (isOnline) {
await this.app.rpc.connector.connectorRemote.setOtherUserSession.toServer(sid, [{ roleId, blockType }]);
await this.app.rpc.connector.connectorRemote.remoteLogin.toServer(sid, roleId, STATUS.BLOCKED);
await roleLeave(roleId);
}
return;
}
}

View File

@@ -26,6 +26,8 @@ export const PUSH_INTERVAL = 5 * 1000; // 分批时间5秒一批
export const CLOSE_LOGIN_WHEN_ONLINE_MAX = 1; // 是否在服务器达到最大在线人数限制时关闭登录
export const MAX_ONLINE_USER_COUNT = 100000; // 最大在线人数限制
export const CHECT_BATTLE_TYPE = 200; //非异常战斗类型
export enum TIME_OUTPUT_TYPE {
DATE = 1,
STAMP_10 = 2,
@@ -277,6 +279,9 @@ export enum REDIS_KEY {
PUBLIC_ACCOUNT_GIFT = 'pubAccGiftChannel', // 公众号频道
SEND_GIFT_CODE = 'sendGiftCodeChannel', // 礼包码频道
MAX_ONLINE_USERS = 'maxOnlineUsers', // 最高在线人数限制
IS_CHECT_BLOCK = 'isCheckBlock', // 防破解检测封号开关0-开1-关
}
// 各排行榜对应hash的key
@@ -1321,4 +1326,10 @@ export enum TEAM_TYPE {
LADDER = 2, // 名将擂台
VESTIGE = 3, // 遗迹
GVG_BATTLE = 4, // 激战期
}
// 异常战斗封号开关
export enum CHECT_BLOCK_TYPE{
OPEN = 0, //开
CLOSE = 1, //关
}