add tracked days count
All checks were successful
Deploy / deploy (push) Successful in 2m36s

This commit is contained in:
Lee 2024-09-28 15:19:51 +01:00
parent 05f98bf4a7
commit d9cdef5515
7 changed files with 39 additions and 11 deletions

@ -19,6 +19,7 @@ export async function GET(request: NextRequest) {
};
if (foundPlayer != null) {
response["trackedSince"] = foundPlayer.trackedSince?.toUTCString();
response["daysTracked"] = foundPlayer.getStatisticHistory().size;
}
return NextResponse.json(response);
}

@ -74,8 +74,7 @@ export async function trackScoreSaberPlayer(
if (
foundPlayer.rawPlayer &&
foundPlayer.rawPlayer.inactive &&
Date.now() - foundPlayer.getLastTracked().getTime() >
INACTIVE_CHECK_AGAIN_TIME
Date.now() - foundPlayer.getked().getTime() > INACTIVE_CHECK_AGAIN_TIME
) {
io &&
(await io.logger.warn(

@ -8,4 +8,9 @@ export interface PlayerTrackedSince {
* The date the player was first tracked
*/
trackedSince?: string;
/**
* The amount of days the player has been tracked
*/
daysTracked?: number;
}

@ -18,7 +18,7 @@ export interface IPlayer extends Document {
/**
* The last time the player was tracked
*/
lastTracked: Date;
ked: Date;
/**
* The raw player data.
@ -33,7 +33,7 @@ export interface IPlayer extends Document {
/**
* Gets when this player was last tracked.
*/
getLastTracked(): Date;
getked(): Date;
/**
* Gets the history for the given date
@ -64,14 +64,14 @@ export interface IPlayer extends Document {
// Mongoose Schema definition for Player
const PlayerSchema = new Schema<IPlayer>({
_id: { type: String, required: true },
lastTracked: { type: Date, default: new Date(), required: false },
ked: { type: Date, default: new Date(), required: false },
rawPlayer: { type: Object, required: false },
statisticHistory: { type: Map, default: () => new Map(), required: false },
trackedSince: { type: Date, default: new Date(), required: false },
});
PlayerSchema.methods.getLastTracked = function (): Date {
return this.lastTracked || new Date();
PlayerSchema.methods.getked = function (): Date {
return this.ked || new Date();
};
PlayerSchema.methods.getHistory = function (date: Date): PlayerHistory {

@ -11,6 +11,7 @@ import PlayerScores from "./player-scores";
import ScoreSaberPlayer from "@/common/model/player/impl/scoresaber-player";
import Card from "@/components/card";
import PlayerBadges from "@/components/player/player-badges";
import { useIsMobile } from "@/hooks/use-is-mobile";
const REFRESH_INTERVAL = 5 * 60 * 1000; // 5 minutes
@ -29,6 +30,8 @@ export default function PlayerData({
sort,
page,
}: Props) {
const isMobile = useIsMobile();
let player = initalPlayerData;
const { data, isLoading, isError } = useQuery({
queryKey: ["player", player.id],
@ -58,10 +61,12 @@ export default function PlayerData({
page={page}
/>
</article>
<aside className="w-[550px] hidden 2xl:flex flex-col gap-2">
<Mini type="Global" player={player} />
<Mini type="Country" player={player} />
</aside>
{!isMobile && (
<aside className="w-[550px] hidden 2xl:flex flex-col gap-2">
<Mini type="Global" player={player} />
<Mini type="Country" player={player} />
</aside>
)}
</div>
);
}

@ -49,6 +49,7 @@ export default function PlayerTrackedStatus({ player }: Props) {
<p>
Tracked Since: {format(trackedSince)} ({daysAgoFormatted})
</p>
<p>Days Tracked: {formatNumberWithCommas(data.daysTracked!)}</p>
</div>
}
side="bottom"

@ -0,0 +1,17 @@
import { useState, useEffect } from "react";
export function useIsMobile() {
const [isMobile, setIsMobile] = useState(false);
useEffect(() => {
const handleResize = () => {
setIsMobile(window.innerWidth < 768);
};
window.addEventListener("resize", handleResize);
handleResize();
return () => window.removeEventListener("resize", handleResize);
}, []);
return isMobile;
}