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

This commit is contained in:
zhangxk
2023-07-07 16:35:48 +08:00
committed by luying
parent 43b629ee70
commit c5cb462d86
2 changed files with 90 additions and 37 deletions
@@ -3,7 +3,7 @@ import { BattleRecordModel } from '../../../db/BattleRecord';
import { BattleSweepRecordModel } from '../../../db/BattleSweepRecord'; import { BattleSweepRecordModel } from '../../../db/BattleSweepRecord';
import { BattleCheatRecModel } from '../../../db/BattleCheatRec'; import { BattleCheatRecModel } from '../../../db/BattleCheatRec';
import { genCode, getReasonByWarType, getWarTypeName } from '../../../pubUtils/util'; 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 { checkDaily, checkDailyAndIncrease } from '../../../services/dailyBattleService';
import { checkTowerWar, towerBattleEnd } from '../../../services/battleService'; import { checkTowerWar, towerBattleEnd } from '../../../services/battleService';
import { WarReward } from '../../../services/warRewardService'; import { WarReward } from '../../../services/warRewardService';
@@ -33,6 +33,7 @@ import { addItems } from '../../../services/role/rewardService';
import { treasureHuntChallengeConsume } from '../../../services/activity/treasureHuntService'; import { treasureHuntChallengeConsume } from '../../../services/activity/treasureHuntService';
import { combineItems } from '../../../services/role/util'; import { combineItems } from '../../../services/role/util';
import { isHeroHidden } from '../../../services/dataService'; import { isHeroHidden } from '../../../services/dataService';
import { getRoleOnlineInfo, redisClient, roleLeave } from '../../../services/redisService';
export default function (app: Application) { export default function (app: Application) {
new HandlerService(app, {}); new HandlerService(app, {});
@@ -61,7 +62,7 @@ export class NormalBattleHandler {
if (ap < warInfo.cost) { if (ap < warInfo.cost) {
return resResult(STATUS.BATTLE_ACTION_POINT_LACK); 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); return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH);
} }
// 前置关卡是否挑战过 // 前置关卡是否挑战过
@@ -75,7 +76,7 @@ export class NormalBattleHandler {
let { isOK, hids, heroes, lineup } = await checkBattleHeroes(roleId, seqIds); let { isOK, hids, heroes, lineup } = await checkBattleHeroes(roleId, seqIds);
if (!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); 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); // 关卡唯一值 const battleCode = genCode(8); // 关卡唯一值
let dailyNum = {}; let dailyNum = {};
@@ -177,7 +178,7 @@ export class NormalBattleHandler {
} }
let role = await RoleModel.findByRoleId(roleId, 'lv vipStartTime warStar warCount refWarCount roleId'); 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) { if (!apJson) {
return resResult(STATUS.BATTLE_ACTION_POINT_LACK); return resResult(STATUS.BATTLE_ACTION_POINT_LACK);
} }
@@ -192,9 +193,9 @@ export class NormalBattleHandler {
let dailyNum = {}; let dailyNum = {};
let towerStatus = null; let towerStatus = null;
let dungeonNum = {}; 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) {
if(!isFirst) { if (!isFirst) {
let checkResult = await checkWarCountAndInc(battleId, isSuccess?1:0, role, false); let checkResult = await checkWarCountAndInc(battleId, isSuccess ? 1 : 0, role, false);
if (checkResult.code != 0) { if (checkResult.code != 0) {
return checkResult return checkResult
} }
@@ -202,7 +203,7 @@ export class NormalBattleHandler {
} }
if (warInfo.warType == WAR_TYPE.DAILY) { 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) { if (checkResult.status == -1) {
return checkResult.resResult; return checkResult.resResult;
} }
@@ -224,7 +225,7 @@ export class NormalBattleHandler {
warReward.setFixReward(towerEndResult.data.towerReward) warReward.setFixReward(towerEndResult.data.towerReward)
} }
} else if (warInfo.warType == WAR_TYPE.MYSTERY) { } 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); let role = await RoleModel.saveDungeonHero(roleId, battleId, heroes, isSuccess);
if (role) { if (role) {
await saveDungeonFirst(role, battleId, BattleRecord); await saveDungeonFirst(role, battleId, BattleRecord);
@@ -235,7 +236,7 @@ export class NormalBattleHandler {
} }
dungeonNum = Object.assign(dungeonNum, checkResult.data) dungeonNum = Object.assign(dungeonNum, checkResult.data)
} else if (warInfo.warType == WAR_TYPE.NORMAL) { } else if (warInfo.warType == WAR_TYPE.NORMAL) {
if(isSuccess) { if (isSuccess) {
let role = await RoleModel.updateMainWarId(roleId, battleId, nowSeconds()); let role = await RoleModel.updateMainWarId(roleId, battleId, nowSeconds());
if (role) { if (role) {
let r = new Rank(REDIS_KEY.MAIN_RANK, { serverId }); let r = new Rank(REDIS_KEY.MAIN_RANK, { serverId });
@@ -243,7 +244,7 @@ export class NormalBattleHandler {
} }
} }
} else if (warInfo.warType == WAR_TYPE.MAIN_ELITE) { } else if (warInfo.warType == WAR_TYPE.MAIN_ELITE) {
if(isSuccess) { if (isSuccess) {
let role = await RoleModel.updateMainEliteWarId(roleId, battleId, nowSeconds()); let role = await RoleModel.updateMainEliteWarId(roleId, battleId, nowSeconds());
if (role) { if (role) {
let r = new Rank(REDIS_KEY.MAIN_ELITE_RANK, { serverId }); let r = new Rank(REDIS_KEY.MAIN_ELITE_RANK, { serverId });
@@ -266,7 +267,7 @@ export class NormalBattleHandler {
isFirst = await challengeNewHeroGK(serverId, roleId, activityId, battleId) isFirst = await challengeNewHeroGK(serverId, roleId, activityId, battleId)
} }
} else if (warInfo.warType == WAR_TYPE.ACT_TREASURE_HUNT) { } else if (warInfo.warType == WAR_TYPE.ACT_TREASURE_HUNT) {
if(isSuccess) { if (isSuccess) {
await treasureHuntChallengeConsume(serverId, roleId, sid); await treasureHuntChallengeConsume(serverId, roleId, sid);
} }
} }
@@ -276,7 +277,7 @@ export class NormalBattleHandler {
if (isFirst) { if (isFirst) {
// await switchOnFunc(roleId, FUNC_OPT_TYPE.BATTLE_END, battleId, session); // await switchOnFunc(roleId, FUNC_OPT_TYPE.BATTLE_END, battleId, session);
warReward.setCondition(0, true); 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); pushMysteryFirstMsg(roleId, roleName, serverId, warInfo.warType, warInfo.war_id);
pushVestigeFirstMsg(roleId, roleName, serverId, warInfo.warType, warInfo.war_id); pushVestigeFirstMsg(roleId, roleName, serverId, warInfo.warType, warInfo.war_id);
} }
@@ -331,13 +332,13 @@ export class NormalBattleHandler {
return resResult(STATUS.BATTLE_SWEEP_CONDITION_STAR); return resResult(STATUS.BATTLE_SWEEP_CONDITION_STAR);
} }
let role = await RoleModel.findByRoleId(roleId, 'lv warCount refWarCount roleId'); 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); return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH);
} }
// 扫荡次数 // 扫荡次数
let dailyNum = {}; let dailyNum = {};
let dungeonNum = {}; 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); let checkResult = await checkWarCountAndInc(battleId, count, role, true);
if (checkResult.code != 0) { if (checkResult.code != 0) {
return checkResult return checkResult
@@ -383,7 +384,7 @@ export class NormalBattleHandler {
return resResult(STATUS.SUCCESS, { return resResult(STATUS.SUCCESS, {
battleId, count, battleId, count,
battleGoods: result, battleGoods: result,
dailyNum, dungeonNum, dailyNum, dungeonNum,
...actordata ...actordata
}); });
@@ -432,11 +433,11 @@ export class NormalBattleHandler {
let vipStartTime: number = session.get('vipStartTime'); let vipStartTime: number = session.get('vipStartTime');
let battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode); 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); return resResult(STATUS.WRONG_PARMS);
} }
let maxRegretCnt = getVipRegretCnt(vipStartTime); 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 vipStartTime: number = session.get('vipStartTime');
let battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode); 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); return resResult(STATUS.WRONG_PARMS);
} }
let maxRegretCnt = getVipRegretCnt(vipStartTime); let maxRegretCnt = getVipRegretCnt(vipStartTime);
let regretCnt = battleRecord.regretCnt||0; let regretCnt = battleRecord.regretCnt || 0;
if(regretCnt + count > maxRegretCnt) { if (regretCnt + count > maxRegretCnt) {
return resResult(STATUS.BATTLE_REGRET_MAX); return resResult(STATUS.BATTLE_REGRET_MAX);
} }
battleRecord = await BattleRecordModel.incRegretCnt(battleCode, count); 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) { async getMainStarBox(msg: {}, session: BackendSession) {
@@ -471,7 +472,7 @@ export class NormalBattleHandler {
// 关卡列表 // 关卡列表
async receiveChapterBox(msg: { chapter: number, id: number, warType: number }, session: BackendSession) { async receiveChapterBox(msg: { chapter: number, id: number, warType: number }, session: BackendSession) {
const { id, chapter, warType } = msg; 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 roleId = session.get('roleId');
let roleName = session.get('roleName'); let roleName = session.get('roleName');
@@ -482,18 +483,18 @@ export class NormalBattleHandler {
let rewards: RewardInter[] = []; let rewards: RewardInter[] = [];
let star = getStarOfChapter(role.warStar, warType, chapter); 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); let dicBox = gameData.mainBox.get(id);
if(dicBox && dicBox.chapter == chapter && dicBox.warType == warType) { if (dicBox && dicBox.chapter == chapter && dicBox.warType == warType) {
if(star >= dicBox.star && role.receivedBox.indexOf(id) == -1) { if (star >= dicBox.star && role.receivedBox.indexOf(id) == -1) {
rewards.push(...dicBox.reward); rewards.push(...dicBox.reward);
ids.push(id); 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); role = await RoleModel.receivedBox(roleId, ids);
let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX) let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX)
@@ -515,16 +516,16 @@ export class NormalBattleHandler {
let { warStar, receivedWarIds = [] } = role; let { warStar, receivedWarIds = [] } = role;
let warIds: number[] = []; let warIds: number[] = [];
let rewards: RewardInter[] = []; 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); 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); rewards.push(...cityReward);
warIds.push(warId); 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); role = await RoleModel.receiveWarRewards(roleId, warIds);
let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX) let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX)
@@ -543,6 +544,47 @@ export class NormalBattleHandler {
if (!rec) { if (!rec) {
return resResult(STATUS.BATTLE_CHECK_REC_SAVE_ERR); return resResult(STATUS.BATTLE_CHECK_REC_SAVE_ERR);
} }
await this.blockByRecordBattleCheat(roleId, type);
return resResult(STATUS.SUCCESS); 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;
}
} }
+11
View File
@@ -26,6 +26,8 @@ export const PUSH_INTERVAL = 5 * 1000; // 分批时间,5秒一批
export const CLOSE_LOGIN_WHEN_ONLINE_MAX = 1; // 是否在服务器达到最大在线人数限制时关闭登录 export const CLOSE_LOGIN_WHEN_ONLINE_MAX = 1; // 是否在服务器达到最大在线人数限制时关闭登录
export const MAX_ONLINE_USER_COUNT = 100000; // 最大在线人数限制 export const MAX_ONLINE_USER_COUNT = 100000; // 最大在线人数限制
export const CHECT_BATTLE_TYPE = 200; //非异常战斗类型
export enum TIME_OUTPUT_TYPE { export enum TIME_OUTPUT_TYPE {
DATE = 1, DATE = 1,
STAMP_10 = 2, STAMP_10 = 2,
@@ -277,6 +279,9 @@ export enum REDIS_KEY {
PUBLIC_ACCOUNT_GIFT = 'pubAccGiftChannel', // 公众号频道 PUBLIC_ACCOUNT_GIFT = 'pubAccGiftChannel', // 公众号频道
SEND_GIFT_CODE = 'sendGiftCodeChannel', // 礼包码频道 SEND_GIFT_CODE = 'sendGiftCodeChannel', // 礼包码频道
MAX_ONLINE_USERS = 'maxOnlineUsers', // 最高在线人数限制 MAX_ONLINE_USERS = 'maxOnlineUsers', // 最高在线人数限制
IS_CHECT_BLOCK = 'isCheckBlock', // 防破解检测封号开关,0-开,1-关
} }
// 各排行榜对应hash的key // 各排行榜对应hash的key
@@ -1322,3 +1327,9 @@ export enum TEAM_TYPE {
VESTIGE = 3, // 遗迹 VESTIGE = 3, // 遗迹
GVG_BATTLE = 4, // 激战期 GVG_BATTLE = 4, // 激战期
} }
// 异常战斗封号开关
export enum CHECT_BLOCK_TYPE{
OPEN = 0, //开
CLOSE = 1, //关
}