mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-10-01 07:37:55 -05:00
x trends backend first ver
This commit is contained in:
67
pages/xtrends.tsx
Normal file
67
pages/xtrends.tsx
Normal file
@@ -0,0 +1,67 @@
|
||||
import { GetStaticProps } from "next";
|
||||
import { getXTrends, GetXTrendsData } from "prisma/queries/getXTrends";
|
||||
|
||||
const tiers = [
|
||||
{
|
||||
label: "X",
|
||||
criteria: 6,
|
||||
color: "purple.700",
|
||||
},
|
||||
{
|
||||
label: "S+",
|
||||
criteria: 5,
|
||||
color: "red.700",
|
||||
},
|
||||
{
|
||||
label: "S",
|
||||
criteria: 4,
|
||||
color: "red.700",
|
||||
},
|
||||
{
|
||||
label: "A+",
|
||||
criteria: 3,
|
||||
color: "orange.700",
|
||||
},
|
||||
{
|
||||
label: "A",
|
||||
criteria: 2,
|
||||
color: "orange.700",
|
||||
},
|
||||
{
|
||||
label: "B+",
|
||||
criteria: 1.5,
|
||||
color: "yellow.700",
|
||||
},
|
||||
{
|
||||
label: "B",
|
||||
criteria: 1,
|
||||
color: "yellow.700",
|
||||
},
|
||||
{
|
||||
label: "C+",
|
||||
criteria: 0.5,
|
||||
color: "green.700",
|
||||
},
|
||||
{
|
||||
label: "C",
|
||||
criteria: 0.002, //1 in 500
|
||||
color: "green.700",
|
||||
},
|
||||
] as const;
|
||||
|
||||
interface Props {
|
||||
trends: GetXTrendsData;
|
||||
}
|
||||
|
||||
const XTrendsPage: React.FC<Props> = ({ trends }) => {
|
||||
console.log({ trends });
|
||||
return <>asd</>;
|
||||
};
|
||||
|
||||
export const getStaticProps: GetStaticProps<Props> = async () => {
|
||||
const trends = await getXTrends();
|
||||
|
||||
return { props: { trends } };
|
||||
};
|
||||
|
||||
export default XTrendsPage;
|
||||
51
prisma/queries/getXTrends.ts
Normal file
51
prisma/queries/getXTrends.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
import { Prisma } from "@prisma/client";
|
||||
import prisma from "prisma/client";
|
||||
|
||||
export type GetXTrendsData = Prisma.PromiseReturnType<typeof getXTrends>;
|
||||
|
||||
export const getXTrends = async () => {
|
||||
const placements = await prisma.xRankPlacement.findMany({
|
||||
select: { mode: true, month: true, year: true, weapon: true, xPower: true },
|
||||
});
|
||||
|
||||
const result: {
|
||||
[year: string]: {
|
||||
[month: string]: {
|
||||
[weapon: string]: {
|
||||
SZ?: { xPowerAverage: number; count: number };
|
||||
TC?: { xPowerAverage: number; count: number };
|
||||
RM?: { xPowerAverage: number; count: number };
|
||||
CB?: { xPowerAverage: number; count: number };
|
||||
};
|
||||
};
|
||||
};
|
||||
} = {};
|
||||
|
||||
placements.forEach((placement) => {
|
||||
if (!result[placement.year]) result[placement.year] = {};
|
||||
if (!result[placement.year][placement.month]) {
|
||||
result[placement.year][placement.month] = {};
|
||||
}
|
||||
if (!result[placement.year][placement.month][placement.weapon]) {
|
||||
result[placement.year][placement.month][placement.weapon] = {};
|
||||
}
|
||||
|
||||
const weaponObj = result[placement.year][placement.month][placement.weapon][
|
||||
placement.mode
|
||||
] ?? { xPowerAverage: 0, count: 0 };
|
||||
|
||||
const previousAverage = weaponObj.xPowerAverage;
|
||||
const previousCount = weaponObj.count;
|
||||
|
||||
weaponObj.xPowerAverage =
|
||||
(previousAverage * previousCount + placement.xPower) /
|
||||
(previousCount + 1);
|
||||
weaponObj.count++;
|
||||
|
||||
result[placement.year][placement.month][placement.weapon][
|
||||
placement.mode
|
||||
] = weaponObj;
|
||||
});
|
||||
|
||||
return result;
|
||||
};
|
||||
Reference in New Issue
Block a user