update location link based on mission

This commit is contained in:
SowinskiBraeden committed 2026-03-24 17:28:16 -07:00
1 parent e8303fc14a
commit 3b32c65340
2 files changed
+45 -40

No files matched your search

+13 -13
View File
@@ -28,33 +28,33 @@ module.exports = {
allowedChannels: guild.server.allowedChannels, allowedChannels: guild.server.allowedChannels,
customChannelStatus: guild.server.allowedChannels.length > 0 ? true : false, customChannelStatus: guild.server.allowedChannels.length > 0 ? true : false,
hasBotAdmin: guild.server.botAdminRoles.length > 0 ? true : false, hasBotAdmin: guild.server.botAdminRoles.length > 0 ? true : false,
killfeedChannel: guild.server.killfeedChannel, killfeedChannel: guild.server.killfeedChannel,
connectionLogsChannel: guild.server.connectionLogsChannel, connectionLogsChannel: guild.server.connectionLogsChannel,
activePlayersChannel: guild.server.activePlayersChannel, activePlayersChannel: guild.server.activePlayersChannel,
welcomeChannel: guild.server.welcomeChannel, welcomeChannel: guild.server.welcomeChannel,
factionArmbands: guild.server.factionArmbands, factionArmbands: guild.server.factionArmbands,
usedArmbands: guild.server.usedArmbands, usedArmbands: guild.server.usedArmbands,
excludedRoles: guild.server.excludedRoles, excludedRoles: guild.server.excludedRoles,
hasExcludedRoles: guild.server.excludedRoles.length > 0 ? true : false, hasExcludedRoles: guild.server.excludedRoles.length > 0 ? true : false,
botAdminRoles: guild.server.botAdminRoles, botAdminRoles: guild.server.botAdminRoles,
alarms: guild.server.alarms, alarms: guild.server.alarms,
events: guild.server.events, events: guild.server.events,
uavs: guild.server.uavs, uavs: guild.server.uavs,
incomeRoles: guild.server.incomeRoles, incomeRoles: guild.server.incomeRoles,
incomeLimiter: guild.server.incomeLimiter, incomeLimiter: guild.server.incomeLimiter,
startingBalance: guild.server.startingBalance, startingBalance: guild.server.startingBalance,
uavPrice: guild.server.uavPrice, uavPrice: guild.server.uavPrice,
empPrice: guild.server.empPrice, empPrice: guild.server.empPrice,
linkedGamertagRole: guild.server.linkedGamertagRole, linkedGamertagRole: guild.server.linkedGamertagRole,
memberRole: guild.server.memberRole, memberRole: guild.server.memberRole,
adminRole: guild.server.adminRole, adminRole: guild.server.adminRole,
combatLogTimer: guild.server.combatLogTimer, combatLogTimer: guild.server.combatLogTimer,
}; };
}, },
@@ -75,27 +75,27 @@ module.exports = {
connectionLogsChannel: "", connectionLogsChannel: "",
activePlayersChannel: "", activePlayersChannel: "",
welcomeChannel: "", welcomeChannel: "",
factionArmbands: {}, factionArmbands: {},
usedArmbands: [], usedArmbands: [],
excludedRoles: [], excludedRoles: [],
botAdminRoles: [], botAdminRoles: [],
alarms: [], alarms: [],
events: [], events: [],
uavs: [], uavs: [],
incomeRoles: [], incomeRoles: [],
incomeLimiter: 168, // # of hours in 7 days incomeLimiter: 168, // # of hours in 7 days
startingBalance: 500, startingBalance: 500,
uavPrice: 50000, uavPrice: 50000,
empPrice: 500000, empPrice: 500000,
linkedGamertagRole: "", linkedGamertagRole: "",
memberRole: "", memberRole: "",
adminRole: "", adminRole: "",
combatLogTimer: 5, // minutes combatLogTimer: 5, // minutes
} }
} }
+32 -27
View File
@@ -31,19 +31,19 @@ const Vehicles = {
CivilianSedan: 'White Olga', CivilianSedan: 'White Olga',
CivilianSedan_Black: 'Black Olga', CivilianSedan_Black: 'Black Olga',
CivilianSedan_Wine: 'Wine Olga', CivilianSedan_Wine: 'Wine Olga',
Hatchback_02: 'Red Gunter', Hatchback_02: 'Red Gunter',
Hatchback_02_Black: 'Black Gunter', Hatchback_02_Black: 'Black Gunter',
Hatchback_02_Blue: 'Blue Gunter', Hatchback_02_Blue: 'Blue Gunter',
OffroadHatchBack: 'Green ADA 4x4', OffroadHatchBack: 'Green ADA 4x4',
OffroadHatchBack_Blue: 'Blue ADA 4x4', OffroadHatchBack_Blue: 'Blue ADA 4x4',
OffroadHatchBack_White: 'White ADA 4x4', OffroadHatchBack_White: 'White ADA 4x4',
Sedan_02: 'Yellow Sarka', Sedan_02: 'Yellow Sarka',
Sedan_02_Grey: 'Grey Sarka', Sedan_02_Grey: 'Grey Sarka',
Sedan_02_Red: 'Red Sarka', Sedan_02_Red: 'Red Sarka',
Truck_01_Covered: 'Green V3S Truck', Truck_01_Covered: 'Green V3S Truck',
Truck_01_Covered_Blue: 'Blue V3S Truck', Truck_01_Covered_Blue: 'Blue V3S Truck',
Truck_01_Covered_Orange: 'Orange V3S Truck', Truck_01_Covered_Orange: 'Orange V3S Truck',
@@ -52,12 +52,12 @@ const Vehicles = {
}; };
module.exports = { module.exports = {
// Update last death date for non PVP deaths // Update last death date for non PVP deaths
UpdateLastDeathDate: async (NitradoServerID, client, line) => { UpdateLastDeathDate: async (NitradoServerID, client, line) => {
let killedByZmb = /(.*) \| Player \"(.*)\" \(DEAD\) \(id=(.*) pos=<(.*)>\) killed by (.*)/g; let killedByZmb = /(.*) \| Player \"(.*)\" \(DEAD\) \(id=(.*) pos=<(.*)>\) killed by (.*)/g;
let diedTemplate = /(.*) \| Player \"(.*)\" \(DEAD\) \(id=(.*) pos=<(.*)>\) died\. Stats> Water: (.*) Energy: (.*) Bleed sources: (.*)/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]; let data = line.includes('>) died.') ? [...line.matchAll(diedTemplate)][0] : [...line.matchAll(killedByZmb)][0];
if (!data) return; if (!data) return;
@@ -80,21 +80,21 @@ module.exports = {
}, },
HandleKillfeed: async (NitradoServerID, client, guild, line) => { HandleKillfeed: async (NitradoServerID, client, guild, line) => {
const NAME = "DayZ.R Killfeed"; const NAME = "DayZ.R Killfeed";
const channel = client.GetChannel(guild.killfeedChannel); const channel = client.GetChannel(guild.killfeedChannel);
const killedBy = line.includes('hit by Player') && line.includes('(DEAD)') && line.includes('meters') ? Templates.HitByAndDead : 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') && !line.includes('meters') ? Templates.Melee : // Missing meters indicates it was a melee attack.
line.includes('hit by Player') ? Templates.HitBy : line.includes('hit by Player') ? Templates.HitBy :
line.includes('killed by Player') ? Templates.Killed : line.includes('killed by Player') ? Templates.Killed :
line.includes('TransportHit') ? Templates.Vehicle : line.includes('TransportHit') ? Templates.Vehicle :
line.includes('killed by LandMineTrap') ? Templates.LandMine : Templates.Explosion; line.includes('killed by LandMineTrap') ? Templates.LandMine : Templates.Explosion;
let data = [...line.matchAll(TemplateExpressions[killedBy])][0]; let data = [...line.matchAll(TemplateExpressions[killedBy])][0];
if (!data) return; if (!data) return;
// Create base data // Create base data
let info = { let info = {
time: data[1], time: data[1],
@@ -141,8 +141,8 @@ module.exports = {
victimStat.KDR = victimStat.kills / (victimStat.deaths == 0 ? 1 : victimStat.deaths); // prevent division by 0 victimStat.KDR = victimStat.kills / (victimStat.deaths == 0 ? 1 : victimStat.deaths); // prevent division by 0
victimStat.killStreak = 0; victimStat.killStreak = 0;
victimStat.lastDeathDate = newDt; 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; 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}` : '';
const killMessage = killedBy == Templates.Vehicle ? 'run over by' : 'blew up from'; const killMessage = killedBy == Templates.Vehicle ? 'run over by' : 'blew up from';
@@ -152,7 +152,7 @@ module.exports = {
.setDescription(`**Death Event** - <t:${unixTime}>\n**${info.victim}** ${killMessage} a **${cod}.**${coord}`); .setDescription(`**Death Event** - <t:${unixTime}>\n**${info.victim}** ${killMessage} a **${cod}.**${coord}`);
await UpdatePlayer(client, victimStat); await UpdatePlayer(client, victimStat);
if (!channel) return; if (!channel) return;
const webhook = await GetWebhook(client, NAME, guild.killfeedChannel); const webhook = await GetWebhook(client, NAME, guild.killfeedChannel);
WebhookSend(client, webhook, { embeds: [killEvent]}); WebhookSend(client, webhook, { embeds: [killEvent]});
@@ -183,7 +183,7 @@ module.exports = {
killerStat.deathStreak = 0; killerStat.deathStreak = 0;
if (!client.exists(killerStat.weaponStats[weapon].kills)) killerStat.weaponStats[weapon].kills = 0; if (!client.exists(killerStat.weaponStats[weapon].kills)) killerStat.weaponStats[weapon].kills = 0;
killerStat.weaponStats[weapon].kills++; killerStat.weaponStats[weapon].kills++;
// Update victim stats // Update victim stats
victimStat.deaths++; victimStat.deaths++;
victimStat.deathStreak++; victimStat.deathStreak++;
@@ -193,7 +193,7 @@ module.exports = {
victimStat.lastDeathDate = newDt; victimStat.lastDeathDate = newDt;
if (!client.exists(victimStat.weaponStats[weapon].deaths)) victimStat.weaponStats[weapon].death = 0; if (!client.exists(victimStat.weaponStats[weapon].deaths)) victimStat.weaponStats[weapon].death = 0;
victimStat.weaponStats[weapon].deaths++; victimStat.weaponStats[weapon].deaths++;
// Create defaults for non-existing ratings // Create defaults for non-existing ratings
if (!client.exists(killerStat.combatRating)) killerStat.combatRating = 800; if (!client.exists(killerStat.combatRating)) killerStat.combatRating = 800;
if (!client.exists(victimStat.combatRating)) victimStat.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(victimStat.combatRatingHistory)) victimStat.combatRatingHistory = [800];
if (!client.exists(killerStat.highestCombatRating)) killerStat.highestCombatRating = Math.max(...killerStat.combatRatingHistory); if (!client.exists(killerStat.highestCombatRating)) killerStat.highestCombatRating = Math.max(...killerStat.combatRatingHistory);
if (!client.exists(victimStat.lowestCombatRating)) victimStat.lowestCombatRating = Math.min(...victimStat.combatRatingHistory); if (!client.exists(victimStat.lowestCombatRating)) victimStat.lowestCombatRating = Math.min(...victimStat.combatRatingHistory);
// Calculate new ratings // Calculate new ratings
let killerOldRating = killerStat.combatRating; let killerOldRating = killerStat.combatRating;
let victimOldRating = victimStat.combatRating; let victimOldRating = victimStat.combatRating;
killerStat.combatRating = calculateNewCombatRating(killerStat.combatRating, victimStat.combatRating, client.exists(info.bodyPart) && info.bodyPart.includes('Head') ? 1.25 : 1); 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); victimStat.combatRating = calculateNewCombatRating(victimStat.combatRating, killerStat.combatRating, 0);
// Update combat rating records // Update combat rating records
if (killerStat.combatRating > killerStat.highestCombatRating) killerStat.highestCombatRating = killerStat.combatRating; if (killerStat.combatRating > killerStat.highestCombatRating) killerStat.highestCombatRating = killerStat.combatRating;
if (victimStat.combatRating < victimStat.lowestCombatRating) victimStat.lowestCombatRating = victimStat.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) if (victimStat.combatRatingHistory.length >= 12) victimStat.combatRatingHistory = victimStat.combatRatingHistory.slice(1); // Remove first element (limits history to length 12)
killerStat.combatRatingHistory.push(killerStat.combatRating); killerStat.combatRatingHistory.push(killerStat.combatRating);
victimStat.combatRatingHistory.push(victimStat.combatRating); victimStat.combatRatingHistory.push(victimStat.combatRating);
let kdiff = killerStat.combatRating - killerOldRating; let kdiff = killerStat.combatRating - killerOldRating;
let vdiff = victimStat.combatRating - victimOldRating; 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); let banking = await client.dbo.collection("users").findOne({"user.userID": killerStat.discordID}).then(banking => banking);
if (!banking) { if (!banking) {
banking = await createUser(interaction.member.user.id, guild.serverID, guild.startingBalance, client) banking = await createUser(interaction.member.user.id, guild.serverID, guild.startingBalance, client)
if (!client.exists(banking)) return client.sendInternalError(interaction, err); if (!client.exists(banking)) return client.sendInternalError(interaction, err);
@@ -240,14 +240,14 @@ module.exports = {
} }
const newBalance = banking.guilds[ guild.serverID].balance + totalBounty; const newBalance = banking.guilds[ guild.serverID].balance + totalBounty;
await client.dbo.collection("users").updateOne({ "user.userID": killerStat.discordID }, { await client.dbo.collection("users").updateOne({ "user.userID": killerStat.discordID }, {
$set: { $set: {
[`user.guilds.${ guild.serverID}.balance`]: newBalance, [`user.guilds.${ guild.serverID}.balance`]: newBalance,
} }
}, (err, res) => { }, (err, res) => {
if (err) return client.sendError(client.GetChannel(guild.killfeedChannel), `Killfeed Error: Updating killer bank balance\n${err}`); if (err) return client.sendError(client.GetChannel(guild.killfeedChannel), `Killfeed Error: Updating killer bank balance\n${err}`);
}); });
receivedBounty = new EmbedBuilder() receivedBounty = new EmbedBuilder()
.setColor(client.config.Colors.Default) .setColor(client.config.Colors.Default)
@@ -259,12 +259,17 @@ module.exports = {
await UpdatePlayer(client, victimStat); await UpdatePlayer(client, victimStat);
await UpdatePlayer(client, killerStat); await UpdatePlayer(client, killerStat);
const header = `**Kill Event** - <t:${unixTime}>\n**${info.killer}** killed **${info.victim}**`; const header = `**Kill Event** - <t:${unixTime}>\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 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 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 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() let killEvent = new EmbedBuilder()
.setColor(client.config.Colors.Default) .setColor(client.config.Colors.Default)
@@ -274,7 +279,7 @@ module.exports = {
let weaponClass = weaponClassOf(weapon); let weaponClass = weaponClassOf(weapon);
killEvent.setThumbnail(weapons[weaponClass][weapon]) killEvent.setThumbnail(weapons[weaponClass][weapon])
} }
if (!channel) return; if (!channel) return;
const webhook = await GetWebhook(client, NAME, guild.killfeedChannel); 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(channel)) await channel.send({ embeds: [killEvent] });
// if (client.exists(receivedBounty) && client.exists(channel)) await channel.send({ content: `<@${killerStat.discordID}>`, embeds: [receivedBounty] }); // if (client.exists(receivedBounty) && client.exists(channel)) await channel.send({ content: `<@${killerStat.discordID}>`, embeds: [receivedBounty] });
return; return;
} }
} }