diff --git a/api/db.js b/api/db.js
index d5ee2cb..3aae2cf 100644
--- a/api/db.js
+++ b/api/db.js
@@ -70,6 +70,16 @@ export const AVATAR = Object.freeze({
CEP: Symbol("cep"),
});
+export const WEAPONSTAT = Object.freeze({
+ THIS: Symbol("weapon"),
+ ID: Symbol("avatar_id"),
+ WEAPON: Symbol("weapon_id"),
+ SHOTS_FIRED: Symbol("shots_fired"),
+ SHOTS_LANDED: Symbol("shots_landed"),
+ KILLS: Symbol("kills"),
+ ASSISTS: Symbol("assists")
+});
+
export const LOGIN = Object.freeze({
THIS: Symbol("login"),
ID: Symbol("id"),
@@ -322,6 +332,17 @@ export async function get_character_batch_for_stats(batch, sort, order) {
}
}
+export async function get_weaponstats_by_avatar(id) {
+ try {
+ const weapons = await pool.query('SELECT * FROM weaponstat WHERE avatar_id=$1 ORDER BY kills DESC', [id])
+ return weapons.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/user.js b/api/user.js
index 6ade53e..d81f4e6 100644
--- a/api/user.js
+++ b/api/user.js
@@ -62,4 +62,16 @@ api.get('/user/:user/logins', NEED_SESSION, async (req, res, next) => {
}
});
+api.get('/avatar/:avatar/weaponstats', async (req, res, next) => {
+ const avatar = req.params.avatar;
+
+ try {
+ const weapons = await db.get_weaponstats_by_avatar(avatar);
+ res.status(200).json({ weapons: weapons });
+ } catch (e) {
+ console.log(e);
+ res.status(500).json({ message: 'error' });
+ }
+});
+
export default api;
diff --git a/app/App.svelte b/app/App.svelte
index f90afcd..696d445 100644
--- a/app/App.svelte
+++ b/app/App.svelte
@@ -26,6 +26,8 @@ import BadRoute from './views/BadRoute.svelte';
import UserList from './views/UserList.svelte';
import AdminPanel from './views/AdminPanel.svelte';
import CharacterList from './views/CharacterList.svelte';
+import Leaderboard from './views/Leaderboard.svelte';
+import Avatar from './views/Avatar.svelte'
// Defined by webpack
let APP_VERSION = __VERSION__;
@@ -99,6 +101,8 @@ function setRoute(r, initialState) {
page("/", setRoute(Home, true));
page("/login", setRoute(Login, true));
page("/register", setRoute(Register));
+page("/leaderboard", setRoute(Leaderboard));
+page("/avatar/:id", setRoute(Avatar));
page("/admin", setRoute(AdminPanel));
page("/profile", setRoute(Profile, true));
page("/user/:id", setRoute(Profile, true));
diff --git a/app/components/Nav.svelte b/app/components/Nav.svelte
index 721bdc5..e08b0ef 100644
--- a/app/components/Nav.svelte
+++ b/app/components/Nav.svelte
@@ -18,6 +18,9 @@
Server Status
+
+ Leaderboard
+
{#if $isAdmin}
Admin Panel
diff --git a/app/player.js b/app/player.js
new file mode 100644
index 0000000..afe0bf6
--- /dev/null
+++ b/app/player.js
@@ -0,0 +1,5 @@
+import { writable } from 'svelte/store';
+import axios from 'axios'
+
+// Create a writable store to hold the selected player data
+export const selectedPlayer = writable({});
\ No newline at end of file
diff --git a/app/views/Avatar.svelte b/app/views/Avatar.svelte
new file mode 100644
index 0000000..da26059
--- /dev/null
+++ b/app/views/Avatar.svelte
@@ -0,0 +1,280 @@
+
+
+
+Player Stats
+
+
+
+
+
+
+
+
+
+
+ Character Name: {$selectedPlayer.name}
+ Empire: {getFactionName($selectedPlayer.faction_id)}
+ |
+ }) |
+
+
+
+ Command Rank: {$selectedPlayer.cr}
+ Battle Rank: {$selectedPlayer.br}
+ |
+
+
+
+
+
+
+ | Weapon |
+ Kills |
+ Assists |
+ Shots Fired |
+ Shots Landed |
+ Accuracy |
+
+
+ {#each weapons as weapon}
+
+ | {getWeaponName(weapon.weapon_id)} {weapon.weapon_id} |
+ {weapon.kills} |
+ {weapon.assists} |
+ {weapon.shots_fired} |
+ {weapon.shots_landed} |
+ {((weapon.shots_landed / weapon.shots_fired) * 100).toFixed(2)}% |
+
+ {/each}
+
+
diff --git a/app/views/Leaderboard.svelte b/app/views/Leaderboard.svelte
new file mode 100644
index 0000000..a8bc9f0
--- /dev/null
+++ b/app/views/Leaderboard.svelte
@@ -0,0 +1,203 @@
+
+
+
+Leaderboard
+
+
+
+
+
+
+
+
+
+ | # |
+ Name |
+ BR |
+ CR |
+
+
+ {#each bepPlayers as player, $index}
+
+ | {$index + 1} |
+
+
+ handleClick(player)}>{player.name}
+ |
+ {calculateRank(player.bep)} |
+ {calculateCrRank(player.cep)} |
+
+ {/each}
+
+
+
+
+
+
+ | # |
+ Name |
+ BR |
+ CR |
+
+
+ {#each cepPlayers as player, $index}
+
+ | {$index + 1} |
+
+
+ handleClick(player)}>{player.name}
+ |
+ {calculateRank(player.bep)} |
+ {calculateCrRank(player.cep)} |
+
+ {/each}
+
+
+
+
+
+
+
\ No newline at end of file