diff --git a/api/db.js b/api/db.js index 3aae2cf..667878c 100644 --- a/api/db.js +++ b/api/db.js @@ -80,6 +80,11 @@ export const WEAPONSTAT = Object.freeze({ ASSISTS: Symbol("assists") }); +export const KILLACTIVITY = Object.freeze({ + THIS: Symbol("kill"), + ID: Symbol("killer_id"), +}); + export const LOGIN = Object.freeze({ THIS: Symbol("login"), ID: Symbol("id"), @@ -343,6 +348,21 @@ export async function get_weaponstats_by_avatar(id) { } } +export async function get_killstats() { + try { + const kills = await pool.query('SELECT count(killactivity.killer_id), killactivity.killer_id, avatar.name, avatar.bep, avatar.cep, avatar.faction_id' + + ' FROM killactivity' + + ' INNER JOIN avatar ON killactivity.killer_id = avatar.id' + + ' GROUP BY killactivity.killer_id, avatar.name, avatar.bep, avatar.cep, avatar.faction_id' + + ' ORDER BY count(killer_id) DESC') + return kills.rows; + } catch (e) { + if (e.code) + e.code = pg_error_inv[e.code] + throw e; + } +} + export async function get_characters_by_account(account_id) { try { const characters = await pool.query('SELECT * FROM avatar WHERE account_id=$1 AND deleted=false', [account_id]) diff --git a/api/stats.js b/api/stats.js index 594f748..ce210ca 100644 --- a/api/stats.js +++ b/api/stats.js @@ -58,4 +58,14 @@ api.get('/char_stats_cep/:batch', async (req, res, next) => { } }); +api.get('/char_stats_kills', async (req, res, next) => { + try { + const kills = await db.get_killstats(); + res.status(200).json({ kills: kills }); + } catch (e) { + console.log(e); + res.status(500).json({ message: 'error' }); + } +}); + export default api; \ No newline at end of file diff --git a/app/views/Avatar.svelte b/app/views/Avatar.svelte index da26059..b1fd281 100644 --- a/app/views/Avatar.svelte +++ b/app/views/Avatar.svelte @@ -6,12 +6,13 @@ import { selectedPlayer } from '../player'; onMount(() => { - get_weaponStats(); + get_iWeaponStats(); }); let player; // Define player variable to hold player data - let weapons = []; + let iWeapons = []; let alert; + let iWeaponsKillsSum // Subscribe to the selectedPlayer store to get the selected player data selectedPlayer.subscribe(value => { @@ -20,11 +21,42 @@ const url = "/api/avatar/"+$selectedPlayer.id+"/weaponstats" - async function get_weaponStats() { + async function get_iWeaponStats() { try { + const ids = [55, 56, 57, 140, 146, 175, 233, 299, 304, 324, 334, 345, 396, 406, + 407, 411, 425, 429, 462, 468, 556, 587, 588, 589, 599, 673, 680, 701, 706, 714, + 716, 730, 737, 817, 838, 845, 864, 888, 889, 890, 968, 969, 970]; const resp = await axios.get(url); const stats = resp.data; - weapons = stats.weapons; + const filteredWeapons = stats.weapons.filter(weapon => { + return ids.includes(weapon.weapon_id); + }); + + filteredWeapons.forEach(weapon => { + switch (weapon.weapon_id) { + case 304: + weapon.shots_fired = Math.ceil(weapon.shots_fired / 36); + weapon.shots_landed = Math.ceil(weapon.shots_landed / 8); + break; + case 411: + weapon.shots_fired = Math.ceil(weapon.shots_fired / 21); + weapon.shots_landed = Math.ceil(weapon.shots_landed / 6); + break; + case 588: + weapon.shots_fired = Math.ceil(weapon.shots_fired / 55); + weapon.shots_landed = Math.ceil(weapon.shots_landed / 10); + break; + case 714: + weapon.shots_fired = Math.ceil(weapon.shots_fired / 36); + weapon.shots_landed = Math.ceil(weapon.shots_landed / 8); + break; + default: + break; + } + }); + + iWeapons = filteredWeapons; + iWeaponsKillsSum = iWeapons.reduce((total, weapon) => total + weapon.kills, 0); // Reset alert message if needed alert.message(""); } catch (e) { @@ -249,8 +281,8 @@ const weaponNames = [ - Command Rank: {$selectedPlayer.cr}
Battle Rank: {$selectedPlayer.br}
+ Command Rank: {$selectedPlayer.cr}
@@ -266,9 +298,9 @@ const weaponNames = [ Accuracy - {#each weapons as weapon} + {#each iWeapons as weapon} - {getWeaponName(weapon.weapon_id)} {weapon.weapon_id} + {getWeaponName(weapon.weapon_id)} {weapon.kills} {weapon.assists} {weapon.shots_fired} @@ -278,3 +310,4 @@ const weaponNames = [ {/each} + Total Kills: {iWeaponsKillsSum} diff --git a/app/views/Leaderboard.svelte b/app/views/Leaderboard.svelte index a8bc9f0..1a3ac6c 100644 --- a/app/views/Leaderboard.svelte +++ b/app/views/Leaderboard.svelte @@ -8,10 +8,12 @@ onMount(() => { get_BEPleaderboard(); get_CEPleaderboard(); + get_kills(); }); let bepPlayers = []; let cepPlayers = []; + let kills = []; let alert; async function get_BEPleaderboard() { @@ -27,18 +29,31 @@ } } - async function get_CEPleaderboard() { - try { - const resp = await axios.get("/api/char_stats_cep/0"); - const stats = resp.data; - cepPlayers = stats.players; - // Reset alert message if needed - alert.message(""); - } catch (e) { - console.log(e); - alert.message("Failed to fetch stats from server"); - } + async function get_CEPleaderboard() { + try { + const resp = await axios.get("/api/char_stats_cep/0"); + const stats = resp.data; + cepPlayers = stats.players; + // Reset alert message if needed + alert.message(""); + } catch (e) { + console.log(e); + alert.message("Failed to fetch stats from server"); } + } + + async function get_kills() { + try { + const resp = await axios.get("/api/char_stats_kills"); + const stats = resp.data; + kills = stats.kills; + // Reset alert message if needed + alert.message(""); + } catch (e) { + console.log(e); + alert.message("Failed to fetch stats from server"); + } + } // Define battle rank ranges const rankRanges = [ @@ -115,22 +130,26 @@ return 40; } - // Function to calculate rank based on CEP - function calculateCrRank(cep) { - // Iterate through rank ranges to find the appropriate rank - for (const range of crRankRanges) { - if (cep >= range.minCEP && cep <= range.maxCEP) { - return range.rank; - } - } - // Default rank if CEP doesn't match any range - return 5; - } + // Function to calculate rank based on CEP + function calculateCrRank(cep) { + // Iterate through rank ranges to find the appropriate rank + for (const range of crRankRanges) { + if (cep >= range.minCEP && cep <= range.maxCEP) { + return range.rank; + } + } + // Default rank if CEP doesn't match any range + return 5; + } const handleClick = (clickedPlayer) => { selectedPlayer.set({id: clickedPlayer.id, name: clickedPlayer.name, faction_id: clickedPlayer.faction_id, br: calculateRank(clickedPlayer.bep), cr: calculateCrRank(clickedPlayer.cep)}); }; + const handleKillClick = (clickedPlayer) => { + selectedPlayer.set({id: clickedPlayer.killer_id, name: clickedPlayer.name, faction_id: clickedPlayer.faction_id, br: calculateRank(clickedPlayer.bep), cr: calculateCrRank(clickedPlayer.cep)}); +}; + @@ -140,18 +159,18 @@
-
+
@@ -174,7 +193,8 @@
#
-
+ +
@@ -194,10 +214,33 @@ {/each} - -
#{calculateCrRank(player.cep)}
-
-
+ + +
-
-
\ No newline at end of file +
+ + + + + + + + + + {#each kills as killer, $index} + + + + + + + + {/each} + +
#NameKillsBRCR
{$index + 1} + {killer.faction_id} + handleKillClick(killer)}>{killer.name} + {killer.count}{calculateRank(killer.bep)}{calculateCrRank(killer.cep)}
+
+
\ No newline at end of file