diff --git a/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts b/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts index 1c9323cf5..a3ccd606d 100644 --- a/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts +++ b/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts @@ -182,7 +182,7 @@ export const ConverterIRBeatoraja: ConverterFunction = a comment: null, game: "usc", importType, - timeAchieved: Date.now(), + timeAchieved: context.timeReceived, service: "USC-IR", scoreData: { grade, diff --git a/server/src/lib/score-import/import-types/ir/usc/parser.ts b/server/src/lib/score-import/import-types/ir/usc/parser.ts index 9b46840e5..74df7ad84 100644 --- a/server/src/lib/score-import/import-types/ir/usc/parser.ts +++ b/server/src/lib/score-import/import-types/ir/usc/parser.ts @@ -62,6 +62,7 @@ export function ParseIRUSC( context: { chartHash, playtype, + timeReceived: Date.now(), }, game: "usc", iterable: [score] as USCClientScore[], diff --git a/server/src/lib/score-import/import-types/ir/usc/types.ts b/server/src/lib/score-import/import-types/ir/usc/types.ts index badada65d..e9283d56c 100644 --- a/server/src/lib/score-import/import-types/ir/usc/types.ts +++ b/server/src/lib/score-import/import-types/ir/usc/types.ts @@ -3,4 +3,5 @@ import { Playtypes } from "tachi-common"; export interface IRUSCContext { chartHash: string; playtype: Playtypes["usc"]; + timeReceived: number; } diff --git a/server/src/server/router/ir/usc/_playtype/router.ts b/server/src/server/router/ir/usc/_playtype/router.ts index 957d607b3..ddf48e9c0 100644 --- a/server/src/server/router/ir/usc/_playtype/router.ts +++ b/server/src/server/router/ir/usc/_playtype/router.ts @@ -334,9 +334,12 @@ router.post("/scores", RequirePermissions("submit_score"), async (req, res) => { "context.playtype": playtype, }); - await Promise.all( - scoresToDeorphan.map((score) => ReprocessOrphan(score, blacklist, logger)) - ); + for (const score of scoresToDeorphan) { + // Has to be like this to avoid race conditions where two + // orphans resolve to the same scoreID and collide in mid-air! + // eslint-disable-next-line no-await-in-loop + await ReprocessOrphan(score, blacklist, logger); + } } } diff --git a/server/temp-893389.rdb b/server/temp-893389.rdb new file mode 100644 index 000000000..f52ea9738 Binary files /dev/null and b/server/temp-893389.rdb differ