diff --git a/database/guild.js b/database/guild.js index c3071f6..1723c13 100644 --- a/database/guild.js +++ b/database/guild.js @@ -28,33 +28,33 @@ module.exports = { allowedChannels: guild.server.allowedChannels, customChannelStatus: guild.server.allowedChannels.length > 0 ? true : false, hasBotAdmin: guild.server.botAdminRoles.length > 0 ? true : false, - + killfeedChannel: guild.server.killfeedChannel, connectionLogsChannel: guild.server.connectionLogsChannel, activePlayersChannel: guild.server.activePlayersChannel, welcomeChannel: guild.server.welcomeChannel, - + factionArmbands: guild.server.factionArmbands, usedArmbands: guild.server.usedArmbands, excludedRoles: guild.server.excludedRoles, hasExcludedRoles: guild.server.excludedRoles.length > 0 ? true : false, botAdminRoles: guild.server.botAdminRoles, - + alarms: guild.server.alarms, events: guild.server.events, uavs: guild.server.uavs, - + incomeRoles: guild.server.incomeRoles, incomeLimiter: guild.server.incomeLimiter, - + startingBalance: guild.server.startingBalance, uavPrice: guild.server.uavPrice, empPrice: guild.server.empPrice, - + linkedGamertagRole: guild.server.linkedGamertagRole, memberRole: guild.server.memberRole, adminRole: guild.server.adminRole, - + combatLogTimer: guild.server.combatLogTimer, }; }, @@ -75,27 +75,27 @@ module.exports = { connectionLogsChannel: "", activePlayersChannel: "", welcomeChannel: "", - + factionArmbands: {}, usedArmbands: [], excludedRoles: [], botAdminRoles: [], - + alarms: [], events: [], uavs: [], - + incomeRoles: [], incomeLimiter: 168, // # of hours in 7 days - + startingBalance: 500, uavPrice: 50000, empPrice: 500000, - + linkedGamertagRole: "", memberRole: "", adminRole: "", - + combatLogTimer: 5, // minutes } } diff --git a/util/KillfeedHandler.js b/util/KillfeedHandler.js index 82bc5aa..fc2745d 100644 --- a/util/KillfeedHandler.js +++ b/util/KillfeedHandler.js @@ -31,19 +31,19 @@ const Vehicles = { CivilianSedan: 'White Olga', CivilianSedan_Black: 'Black Olga', CivilianSedan_Wine: 'Wine Olga', - + Hatchback_02: 'Red Gunter', Hatchback_02_Black: 'Black Gunter', Hatchback_02_Blue: 'Blue Gunter', OffroadHatchBack: 'Green ADA 4x4', OffroadHatchBack_Blue: 'Blue ADA 4x4', - OffroadHatchBack_White: 'White ADA 4x4', - + OffroadHatchBack_White: 'White ADA 4x4', + Sedan_02: 'Yellow Sarka', Sedan_02_Grey: 'Grey Sarka', Sedan_02_Red: 'Red Sarka', - + Truck_01_Covered: 'Green V3S Truck', Truck_01_Covered_Blue: 'Blue V3S Truck', Truck_01_Covered_Orange: 'Orange V3S Truck', @@ -52,12 +52,12 @@ const Vehicles = { }; module.exports = { - + // Update last death date for non PVP deaths UpdateLastDeathDate: async (NitradoServerID, client, 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; @@ -80,21 +80,21 @@ module.exports = { }, HandleKillfeed: async (NitradoServerID, client, guild, line) => { - + const NAME = "DayZ.R Killfeed"; const channel = client.GetChannel(guild.killfeedChannel); - + const killedBy = line.includes('hit by Player') && line.includes('(DEAD)') && line.includes('meters') ? Templates.HitByAndDead : line.includes('hit by Player') && !line.includes('meters') ? Templates.Melee : // Missing meters indicates it was a melee attack. line.includes('hit by Player') ? Templates.HitBy : - line.includes('killed by Player') ? Templates.Killed : - line.includes('TransportHit') ? Templates.Vehicle : + line.includes('killed by Player') ? Templates.Killed : + line.includes('TransportHit') ? Templates.Vehicle : line.includes('killed by LandMineTrap') ? Templates.LandMine : Templates.Explosion; let data = [...line.matchAll(TemplateExpressions[killedBy])][0]; if (!data) return; - + // Create base data let info = { time: data[1], @@ -141,8 +141,8 @@ module.exports = { victimStat.KDR = victimStat.kills / (victimStat.deaths == 0 ? 1 : victimStat.deaths); // prevent division by 0 victimStat.killStreak = 0; victimStat.lastDeathDate = newDt; - - const cod = killedBy == Templates.LandMine ? `Land Mine Trap` : + + const cod = killedBy == Templates.LandMine ? `Land Mine Trap` : 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 killMessage = killedBy == Templates.Vehicle ? 'run over by' : 'blew up from'; @@ -152,7 +152,7 @@ module.exports = { .setDescription(`**Death Event** - \n**${info.victim}** ${killMessage} a **${cod}.**${coord}`); await UpdatePlayer(client, victimStat); - + if (!channel) return; const webhook = await GetWebhook(client, NAME, guild.killfeedChannel); WebhookSend(client, webhook, { embeds: [killEvent]}); @@ -183,7 +183,7 @@ module.exports = { killerStat.deathStreak = 0; if (!client.exists(killerStat.weaponStats[weapon].kills)) killerStat.weaponStats[weapon].kills = 0; killerStat.weaponStats[weapon].kills++; - + // Update victim stats victimStat.deaths++; victimStat.deathStreak++; @@ -193,7 +193,7 @@ module.exports = { victimStat.lastDeathDate = newDt; if (!client.exists(victimStat.weaponStats[weapon].deaths)) victimStat.weaponStats[weapon].death = 0; victimStat.weaponStats[weapon].deaths++; - + // Create defaults for non-existing ratings if (!client.exists(killerStat.combatRating)) killerStat.combatRating = 800; if (!client.exists(victimStat.combatRating)) victimStat.combatRating = 800; @@ -201,13 +201,13 @@ module.exports = { if (!client.exists(victimStat.combatRatingHistory)) victimStat.combatRatingHistory = [800]; if (!client.exists(killerStat.highestCombatRating)) killerStat.highestCombatRating = Math.max(...killerStat.combatRatingHistory); if (!client.exists(victimStat.lowestCombatRating)) victimStat.lowestCombatRating = Math.min(...victimStat.combatRatingHistory); - + // Calculate new ratings let killerOldRating = killerStat.combatRating; let victimOldRating = victimStat.combatRating; killerStat.combatRating = calculateNewCombatRating(killerStat.combatRating, victimStat.combatRating, client.exists(info.bodyPart) && info.bodyPart.includes('Head') ? 1.25 : 1); victimStat.combatRating = calculateNewCombatRating(victimStat.combatRating, killerStat.combatRating, 0); - + // Update combat rating records if (killerStat.combatRating > killerStat.highestCombatRating) killerStat.highestCombatRating = killerStat.combatRating; if (victimStat.combatRating < victimStat.lowestCombatRating) victimStat.lowestCombatRating = victimStat.combatRating; @@ -215,7 +215,7 @@ module.exports = { if (victimStat.combatRatingHistory.length >= 12) victimStat.combatRatingHistory = victimStat.combatRatingHistory.slice(1); // Remove first element (limits history to length 12) killerStat.combatRatingHistory.push(killerStat.combatRating); victimStat.combatRatingHistory.push(victimStat.combatRating); - + let kdiff = killerStat.combatRating - killerOldRating; let vdiff = victimStat.combatRating - victimOldRating; @@ -227,7 +227,7 @@ module.exports = { } let banking = await client.dbo.collection("users").findOne({"user.userID": killerStat.discordID}).then(banking => banking); - + if (!banking) { banking = await createUser(interaction.member.user.id, guild.serverID, guild.startingBalance, client) if (!client.exists(banking)) return client.sendInternalError(interaction, err); @@ -240,14 +240,14 @@ module.exports = { } const newBalance = banking.guilds[ guild.serverID].balance + totalBounty; - + await client.dbo.collection("users").updateOne({ "user.userID": killerStat.discordID }, { $set: { [`user.guilds.${ guild.serverID}.balance`]: newBalance, } }, (err, res) => { if (err) return client.sendError(client.GetChannel(guild.killfeedChannel), `Killfeed Error: Updating killer bank balance\n${err}`); - }); + }); receivedBounty = new EmbedBuilder() .setColor(client.config.Colors.Default) @@ -259,12 +259,17 @@ module.exports = { await UpdatePlayer(client, victimStat); await UpdatePlayer(client, killerStat); - + const header = `**Kill Event** - \n**${info.killer}** killed **${info.victim}**`; const killData = `\n> **__Kill Data__**\n> Weapon: \` ${info.weapon} \`\n> Distance: \` ${info.distance}m \`\n> Body Part: \` ${info.bodyPart != undefined ? info.bodyPart.split('(')[0] : 'N/A'} \`\n> Damage: \` ${info.damage != undefined ? info.damage : 'N/A'} \``; const killerStatsView = `\n**Killer Rating** (${kdiff >= 0 ? '+' : ''}${kdiff}) ${killerStat.combatRating}\n${killerStat.KDR.toFixed(2)} K/D - ${killerStat.kills} Kill${(killerStat.kills == 0 || killerStat.kills > 1) ? 's':''} - Killstreak: ${killerStat.killStreak}`; const victimStatsView = `\n**Victim Rating** (${vdiff >= 0 ? '+' : ''}${vdiff}) ${victimStat.combatRating}\n${victimStat.KDR.toFixed(2)} K/D - ${victimStat.deaths} Death${victimStat.deaths == 0 || victimStat.deaths>1?'s':''} - Deathstreak: ${victimStat.deathStreak}`; - 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 map = guild.Nitrado.Mission == "Chernarus" ? "chernarusplus" : + guild.Nitrado.Mission == "Livonia" ? "livonia" : + "sakhal"; + + const coord = showCoords ? `\n***Location [${info.victimPOS[0]}, ${info.victimPOS[1]}](https://www.izurvive.com/${map}/#location=${info.victimPOS[0]};${info.victimPOS[1]})***\n${destination}` : ''; let killEvent = new EmbedBuilder() .setColor(client.config.Colors.Default) @@ -274,7 +279,7 @@ module.exports = { let weaponClass = weaponClassOf(weapon); killEvent.setThumbnail(weapons[weaponClass][weapon]) } - + if (!channel) return; const webhook = await GetWebhook(client, NAME, guild.killfeedChannel); @@ -284,7 +289,7 @@ module.exports = { // if (client.exists(channel)) await channel.send({ embeds: [killEvent] }); // if (client.exists(receivedBounty) && client.exists(channel)) await channel.send({ content: `<@${killerStat.discordID}>`, embeds: [receivedBounty] }); - + return; } -} \ No newline at end of file +}