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 @@
-
+
-
+
+
| # |
@@ -194,10 +214,33 @@
{calculateCrRank(player.cep)} |
{/each}
-
-
-
-
+
+
+
-
-
\ No newline at end of file
+
+
+
+ | # |
+ Name |
+ Kills |
+ BR |
+ CR |
+
+
+ {#each kills as killer, $index}
+
+ | {$index + 1} |
+
+
+ handleKillClick(killer)}>{killer.name}
+ |
+ {killer.count} |
+ {calculateRank(killer.bep)} |
+ {calculateCrRank(killer.cep)} |
+
+ {/each}
+
+
+
+
\ No newline at end of file