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 && ( + Jacket + )} +
+
    +
  • + Title: {playerNextRatingList.title} +
  • +
  • + Level: {playerNextRatingList.level} +
  • +
  • + Difficulty: + {getDifficultyText(Number(playerNextRatingList.chartId))} +
  • +
  • + Score: {" "} + {playerNextRatingList.score?.toLocaleString()} +
  • +
  • + Rating: {" "} + {(playerNextRatingList.rating / 100).toFixed(2)} +
  • +
+
+
+ ); + })} +
+ ); +};