diff --git a/components/layout/IconNavBar.tsx b/components/layout/IconNavBar.tsx index 24be5e70f..82eaf2a9a 100644 --- a/components/layout/IconNavBar.tsx +++ b/components/layout/IconNavBar.tsx @@ -95,20 +95,20 @@ export const navIcons: { ], }, // { code: "tournaments", displayName: t`Tournaments`, menuItems: [] }, - // { - // code: "plus", - // displayName: t`Plus Server`, - // menuItems: [ - // { - // code: "plus/voting", - // displayName: t`Voting`, - // }, - // { code: "plus", displayName: t`Suggested and vouched players` }, - // { code: "plus/history", displayName: t`Voting history` }, - // { code: "draft", displayName: t`Draft Cup` }, - // { code: "plus/faq", displayName: t`FAQ` }, - // ], - // }, + { + code: "plus", + displayName: t`Plus Server`, + menuItems: [ + // { + // code: "plus/voting", + // displayName: t`Voting`, + // }, + // { code: "plus", displayName: t`Suggested and vouched players` }, + { code: "plus/history", displayName: t`Voting history` }, + // { code: "draft", displayName: t`Draft Cup` }, + // { code: "plus/faq", displayName: t`FAQ` }, + ], + }, { code: "links", displayName: t`External links`, menuItems: [] }, ]; diff --git a/scenes/plus/plusService.ts b/scenes/plus/plusService.ts index 817c26af5..3a0429fa0 100644 --- a/scenes/plus/plusService.ts +++ b/scenes/plus/plusService.ts @@ -1,4 +1,4 @@ -import { Prisma } from "@prisma/client"; +import { PlusRegion, Prisma } from "@prisma/client"; import prisma from "prisma/client"; import { userBasicSelection } from "utils/prisma"; @@ -6,7 +6,30 @@ export type GetVotingSummariesByMonthAndTierData = Prisma.PromiseReturnType< typeof getVotingSummariesByMonthAndTier >; -const getVotingSummariesByMonthAndTier = ({ +const getPercentageFromCounts = ( + countsNA: number[], + countsEU: number[], + votedUserRegion: PlusRegion +) => { + const sameRegionArr = votedUserRegion === "NA" ? countsNA : countsEU; + const otherRegionArr = votedUserRegion === "NA" ? countsEU : countsNA; + + const sameSum = + sameRegionArr[0] * 0 + + sameRegionArr[1] * 1 + + sameRegionArr[2] * 2 + + sameRegionArr[3] * 3; + const sameVoterCount = sameRegionArr.reduce((acc, cur) => acc + cur, 0); + const sameMax = sameVoterCount * 3; + + const otherSum = otherRegionArr[1] * 0 + otherRegionArr[2] * 1; + const otherVoterCount = otherRegionArr.reduce((acc, cur) => acc + cur, 0); + const otherMax = otherVoterCount * 1; + + return ((sameSum + otherSum) / (sameMax + otherMax)) * 100; +}; + +const getVotingSummariesByMonthAndTier = async ({ tier, year, month, @@ -15,7 +38,7 @@ const getVotingSummariesByMonthAndTier = ({ year: number; month: number; }) => { - return prisma.plusVotingSummary.findMany({ + const summaries = await prisma.plusVotingSummary.findMany({ where: { tier, year, month }, select: { countsEU: true, @@ -23,10 +46,53 @@ const getVotingSummariesByMonthAndTier = ({ wasVouched: true, countsNA: true, user: { - select: userBasicSelection, + select: { + ...userBasicSelection, + plusStatus: { + select: { + region: true, + }, + }, + }, }, }, }); + + return summaries + .map((summary) => { + // sometimes user can change their region. This flips the user region if it is noticed that + // they received -2 or +2 from the opposite region. Sometimes user can still have wrong + // region after this func has ran but this is ok. + const fixUserRegionIfNeeded = () => { + if ( + summary.user.plusStatus!.region === "NA" && + (summary.countsEU[0] !== 0 || summary.countsEU[3] !== 0) + ) + return "EU"; + if ( + summary.user.plusStatus!.region === "EU" && + (summary.countsNA[0] !== 0 || summary.countsNA[3] !== 0) + ) + return "NA"; + + return summary.user.plusStatus!.region; + }; + + return { + ...summary, + regionForVoting: fixUserRegionIfNeeded(), + percentage: getPercentageFromCounts( + summary.countsNA, + summary.countsEU, + fixUserRegionIfNeeded() + ), + }; + }) + .sort((a, b) => b.percentage - a.percentage) + .map((summary) => ({ + ...summary, + percentage: parseFloat(summary.percentage.toFixed(1)), + })); }; const getMostRecentVotingWithResultsMonth = async () => {