From 3c380f1e55e0384f52ab5abe31a602f260e77068 Mon Sep 17 00:00:00 2001 From: ciniao <4041990@qq.com> Date: Wed, 3 Jan 2024 10:36:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gameLog.ts | 28 +++++- src/oss/watchdog.json | 7 ++ src/public/scheduler/scheduler.ts | 1 + src/public/scheduler/scheduler_watchdog.ts | 107 +++++++++++++++++++++ src/public/wzry.ts | 2 +- src/setStartAfther.ts | 2 + 6 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 src/oss/watchdog.json create mode 100644 src/public/scheduler/scheduler_watchdog.ts diff --git a/src/gameLog.ts b/src/gameLog.ts index 9242fb2..6f1ca12 100644 --- a/src/gameLog.ts +++ b/src/gameLog.ts @@ -1,8 +1,8 @@ import { Db, MongoClient } from "mongodb"; import { Logger } from "tsrpc"; -let logDB:Db; -let errorLogDB:Db; +export let logDB:Db; +export let errorLogDB:Db; /** * 是否是G123的测试服 @@ -11,7 +11,7 @@ function isG123stg(){ return G.config.mongodbUrl.indexOf('.stg.')!=-1; } -async function connGameLogDB() { +export async function connGameLogDB() { console.log('connect gamelog mongodb ......'); let logDBUrl:string; if(G.config.isG123){ @@ -73,6 +73,28 @@ async function addErrorLog(errData:any){ } } +export async function addWatchDogLog(data:object[]){ + try{ + //g123测试版连接不上db,不抓取 + if(!data)return; + if(isG123stg())return; + let log = { + serverId : G.config.serverId, + pid : process.pid, + cTime : Math.floor(Date.now()/1000) + } + data.map(item=>{ + Object.assign(item,log) + }) + if(!errorLogDB){ + await connGameLogDB(); + } + errorLogDB.collection('nodeJsErrorLog').insertMany(data); + }catch(e){ + console.error('addWatchDogLog',e); + } +} + /** * 增加游戏日志 * @param uid 玩家uid diff --git a/src/oss/watchdog.json b/src/oss/watchdog.json new file mode 100644 index 0000000..9c21692 --- /dev/null +++ b/src/oss/watchdog.json @@ -0,0 +1,7 @@ +[ + { + "key":"task/Open", + "limit":0, + "tips":"任务打开次数超过3次" + } +] \ No newline at end of file diff --git a/src/public/scheduler/scheduler.ts b/src/public/scheduler/scheduler.ts index a8b93a7..071f19f 100644 --- a/src/public/scheduler/scheduler.ts +++ b/src/public/scheduler/scheduler.ts @@ -38,6 +38,7 @@ export type schedulerType = | 'hbzb_zbs_group' | 'wzry_zuanshi16to8' | "cross_email_pull" + | "watch_dog" | "xiaofeijingsai_local_ctor"; export class SchedulerManage { diff --git a/src/public/scheduler/scheduler_watchdog.ts b/src/public/scheduler/scheduler_watchdog.ts new file mode 100644 index 0000000..1b04b5c --- /dev/null +++ b/src/public/scheduler/scheduler_watchdog.ts @@ -0,0 +1,107 @@ +import { resolve } from "path"; +import { PublicShared } from "../../shared/public/public"; +import {Scheduler, schedulerType} from "./scheduler"; +import { existsSync, readFileSync } from "fs"; +import { addWatchDogLog, errorLogDB } from "../../gameLog"; + +export class WatchDog extends Scheduler { + id: schedulerType = "watch_dog"; + time = 420; // 监控频率,每x秒一次 + name = "数据看门狗" + type = "" + + async read() { + await this.ctorStartTime(); + this.isReady = false; + this.startTime = this.nextTime; + + this.start(); + } + + async start() { + let confFile = resolve(__dirname, '../../oss/watchdog.json'); + if (!existsSync(confFile)) { + //配置文件不存在 + await this.ctorStartTime() + return; + } + let conf; + try{ + conf = await JSON.parse(readFileSync(confFile, 'utf-8')); + }catch(e){ + //配置文件不是json + await this.ctorStartTime() + return; + } + //获取今天0点之后在线的玩家 + let users = await G.mongodb.collection("user").find({ + lv : {$gt:10}, + newonlinetime:{$gt: PublicShared.getToDayZeroTime() } + },{ + projection:{ + uid:1, + name:1, + lv:1, + vip:1, + sid:1 + } + }).toArray(); + + if(!users.length){ + //没有符合的玩家 + await this.ctorStartTime() + return; + } + + let uids = users.map(i => i.uid); + let uinfo = {}; + users.map(i => uinfo[i.uid] = i); + + let actionLogs = await G.mongodb.collection("actionLog").find({ + type:'day', + uid: {$in: uids}, + },{ + projection:{ + uid:1, + log:1 + } + }).toArray(); + + let warns = []; + for(let j=0;j= conf[j].limit ){ + //触发了警报 + warns.push({ + type:'watchDog', + uid: uid, + name: uinfo[uid]?.name, + lv: uinfo[uid]?.lv, + vip: uinfo[uid]?.vip, + key: key, + value: myval, + tips: conf[j].tips + }) + } + } + } + + if(warns.length>0){ + addWatchDogLog(warns); + } + + await this.ctorStartTime() + } + + get nextTime(): number { + return G.time + this.time; + } + + async ctorStartTime() { + this.isStart = false; + this.startTime = this.nextTime; + } +} \ No newline at end of file diff --git a/src/public/wzry.ts b/src/public/wzry.ts index 02e848b..efb036d 100644 --- a/src/public/wzry.ts +++ b/src/public/wzry.ts @@ -40,7 +40,7 @@ export class WangZheRongYaofun { /**获取报名人数 */ static async getBaoMingNum() { let zkey: string = PublicShared.getToWeek(); - let _num = G.mongodb.collection('playerInfo', 'wzry').countDocuments({ isbm: 1 }); + let _num = G.mongodb.collection('playerInfo', 'wzry').countDocuments({ type:'wzry', isbm: 1 }); return _num; } diff --git a/src/setStartAfther.ts b/src/setStartAfther.ts index f0ca5c4..7541cfb 100644 --- a/src/setStartAfther.ts +++ b/src/setStartAfther.ts @@ -29,6 +29,7 @@ import { SchedulerManage } from './public/scheduler/scheduler'; import {CrossEmailPull} from "./public/scheduler/scheduler_cross_email_pull"; import {Scheduler_xfjs_Local_Ctor} from "./public/scheduler/scheduler_xiaofeijingsai"; import { RankKfjs_1, RankKfjs_2, RankKfjs_3, RankKfjs_4, RankKfjs_5, RankKfjs_6, RankKfjs_7 } from './public/rank/rank_kfjs'; +import { WatchDog } from './public/scheduler/scheduler_watchdog'; export async function startAfter() { //事件监听和定时器初始化 @@ -93,6 +94,7 @@ export async function startAfter() { // new SchedulerWzrycrossEmail(); new CrossEmailPull().init() + new WatchDog().init(); }); new SchedulerNewDayLocalCtor().init();