fix(): fix profile update

This commit is contained in:
Aleksander Wilczyński 2024-12-22 00:07:01 +01:00
parent 3f3e369fb7
commit 17473db3b5
Signed by: alekswilc
GPG Key ID: D4464A248E5F27FE
7 changed files with 169 additions and 29 deletions

View File

@ -18,6 +18,9 @@ import { Router } from "express";
import { ErrorResponseBuilder, SuccessResponseBuilder } from "../responseBuilder.js"; import { ErrorResponseBuilder, SuccessResponseBuilder } from "../responseBuilder.js";
import { MAdmin } from "../../mongo/admin.js"; import { MAdmin } from "../../mongo/admin.js";
import { MProfile } from "../../mongo/profile.js"; import { MProfile } from "../../mongo/profile.js";
import { PlayerUtil } from "../../util/PlayerUtil.js";
import { getVehicle } from "../../util/contants.js";
import { isTruthyAndGreaterThanZero } from "../../util/functions.js";
export class AdminRoute export class AdminRoute
{ {
@ -203,6 +206,101 @@ export class AdminRoute
); );
}); });
app.post("/profile/:playerId/forceUpdate", async (req, res) =>
{
const token = req.headers[ "x-auth-token" ];
if (!token)
{
res.status(400).json(new ErrorResponseBuilder()
.setCode(400)
.setData("Missing token").toJSON());
return;
}
const admin = await MAdmin.findOne({ token });
if (!admin)
{
res.status(401).json(new ErrorResponseBuilder()
.setCode(401)
.setData("Invalid token").toJSON());
return;
}
const player = await MProfile.findOne({
id: req.params.playerId,
});
if (!player)
{
res.status(401).json(new ErrorResponseBuilder()
.setCode(401)
.setData("Invalid playerId").toJSON());
return;
}
const stats = await PlayerUtil.getPlayerStats(player.id);
if (!stats)
{
res.status(401).json(new ErrorResponseBuilder()
.setCode(401)
.setData("Invalid playerId (2)").toJSON());
return;
}
player.steamTrainDistance = stats?.stats?.find(x => x.name === "DISTANCE_M")?.value ?? 0;
player.steamDispatcherTime = stats?.stats?.find(x => x.name === "DISPATCHER_TIME")?.value ?? 0;
player.steamTrainScore = stats?.stats?.find(x => x.name === "SCORE")?.value ?? 0;
if (player.steamTrainDistance > player.trainDistance)
{
player.trainDistance = player.steamTrainDistance;
}
if (player.steamTrainScore > player.trainPoints)
{
player.trainPoints = player.steamTrainScore;
}
const sum = Object.keys(player.trainStats).filter(x => x !== "N/A").map(x => player.trainStats[ x ]).reduce((acc, obj) =>
{
acc.time += obj.time;
acc.distance += obj.distance;
acc.score += obj.score;
return acc;
}, { time: 0, distance: 0, score: 0 });
player.trainStats[ "N/A" ] = {
time: 0,
distance: player.trainDistance - sum.distance,
score: player.trainPoints - sum.score,
};
if (typeof player.createdAt !== "number")
{
player.createdAt = new Date(parseInt(player._id.toString().substring(0, 8), 16) * 1000).getTime();
}
const playerData = await PlayerUtil.getPlayerSteamData(player.id);
player.username = playerData?.personaname ?? player.username;
player.avatar = playerData?.avatarfull ?? player.avatar;
await MProfile.updateOne({ id: player.id }, player);
res.json(
new SuccessResponseBuilder()
.setCode(200)
.setData({})
.toJSON(),
);
});
return app; return app;
} }
} }

View File

@ -85,22 +85,30 @@ export class StationsModule
player.steamTrainScore = stats?.stats?.find(x => x.name === "SCORE")?.value ?? 0; player.steamTrainScore = stats?.stats?.find(x => x.name === "SCORE")?.value ?? 0;
if ((player.steamTrainDistance > player.trainDistance) || (player.trainPoints > player.steamTrainScore)) if (player.steamTrainDistance > player.trainDistance)
{ {
player.trainStats[ "N/A" ] = { player.trainDistance = player.steamTrainDistance;
time: 0, distance: player.steamTrainDistance > player.trainDistance ? player.steamTrainDistance - player.trainDistance : player.trainDistance,
score: player.trainPoints > player.steamTrainScore ? player.steamTrainScore - player.trainPoints : player.trainPoints,
};
if (player.steamTrainDistance > player.trainDistance)
{
player.trainDistance = player.steamTrainDistance;
}
if (player.trainPoints > player.steamTrainScore)
{
player.trainPoints = player.steamTrainScore;
}
} }
if (player.steamTrainScore > player.trainPoints)
{
player.trainPoints = player.steamTrainScore;
}
const sum = Object.keys(player.trainStats).filter(x => x !== "N/A").map(x => player.trainStats[ x ]).reduce((acc, obj) =>
{
acc.time += obj.time;
acc.distance += obj.distance;
acc.score += obj.score;
return acc;
}, { time: 0, distance: 0, score: 0 });
player.trainStats[ "N/A" ] = {
time: 0,
distance: player.trainDistance - sum.distance,
score: player.trainPoints - sum.score,
};
player.flags = player.flags.filter(x => x !== "private"); player.flags = player.flags.filter(x => x !== "private");

