diff --git a/api/hooks/sdtdLogs/handleLogLine.js b/api/hooks/sdtdLogs/handleLogLine.js index 85fd3d04e..1eb0ecf09 100644 --- a/api/hooks/sdtdLogs/handleLogLine.js +++ b/api/hooks/sdtdLogs/handleLogLine.js @@ -2,15 +2,24 @@ const geoip = require('geoip-country'); const _ = require('lodash'); const replaceQuotes = string => string.substring(1, string.length - 1); +const extractIntegers = string => string.match(/\d*/g).join(''); -module.exports = logLine => { - const deathRegex = /(PlayerSpawnedInWorld \(reason: Died, position:)/g; - const deathValuesRegex = /([A-Za-z_]*)=(?:'([^']*)'|(\d*))/gm; +const steamIdRegex = /\d{17}/g; +const deathRegex = /(PlayerSpawnedInWorld \(reason: Died, position:)/g; +const deathValuesRegex = /([A-Za-z_]*)=(?:'([^']*)'|(\d*))/gm; + +const connectedRegex = /(Player connected,)/g; + +const joinedRegex = /(PlayerSpawnedInWorld \(reason: EnterMultiplayer, position:)/g; +const joinedValuesRegex = /([A-Za-z_]*)=(?:'([^']*)'|(\d*))/gm; + +const newLevelRegex = /(made level \d*)/g; +const oldLevelRegex = /(was )\d*/g; - const connectedRegex = /(Player connected,)/g; +const entityKilledRegex = /(killed .*)/g; + +module.exports = logLine => { - const joinedRegex = /(PlayerSpawnedInWorld \(reason: EnterMultiplayer, position:)/g; - const joinedValuesRegex = /([A-Za-z_]*)=(?:'([^']*)'|(\d*))/gm; let returnValue = { type: 'logLine', @@ -296,17 +305,11 @@ module.exports = logLine => { "type": "Log" } */ - let lvlMessage = logLine.msg.split('('); - let steamId = lvlMessage[1].split(')')[0].trim(); - let newLvl = lvlMessage[1].split('level')[1].trim(); - let oldLvl = lvlMessage[2] - .replace('was ', '') - .replace(')', '') - .trim(); + const steamId = logLine.msg.match(steamIdRegex)[0]; + const newLvl = extractIntegers(logLine.msg.match(newLevelRegex)[0]); + const oldLvl = extractIntegers(logLine.msg.match(oldLevelRegex)[0]); - newLvl = parseInt(newLvl); - oldLvl = parseInt(oldLvl); lvlMessage = { date: logLine.date, @@ -333,28 +336,24 @@ module.exports = logLine => { "type": "Log" } */ - let killMessage = logLine.msg.split('('); - let steamId = killMessage[1].split(')')[0].trim(); - let victimInfo = killMessage[1].split('killed ')[1].split(' '); - let entityClass = victimInfo[0]; - let entityName = victimInfo[1]; + const entityInfo = logLine.msg.match(entityKilledRegex)[0].split(' '); killMessage = { date: logLine.date, time: logLine.time, uptime: logLine.uptime, msg: logLine.msg, - steamId: steamId, - entityClass: entityClass, - entityName: entityName + steamId: logLine.msg.match(steamIdRegex)[0], + entityClass: entityInfo[1], + entityName: entityInfo[2] }; - if (entityClass === 'zombie') { + if (killMessage.entityClass === 'zombie') { returnValue.type = 'zombieKilled'; } - if (entityClass === 'animal') { + if (killMessage.entityClass === 'animal') { returnValue.type = 'animalKilled'; } diff --git a/test/unit/hooks/sdtdlogs/handleLogLine.test.js b/test/unit/hooks/sdtdlogs/handleLogLine.test.js index 1b140a68c..b7f579ddf 100644 --- a/test/unit/hooks/sdtdlogs/handleLogLine.test.js +++ b/test/unit/hooks/sdtdlogs/handleLogLine.test.js @@ -60,4 +60,60 @@ describe('sdtdLogs#handleLogLine', () => { expect(result.data.steamId).to.eq('76561198028175941'); expect(result.data.entityId).to.eq('531'); }); + + it('correctly detects a playerLevel event', () => { + const logLine = { + 'date': '2020-07-11', + 'time': '08:11:40', + 'uptime': '1673.118', + 'msg': '[CSMM_Patrons]playerLeveled: (VE) Kiota (76561198108856299) made level 4 (was 3)', + 'trace': '', + 'type': 'Log' + }; + + const result = handleLogLine(logLine); + + expect(result.type).to.eq('playerLevel'); + expect(result.data.steamId).to.eq('76561198108856299'); + expect(result.data.newLvl).to.eq('4'); + expect(result.data.oldLvl).to.eq('3'); + + }); + + + it('correctly detects a zombieKilled event', () => { + const logLine = { + 'date': '2017-11-14', + 'time': '14:50:49', + 'uptime': '133.559', + 'msg': '[CSMM_Patrons]entityKilled: (VE) Kiota (76561198028175941) killed zombie zombieBoe', + 'trace': '', + 'type': 'Log' + }; + const result = handleLogLine(logLine); + + expect(result.type).to.eq('zombieKilled'); + expect(result.data.steamId).to.eq('76561198028175941'); + expect(result.data.entityClass).to.eq('zombie'); + expect(result.data.entityName).to.eq('zombieBoe'); + + }); + + it('correctly detects a animalKilled event', () => { + const logLine = { + 'date': '2017-11-14', + 'time': '14:50:49', + 'uptime': '133.559', + 'msg': '[CSMM_Patrons]entityKilled: (VE) Kiota (76561198028175941) killed animal cuteBambi', + 'trace': '', + 'type': 'Log' + }; + const result = handleLogLine(logLine); + + expect(result.type).to.eq('animalKilled'); + expect(result.data.steamId).to.eq('76561198028175941'); + expect(result.data.entityClass).to.eq('animal'); + expect(result.data.entityName).to.eq('cuteBambi'); + + }); });