From 0ef5305fda0750aa6048fa9e62338407cabf2051 Mon Sep 17 00:00:00 2001 From: Polaris Date: Fri, 16 Aug 2024 15:08:33 -0400 Subject: [PATCH] added top and hot plays --- app/(authenticated)/chunithm/page.tsx | 27 +++-- components/userRatingBase/page.tsx | 90 ++++++++------- components/userRatingBaseHotList/action.ts | 121 +++++++++++++++++++++ components/userRatingBaseHotList/page.tsx | 71 ++++++++++++ 4 files changed, 255 insertions(+), 54 deletions(-) create mode 100644 components/userRatingBaseHotList/action.ts create mode 100644 components/userRatingBaseHotList/page.tsx diff --git a/app/(authenticated)/chunithm/page.tsx b/app/(authenticated)/chunithm/page.tsx index f1dfad6..ce6761d 100644 --- a/app/(authenticated)/chunithm/page.tsx +++ b/app/(authenticated)/chunithm/page.tsx @@ -13,12 +13,19 @@ import { getSystemVoices } from "@/components/(customization)/systemvoicecustomi import { SystemVoiceCustomization } from "@/components/(customization)/systemvoicecustomization/page"; import { MapIconCustomization } from "@/components/(customization)/mapiconcustomization/page"; import { getMapIcons } from "@/components/(customization)/mapiconcustomization/actions"; -import { ChunithmRecentPlays } from "@/components/RecentChunithmScores/page"; -import { getUserRatingBaseList } from "@/components/RecentChunithmScores/action"; +import { getUserRatingBaseList } from "@/components/userRatingBase/action"; +import { ChunithmHotPlays } from "@/components/userRatingBaseHotList/page"; +import { getUserRatingBaseHotList } from "@/components/userRatingBaseHotList/action"; +import { ChunithmTopPlays } from "@/components/userRatingBase/page"; -const getChuniRecent = async () => { - const recentRating = await getUserRatingBaseList(); - return { recentRating }; +const getChuniTopPlays = async () => { + const topPlays = await getUserRatingBaseList(); + return { topPlays }; +}; + +const getChuniHotPlays = async () => { + const hotRating = await getUserRatingBaseHotList(); + return { hotRating }; }; const getAvatarHeadAccessories = async () => { @@ -77,7 +84,8 @@ const Page = async () => { const AllSystemVoices = await getAllSystemVoices(); const AllMapIcons = await getAllMapIcons(); - const RecentChuniPlays = await getChuniRecent(); + const TopChuniPlays = await getChuniTopPlays(); + const HotChuniPlays = await getChuniHotPlays(); return (
@@ -86,7 +94,7 @@ const Page = async () => { Scores Customize Top Plays - Recent Plays + Hot Plays @@ -122,7 +130,10 @@ const Page = async () => {
- + + + +
diff --git a/components/userRatingBase/page.tsx b/components/userRatingBase/page.tsx index d7ceb0a..436a96d 100644 --- a/components/userRatingBase/page.tsx +++ b/components/userRatingBase/page.tsx @@ -20,58 +20,56 @@ type userRatingBaseList = { score: number | null; }; -type ChunithmProfileRecentPlays = { - chuniProfileRecentPlays: { - recentRating: userRatingBaseList[]; +type chunithmTopPlays = { + chuniProfileTopPlays: { + topPlays: userRatingBaseList[]; }; }; -export const ChunithmRecentPlays: FC = ({ - chuniProfileRecentPlays, +export const ChunithmTopPlays: FC = ({ + chuniProfileTopPlays, }) => { return (
- {chuniProfileRecentPlays.recentRating.map( - (playersRecentRatingList, index) => { - const jacketPath = playersRecentRatingList.jacketPath?.replace( - ".dds", - ".png", - ); - return ( -
-
{index + 1}.
- {jacketPath && ( - Jacket - )} -
-
    -
  • - Title: {playersRecentRatingList.title} -
  • -
  • - Level: {playersRecentRatingList.level} -
  • -
  • - Difficulty: - {getDifficultyText(Number(playersRecentRatingList.chartId))} -
  • -
  • - Score: {" "} - {playersRecentRatingList.score?.toLocaleString()} -
  • -
  • - Rating: {" "} - {(playersRecentRatingList.rating / 100).toFixed(2)} -
  • -
-
+ {chuniProfileTopPlays.topPlays.map((chuniProfileTopPlays, index) => { + const jacketPath = chuniProfileTopPlays.jacketPath?.replace( + ".dds", + ".png", + ); + return ( +
+
{index + 1}.
+ {jacketPath && ( + Jacket + )} +
+
    +
  • + Title: {chuniProfileTopPlays.title} +
  • +
  • + Level: {chuniProfileTopPlays.level} +
  • +
  • + Difficulty: + {getDifficultyText(Number(chuniProfileTopPlays.chartId))} +
  • +
  • + Score: {" "} + {chuniProfileTopPlays.score?.toLocaleString()} +
  • +
  • + Rating: {" "} + {(chuniProfileTopPlays.rating / 100).toFixed(2)} +
  • +
- ); - }, - )} +
+ ); + })}
); }; diff --git a/components/userRatingBaseHotList/action.ts b/components/userRatingBaseHotList/action.ts new file mode 100644 index 0000000..bb50326 --- /dev/null +++ b/components/userRatingBaseHotList/action.ts @@ -0,0 +1,121 @@ +"use server"; +import { getAuth } from "@/auth/queries/getauth"; +import { supportedVersionNumber } from "@/lib/helpers"; +import { artemis } from "@/lib/prisma"; + +export async function getUserRatingBaseHotList() { + const { user } = await getAuth(); + + 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: "userRatingBaseHotList", + 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/userRatingBaseHotList/page.tsx b/components/userRatingBaseHotList/page.tsx new file mode 100644 index 0000000..83ad86f --- /dev/null +++ b/components/userRatingBaseHotList/page.tsx @@ -0,0 +1,71 @@ +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 = { + chuniProfileHotPlays: { + hotRating: userRatingBaseList[]; + }; +}; +export const ChunithmHotPlays: FC = ({ + chuniProfileHotPlays, +}) => { + return ( +
+ {chuniProfileHotPlays.hotRating.map((playerHotRatingList, index) => { + const jacketPath = playerHotRatingList.jacketPath?.replace( + ".dds", + ".png", + ); + return ( +
+
{index + 1}.
+ {jacketPath && ( + Jacket + )} +
+
    +
  • + Title: {playerHotRatingList.title} +
  • +
  • + Level: {playerHotRatingList.level} +
  • +
  • + Difficulty: + {getDifficultyText(Number(playerHotRatingList.chartId))} +
  • +
  • + Score: {" "} + {playerHotRatingList.score?.toLocaleString()} +
  • +
  • + Rating: {" "} + {(playerHotRatingList.rating / 100).toFixed(2)} +
  • +
+
+
+ ); + })} +
+ ); +};