View File

@ -118,22 +118,31 @@ export class TrainsModule
player.steamDispatcherTime = stats?.stats?.find(x => x.name === "DISPATCHER_TIME")?.value ?? 0; player.steamDispatcherTime = stats?.stats?.find(x => x.name === "DISPATCHER_TIME")?.value ?? 0;
player.steamTrainScore = stats?.stats?.find(x => x.name === "SCORE")?.value ?? 0; player.steamTrainScore = stats?.stats?.find(x => x.name === "SCORE")?.value ?? 0;
if ((player.steamTrainDistance > player.trainDistance) || (player.steamTrainScore > player.trainPoints))
{
player.trainStats[ "N/A" ] = {
time: 0, distance: player.steamTrainDistance > player.trainDistance ? player.steamTrainDistance - player.trainDistance : player.trainDistance,
score: player.steamTrainScore > player.trainPoints ? player.steamTrainScore - player.trainPoints : player.trainPoints,
};
if (player.steamTrainDistance > player.trainDistance) if (player.steamTrainDistance > player.trainDistance)
{ {
player.trainDistance = player.steamTrainDistance; player.trainDistance = player.steamTrainDistance;
}
if (player.steamTrainScore > player.trainPoints)
{
player.trainPoints = player.steamTrainScore;
}
} }
if (player.steamTrainScore > player.trainPoints)
{
player.trainPoints = player.steamTrainScore;
}
const sum = Object.keys(player.trainStats).filter(x => x !== "N/A").map(x => player.trainStats[ x ]).reduce((acc, obj) =>
{
acc.time += obj.time;
acc.distance += obj.distance;
acc.score += obj.score;
return acc;
}, { time: 0, distance: 0, score: 0 });
player.trainStats[ "N/A" ] = {
time: 0,
distance: player.trainDistance - sum.distance,
score: player.trainPoints - sum.score,
};
player.flags = player.flags.filter(x => x !== "private"); player.flags = player.flags.filter(x => x !== "private");

View File

@ -61,6 +61,18 @@ export const ProfileCard = ({ data }: { data: TProfileData }) =>
}); });
}; };
const adminForceUpdate = () =>
{
post(`/admin/profile/${ data.player.id }/forceUpdate`, {}, { "X-Auth-Token": token })
.then((response) =>
{
if (response.code === 200)
{
toast.success(t("admin.update.alert"));
}
});
};
const { t } = useTranslation(); const { t } = useTranslation();
return <> return <>
@ -253,6 +265,11 @@ export const ProfileCard = ({ data }: { data: TProfileData }) =>
onClick={ () => setHideProfileModal(true) }> onClick={ () => setHideProfileModal(true) }>
{ t("admin.hide.button") } { t("admin.hide.button") }
</button> </button>
<button className="inline-flex items-center justify-center rounded-md bg-primary py-2 px-5 text-center font-medium text-white hover:bg-opacity-50 lg:px-4 xl:px-5"
onClick={ () => adminForceUpdate() }>
{ t("admin.update.button") }
</button>
</div> </div>
</div> </div>
</> } </> }

View File

@ -189,6 +189,10 @@
}, },
"button": "Hide profile", "button": "Hide profile",
"alert": "Player profile hidden." "alert": "Player profile hidden."
},
"update": {
"button": "Force update",
"alert": "Profile updated!"
} }
} }
} }

View File

@ -189,6 +189,10 @@
}, },
"button": "Ukryj profil", "button": "Ukryj profil",
"alert": "Ukryto profil gracza." "alert": "Ukryto profil gracza."
},
"update": {
"button": "Wymuś aktualizacje",
"alert": "Zaktualizowano profil!"
} }
} }
} }

View File

@ -30,7 +30,7 @@ import { get } from "../../util/fetcher.ts";
export const Profile = () => export const Profile = () =>
{ {
const { id } = useParams(); const { id } = useParams();
const { data, error, isLoading } = useSWR(`/profiles/${ id }`, get, { refreshInterval: 10_000, errorRetryCount: 5 }); const { data, error, isLoading } = useSWR(`/profiles/${ id }`, get, { refreshInterval: 5_000, errorRetryCount: 5 });
const { t } = useTranslation(); const { t } = useTranslation();