update/filter out false positives in combat log detection
This commit is contained in:
4 files changed
+39
-4
No files matched your search
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "dayzr-bot",
|
"name": "dayzr-bot",
|
||||||
"version": "10.3.5",
|
"version": "10.3.6",
|
||||||
"description": "A General Purpose Discord Bot for DayZ Nitrado Servers.",
|
"description": "A General Purpose Discord Bot for DayZ Nitrado Servers.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"nodemonConfig": {
|
"nodemonConfig": {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const mongoose = require('mongoose');
|
|||||||
// custom util imports
|
// custom util imports
|
||||||
const { DownloadNitradoFile, CheckServerStatus } = require('../util/NitradoAPI');
|
const { DownloadNitradoFile, CheckServerStatus } = require('../util/NitradoAPI');
|
||||||
const { HandlePlayerLogs, HandleActivePlayersList } = require('../util/LogsHandler');
|
const { HandlePlayerLogs, HandleActivePlayersList } = require('../util/LogsHandler');
|
||||||
const { HandleKillfeed } = require('../util/KillfeedHandler');
|
const { HandleKillfeed, UpdateLastDeathDate } = require('../util/KillfeedHandler');
|
||||||
const { HandleExpiredUAVs, HandleEvents } = require('../util/AlarmsHandler');
|
const { HandleExpiredUAVs, HandleEvents } = require('../util/AlarmsHandler');
|
||||||
|
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
@@ -155,6 +155,7 @@ class DayzRBot extends Client {
|
|||||||
if (!(i + 1 >= lines.length) && lines[i + 1].includes('killed by') && lines[i].includes('TransportHit')) s = await HandleKillfeed(this, guildId, s, lines[i]) // Handles vehicle deaths
|
if (!(i + 1 >= lines.length) && lines[i + 1].includes('killed by') && lines[i].includes('TransportHit')) s = await HandleKillfeed(this, guildId, s, lines[i]) // Handles vehicle deaths
|
||||||
if (!(i + 1 >= lines.length) && lines[i + 1].includes('killed by Player') && lines[i].includes('hit by Player')) s = await HandleKillfeed(this, guildId, s, lines[i]); // Handles regular deaths
|
if (!(i + 1 >= lines.length) && lines[i + 1].includes('killed by Player') && lines[i].includes('hit by Player')) s = await HandleKillfeed(this, guildId, s, lines[i]); // Handles regular deaths
|
||||||
if (lines[i].includes('killed by Player') && !lines[i - 1].includes('hit by Player')) s = await HandleKillfeed(this, guildId, s, lines[i]); // Handles deaths missing hit by log
|
if (lines[i].includes('killed by Player') && !lines[i - 1].includes('hit by Player')) s = await HandleKillfeed(this, guildId, s, lines[i]); // Handles deaths missing hit by log
|
||||||
|
if (lines[i].includes('killed by Zmb') || lines[i].includes('>) died.')) s = await UpdateLastDeathDate(this, s, lines[i]); // Updates users last death date for non PVP deaths.
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const [channel_id, data] of Object.entries(this.alarmPingQueue)) {
|
for (const [channel_id, data] of Object.entries(this.alarmPingQueue)) {
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ module.exports = {
|
|||||||
if (diffSeconds > (data.combatLogTimer * 60)) return;
|
if (diffSeconds > (data.combatLogTimer * 60)) return;
|
||||||
if (data.lastDamageDate <= data.lastDeathDate) return;
|
if (data.lastDamageDate <= data.lastDeathDate) return;
|
||||||
|
|
||||||
// If lastHitBy (attacker) died to this player or another,
|
// If lastHitBy (attacker) died after shooting this player
|
||||||
// then it does not count as combat logging, (the combat ended)
|
// then it does not count as combat logging, (the combat ended due to death)
|
||||||
let attacker = guild.playerstats.find(stat => stat.gamertag = data.lastHitBy);
|
let attacker = guild.playerstats.find(stat => stat.gamertag = data.lastHitBy);
|
||||||
if (attacker.lastDeathDate > data.lastDamageDate) return;
|
if (attacker.lastDeathDate > data.lastDamageDate) return;
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,33 @@ const Vehicles = {
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
||||||
|
// Update last death date for non PVP deaths
|
||||||
|
UpdateLastDeathDate: async (client, stats, line) => {
|
||||||
|
let killedByZmb = /(.*) \| Player \"(.*)\" \(DEAD\) \(id=(.*) pos=<(.*)>) killed by (.*)/g;
|
||||||
|
let diedTemplate = /(.*) \| Player \"(.*)\" \(DEAD\) \(id=(.*) pos=<(.*)>) died. Stats> Water: (.*) Energy: (.*) Bleed sources: (.*)/g;
|
||||||
|
|
||||||
|
let data = line.includes('>) died.') ? [...line.matchAll(diedTemplate)][0] : [...line.matchAll(killedByZmb)][0];
|
||||||
|
if (!data) return stats;
|
||||||
|
|
||||||
|
let info = {
|
||||||
|
time: data[1],
|
||||||
|
victim: data[2],
|
||||||
|
victimID: data[3],
|
||||||
|
victimPOS: data[4].split(', ').map(v => parseFloat(v)),
|
||||||
|
};
|
||||||
|
|
||||||
|
const newDt = await client.getDateEST(info.time);
|
||||||
|
|
||||||
|
let victimStat = stats.find(stat => stat.playerID == info.victimID);
|
||||||
|
let victimStatIndex = stats.indexOf(victimStat);
|
||||||
|
if (victimStat == undefined) victimStat = client.getDefaultPlayerStats(info.victim, info.victimID);
|
||||||
|
victimStat.lastDeathDate = newDt;
|
||||||
|
if (victimStatIndex == -1) stats.push(victimStat);
|
||||||
|
else stats[victimStatIndex] = victimStat;
|
||||||
|
|
||||||
|
return stats;
|
||||||
|
},
|
||||||
|
|
||||||
HandleKillfeed: async (client, guildId, stats, line) => {
|
HandleKillfeed: async (client, guildId, stats, line) => {
|
||||||
|
|
||||||
let guild = await client.GetGuild(guildId);
|
let guild = await client.GetGuild(guildId);
|
||||||
@@ -117,6 +144,13 @@ module.exports = {
|
|||||||
const destination = lastDist > 500 ? `${destination_dir} of ${tempDest}` : `Near ${tempDest}`;
|
const destination = lastDist > 500 ? `${destination_dir} of ${tempDest}` : `Near ${tempDest}`;
|
||||||
|
|
||||||
if (killedBy == Templates.LandMine || killedBy == Templates.Explosion || killedBy == Templates.Vehicle) {
|
if (killedBy == Templates.LandMine || killedBy == Templates.Explosion || killedBy == Templates.Vehicle) {
|
||||||
|
let victimStat = stats.find(stat => stat.playerID == info.victimID)
|
||||||
|
let victimStatIndex = stats.indexOf(victimStat);
|
||||||
|
if (victimStat == undefined) victimStat = client.getDefaultPlayerStats(info.victim, info.victimID);
|
||||||
|
victimStat.lastDeathDate = newDt;
|
||||||
|
if (victimStatIndex == -1) stats.push(victimStat);
|
||||||
|
else stats[victimStatIndex] = victimStat;
|
||||||
|
|
||||||
const cod = killedBy == Templates.LandMine ? `Land Mine Trap` :
|
const cod = killedBy == Templates.LandMine ? `Land Mine Trap` :
|
||||||
killedBy == Templates.Vehicle ? Vehicles[info.causeOfDeath] : info.causeOfDeath;
|
killedBy == Templates.Vehicle ? Vehicles[info.causeOfDeath] : info.causeOfDeath;
|
||||||
const coord = showCoords ? `\n***Location [${info.victimPOS[0]}, ${info.victimPOS[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${info.victimPOS[0]};${info.victimPOS[1]})***\n${destination}` : '';
|
const coord = showCoords ? `\n***Location [${info.victimPOS[0]}, ${info.victimPOS[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${info.victimPOS[0]};${info.victimPOS[1]})***\n${destination}` : '';
|
||||||
|
|||||||
Reference in new issue
Block a user