Skip to content

Commit c705d81

Browse files
committed
feat: site
finally
1 parent c9d386d commit c705d81

File tree

8 files changed

+561
-17
lines changed

8 files changed

+561
-17
lines changed

api/src/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,11 @@ app.get("/get/:guild", async (req, res) => {
158158
} else if (!guildData) {
159159
res.status(404).json({ message: "Guild not found" });
160160
} else {
161+
const totalXp = usersData.reduce((sum, user) => sum + user.xp, 0);
161162
res.status(200).json({
162163
guild: guildData,
163164
leaderboard: usersData,
165+
totalXp: totalXp,
164166
});
165167
}
166168
});
@@ -569,7 +571,7 @@ async function syncFromMee6(guild: string) {
569571
const users = data.players;
570572
let pageNumber = 1;
571573
// this is needed because MEE6 doesn't give us the total amount of pages
572-
574+
// eslint-disable-next-line no-constant-condition
573575
while (true) {
574576
const res = await fetch(`https://mee6.xyz/api/plugins/levels/leaderboard/${guild}?limit=1000&page=${pageNumber}`);
575577
const data = await res.json();
@@ -638,7 +640,7 @@ async function syncFromLurkr(guild: string) {
638640

639641
let pageNumber = 2;
640642
// this is needed because Lurkr doesn't give us the total amount of pages
641-
643+
// eslint-disable-next-line no-constant-condition
642644
while (true) {
643645
const res = await fetch(`https://api.lurkr.gg/v2/levels/${guild}?page=${pageNumber}`);
644646
const data = await res.json();

web/components/search.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const Search = () => {
1212
}
1313
};
1414

15-
const handleInputChange = (event: any) => {
15+
const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
1616
setSearchQuery(event.target.value);
1717
};
1818

web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"dev": "next dev --port 56413",
77
"build": "next build",
88
"start": "next start --port 56414",
9-
"lint": "next lint"
9+
"lint": "next lint --fix"
1010
},
1111
"dependencies": {
1212
"@nextui-org/react": "^2.3.0",

web/pages/leaderboard/[server].tsx

Lines changed: 418 additions & 0 deletions
Large diffs are not rendered by default.

web/pages/leaderboard/[server]/[user].tsx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import HighchartsReact from 'highcharts-react-official';
55
import dynamic from "next/dynamic";
66
import Image from 'next/image';
77
import "odometer/themes/odometer-theme-default.css";
8+
import { ChartOptions, ChartPointsFormatted } from '@/types/chart';
9+
import { PropsUsers } from '@/types/props';
810

911
const Odometer = dynamic(import('react-odometerjs'), {
1012
ssr: false,
@@ -25,14 +27,14 @@ interface PageState {
2527
odometerPointsNeededToNextLevel: number;
2628
odometerPointsNeededForNextLevel: number;
2729
odometerProgressToNextLevelPercentage: number;
28-
chartOptions: any;
30+
chartOptions: ChartOptions;
2931
}
3032

31-
class IndexPage extends Component<{}, PageState> {
33+
class IndexPage extends Component<object, PageState> {
3234

33-
interval: NodeJS.Timeout | null = null
35+
interval: Timer | null = null
3436

35-
constructor(props: any | Readonly<{}>) {
37+
constructor(props: PropsUsers) {
3638
super(props);
3739

3840
this.state = {
@@ -107,10 +109,10 @@ class IndexPage extends Component<{}, PageState> {
107109
},
108110
tooltip: {
109111
shared: true,
110-
formatter(this: any) {
112+
formatter(this: ChartPointsFormatted) {
111113
if (!this.points || this.points.length === 0) return '';
112114

113-
const point = this.points[0]; // Assuming you are only dealing with one point
115+
const point = this.points[0];
114116

115117
const index = point.series.xData.indexOf(point.x);
116118
const lastY = point.series.yData[index - 1];
@@ -133,7 +135,7 @@ class IndexPage extends Component<{}, PageState> {
133135
}
134136
},
135137
series: [{
136-
name: 'Followers',
138+
name: 'Total XP',
137139
data: [],
138140
showInLegend: false,
139141
marker: { enabled: false },
@@ -180,7 +182,7 @@ class IndexPage extends Component<{}, PageState> {
180182
...prevState.chartOptions,
181183
series: [{
182184
...prevState.chartOptions.series[0],
183-
data: updatedData,
185+
data: updatedData as [number, number][],
184186
}],
185187
},
186188
isLoading: false, // Reset isLoading flag
@@ -235,7 +237,7 @@ class IndexPage extends Component<{}, PageState> {
235237
<div className="relative w-full p-4 rounded-lg flex flex-col justify-center items-center">
236238
{/* <Image
237239
src={this.state.discordBannerURL}
238-
alt="Twitter Banner"
240+
alt="Banner"
239241
className="absolute inset-0 w-full h-full object-cover rounded-lg z-0 blur-sm"
240242
width={1500}
241243
height={500}
@@ -277,9 +279,9 @@ class IndexPage extends Component<{}, PageState> {
277279
</div>
278280
<div className="bg-gray-800 p-2 rounded-lg flex flex-col justify-center items-center transition-transform transform hover:scale-105">
279281
<div className='text-xl sm:text-xl md:text-2xl lg:text-2xl'>
280-
<Odometer value={odometerProgressToNextLevelPercentage} />%
282+
<Odometer value={odometerProgressToNextLevelPercentage} />
281283
</div>
282-
<div className="text-gray-400 mt-2 center-text">Progress Percentage</div>
284+
<div className="text-gray-400 mt-2 center-text">Progress To Next Level (%)</div>
283285
</div>
284286
<div className="bg-gray-800 p-2 rounded-lg flex flex-col justify-center items-center transition-transform transform hover:scale-105">
285287
<div className='text-xl sm:text-xl md:text-2xl lg:text-2xl'>
@@ -300,8 +302,7 @@ class IndexPage extends Component<{}, PageState> {
300302

301303
export async function getServerSideProps(context: { query: { server: string; user: string; }; }) {
302304
const { server, user } = context.query;
303-
console.log(server, user);
304-
305+
305306
try {
306307
const response = await fetch(`http://localhost:18103/get/${server}/${user}`);
307308

web/types/chart.d.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
interface ChartPoints {
2+
x: number;
3+
y: number;
4+
series: {
5+
name: string;
6+
xData: number[];
7+
yData: number[];
8+
};
9+
}
10+
11+
export interface ChartPointsFormatted {
12+
points: ChartPoints[];
13+
}
14+
15+
export interface ChartOptions {
16+
chart: {
17+
backgroundColor: string;
18+
type: string;
19+
zoomType: string;
20+
};
21+
title: {
22+
text: string;
23+
style: {
24+
color: string;
25+
font: string;
26+
};
27+
};
28+
xAxis: {
29+
type: string;
30+
tickPixelInterval: number;
31+
labels: {
32+
style: {
33+
color: string;
34+
font: string;
35+
};
36+
};
37+
visible: boolean;
38+
};
39+
yAxis: {
40+
gridLineColor: string;
41+
title: {
42+
text: string;
43+
};
44+
labels: {
45+
style: {
46+
color: string;
47+
font: string;
48+
};
49+
};
50+
visible: boolean;
51+
};
52+
plotOptions: {
53+
series: {
54+
threshold: null;
55+
fillOpacity: number;
56+
animation: boolean;
57+
lineWidth: number;
58+
};
59+
area: {
60+
fillOpacity: number;
61+
};
62+
};
63+
credits: {
64+
enabled: boolean;
65+
text: string;
66+
href: string;
67+
};
68+
time: {
69+
useUTC: boolean;
70+
};
71+
tooltip: {
72+
shared: boolean;
73+
formatter: (this: ChartPointsFormatted) => string;
74+
};
75+
series: {
76+
name: string;
77+
data: [number, number][];
78+
showInLegend: boolean;
79+
marker: {
80+
enabled: boolean;
81+
};
82+
color: string;
83+
lineColor: string;
84+
lineWidth: number;
85+
}[];
86+
}

web/types/leaderboard.d.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export interface Leaderboard {
2+
id: string;
3+
guild_id: string;
4+
name: string;
5+
nickname: string;
6+
pfp: string;
7+
xp: number;
8+
level: number;
9+
xp_needed_next_level: number;
10+
progress_next_level: string;
11+
}

web/types/props.d.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Leaderboard } from "./leaderboard";
2+
3+
export interface PropsUsers {
4+
discordAccountExists: boolean;
5+
discordUserId: string;
6+
discordGuildId: string;
7+
discordAvatarURL: string;
8+
discordUsername: string;
9+
discordDisplayName: string;
10+
odometerPoints: number;
11+
odometerLevel: number;
12+
odometerPointsNeededToNextLevel: number;
13+
odometerPointsNeededForNextLevel: number;
14+
odometerProgressToNextLevelPercentage: number;
15+
}
16+
17+
export interface PropsGuilds {
18+
discordGuildExists: boolean;
19+
discordGuildId: string;
20+
discordGuildIconURL: string;
21+
discordGuildName: string;
22+
odometerPoints: number;
23+
odometerMembers: number;
24+
odometerMembersBeingTracked: number;
25+
leaderboard: Leaderboard[];
26+
}

0 commit comments

Comments
 (0)