feat(破解封号): 防破解实时封号
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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, //关
|
||||
}
|
||||
Reference in New Issue
Block a user