diff --git a/app/(authenticated)/chunithm/page.tsx b/app/(authenticated)/chunithm/page.tsx
index 83aa8c4..948085d 100644
--- a/app/(authenticated)/chunithm/page.tsx
+++ b/app/(authenticated)/chunithm/page.tsx
@@ -18,12 +18,17 @@ import { ChunithmHotPlays } from "@/components/userRatingBaseHotList/page";
import { getUserRatingBaseHotList } from "@/components/userRatingBaseHotList/action";
import { ChunithmTopPlays } from "@/components/userRatingBaseList/page";
import Patcher from "../../../components/patcher/page";
+import { ChunithmNextPlays } from "@/components/userRatingBaseNextList/page";
+import { getUserRatingBaseNextList } from "@/components/userRatingBaseNextList/action";
const getChuniTopPlays = async () => {
const topPlays = await getUserRatingBaseList();
return { topPlays };
};
-
+const getChuniNextPlays = async () => {
+ const nextPlays = await getUserRatingBaseNextList();
+ return { nextPlays };
+};
const getChuniHotPlays = async () => {
const hotRating = await getUserRatingBaseHotList();
return { hotRating };
@@ -84,6 +89,7 @@ const Page = async () => {
const AllStaticNameplates = await getAllNameplates();
const AllSystemVoices = await getAllSystemVoices();
const AllMapIcons = await getAllMapIcons();
+ const NextChuniPlays = await getChuniNextPlays();
const TopChuniPlays = await getChuniTopPlays();
const HotChuniPlays = await getChuniHotPlays();
@@ -91,16 +97,14 @@ const Page = async () => {
return (
-
+
Scores
Customize
Top Plays
Hot Plays
- {/* Settings */}
-
- Patcher
-
+ Next Plays
+
@@ -140,10 +144,13 @@ const Page = async () => {
-
+
+
+
+
- {/*
+ {/*
*/}
diff --git a/app/(authenticated)/patcher/page.tsx b/app/(authenticated)/patcher/page.tsx
new file mode 100644
index 0000000..49f1716
--- /dev/null
+++ b/app/(authenticated)/patcher/page.tsx
@@ -0,0 +1,12 @@
+import Patcher from "@/components/patcher/page";
+import React from "react";
+
+const PatcherPage = () => {
+ return (
+
+ );
+};
+
+export default PatcherPage;
diff --git a/components/scoreplaylog/DebouncedInput.tsx b/components/scoreplaylog/DebouncedInput.tsx
index 6624c8b..89d7bec 100644
--- a/components/scoreplaylog/DebouncedInput.tsx
+++ b/components/scoreplaylog/DebouncedInput.tsx
@@ -28,7 +28,7 @@ export default function DebouncedInput({
return (
setValue(e.target.value)}
diff --git a/components/scoreplaylog/colums.tsx b/components/scoreplaylog/colums.tsx
index ce3b76f..7c33ddb 100644
--- a/components/scoreplaylog/colums.tsx
+++ b/components/scoreplaylog/colums.tsx
@@ -66,7 +66,7 @@ export const columns: ColumnDef
[] = [
switch (isSuccess) {
case 0:
- isSuccessText = "Not Clear";
+ isSuccessText = " Clear";
break;
case 1:
isSuccessText = "Clear";
diff --git a/components/scoreplaylog/data-table.tsx b/components/scoreplaylog/data-table.tsx
index 90d0f8e..80deba3 100644
--- a/components/scoreplaylog/data-table.tsx
+++ b/components/scoreplaylog/data-table.tsx
@@ -52,7 +52,7 @@ export function DataTable({
return (
-
+
setGlobalFilter(String(value))}
diff --git a/components/userRatingBaseNextList/action.ts b/components/userRatingBaseNextList/action.ts
new file mode 100644
index 0000000..166c944
--- /dev/null
+++ b/components/userRatingBaseNextList/action.ts
@@ -0,0 +1,122 @@
+"use server";
+import { getAuth } from "@/auth/queries/getauth";
+import { getSupportedVersionNumber } from "@/lib/api";
+import { artemis } from "@/lib/prisma";
+
+export async function getUserRatingBaseNextList() {
+ const { user } = await getAuth();
+ const supportedVersionNumber = await getSupportedVersionNumber();
+
+ if (!user || !user.accessCode) {
+ throw new Error("User is not authenticated or accessCode is missing");
+ }
+
+ try {
+ const userRatingBaseList = await artemis.chuni_profile_rating.findMany({
+ where: {
+ user: user.UserId,
+ type: "userRatingBaseNextList",
+ version: supportedVersionNumber,
+ },
+ select: {
+ musicId: true,
+ score: true,
+ difficultId: true,
+ version: true,
+ index: true,
+ },
+ orderBy: {
+ index: "asc",
+ },
+ });
+
+ const staticMusicInfo = await artemis.chuni_static_music.findMany({
+ where: {
+ songId: {
+ in: userRatingBaseList.map((entry) => entry.musicId!),
+ },
+ version: supportedVersionNumber,
+ },
+ select: {
+ songId: true,
+ title: true,
+ artist: true,
+ chartId: true,
+ level: true,
+ genre: true,
+ jacketPath: true,
+ },
+ });
+
+ // chartId is the difficutly i.e
+ // easy, hard, expert, master, ultima, worlds end
+
+ // msuicId is the id of the specific song in the rating table
+ // we are mapping that to songId in chuni static music
+ // so we can get name and jacket path etc
+ // then we are mapping the difficultId to the chartId to get the proper difficutly from above
+ // this is very confusing and my brain hurts
+ // if someone could make this cleaner id highly appreciate it
+
+ // Create a map
+ const songIdtoChartId = new Map(
+ staticMusicInfo.map((music) => [
+ `${music.songId}-${music.chartId}`,
+ music,
+ ]),
+ );
+
+ const musicIdToDifficltId = userRatingBaseList.map((rating) => {
+ const staticMusic = songIdtoChartId.get(
+ `${rating.musicId}-${rating.difficultId}`,
+ );
+
+ const level = staticMusic?.level ?? 0;
+ const score = rating.score ?? 0;
+
+ const perSongRating = calculateRating(level, score);
+
+ return {
+ ...rating,
+ chartId: staticMusic?.chartId || "Unknown chartId",
+ title: staticMusic?.title || "Unknown Title",
+ artist: staticMusic?.artist || "Unknown Artist",
+ genre: staticMusic?.genre || "Unknown Genre",
+ level: staticMusic?.level || "Unknown Level",
+ jacketPath: staticMusic?.jacketPath || "",
+ rating: perSongRating,
+ };
+ });
+
+ return musicIdToDifficltId;
+ } catch (error) {
+ console.error("Error fetching songs with titles:", error);
+ throw error;
+ }
+}
+
+// calculate the rating
+function calculateRating(level: number, score: number): number {
+ if (score >= 1009000) {
+ return level * 100 + 215;
+ } else if (score >= 1007500) {
+ return level * 100 + 200 + (score - 1007500) / 100;
+ } else if (score >= 1005000) {
+ return level * 100 + 150 + (score - 1005000) / 50;
+ } else if (score >= 1000000) {
+ return level * 100 + 100 + (score - 1000000) / 100;
+ } else if (score >= 975000) {
+ return level * 100 + (score - 975000) / 250;
+ } else if (score >= 925000) {
+ return level * 100 - 300 + ((score - 925000) * 3) / 500;
+ } else if (score >= 900000) {
+ return level * 100 - 500 + ((score - 900000) * 4) / 500;
+ } else if (score >= 800000) {
+ return (
+ (level * 100 - 500) / 2 +
+ ((score - 800000) * ((level - 500) / 2)) / 100000
+ );
+ } else {
+ return 0;
+ }
+}
diff --git a/components/userRatingBaseNextList/page.tsx b/components/userRatingBaseNextList/page.tsx
new file mode 100644
index 0000000..9a11cbd
--- /dev/null
+++ b/components/userRatingBaseNextList/page.tsx
@@ -0,0 +1,72 @@
+import React, { FC } from "react";
+import { getDifficultyText } from "@/lib/helpers";
+
+type userRatingBaseList = {
+ title: string;
+ artist: string;
+ genre: string;
+ chartId: string | number;
+ level: string | number;
+ jacketPath: string;
+ rating: number;
+ version: number;
+ index: number;
+ musicId: number | null;
+ difficultId: number | null;
+ score: number | null;
+};
+
+type ChunithmProfileHotPlays = {
+ chuniProfileNextPlays: {
+ nextPlays: userRatingBaseList[];
+ };
+};
+export const ChunithmNextPlays: FC = ({
+ chuniProfileNextPlays,
+}) => {
+ return (
+
+ {" "}
+ {chuniProfileNextPlays.nextPlays.map((playerNextRatingList, index) => {
+ const jacketPath = playerNextRatingList.jacketPath?.replace(
+ ".dds",
+ ".png",
+ );
+ return (
+
+
+ {jacketPath && (
+

+ )}
+
+
+ -
+ Title: {playerNextRatingList.title}
+
+ -
+ Level: {playerNextRatingList.level}
+
+ -
+ Difficulty:
+ {getDifficultyText(Number(playerNextRatingList.chartId))}
+
+ -
+ Score: {" "}
+ {playerNextRatingList.score?.toLocaleString()}
+
+ -
+ Rating: {" "}
+ {(playerNextRatingList.rating / 100).toFixed(2)}
+
+
+
+
+ );
+ })}
+
+ );
+};