Antraege vollstaendig erfassen und zum Forum verlinken

Threads ohne zuordenbaren Spieler wurden bisher verworfen. Von 502 Antraegen
im Forum kamen dadurch nur die wenigen an, deren Ersteller schon als Spieler
mit Forum-Namen erfasst war - der Rest war schlicht unsichtbar. Sie werden
jetzt erfasst und stehen unter "Ohne zugeordneten Spieler", durchsuchbar nach
Titel und Ersteller, aber ausserhalb der Arbeitsliste: ohne Spieler laesst
sich nichts buchen.

Wird spaeter ein Spieler mit passendem Forum-Namen angelegt, der Name
nachgetragen oder ein frueheres Konto ergaenzt, wandern seine wartenden
Antraege von selbst hinueber. Ein erneuter Abgleich ist dafuer nicht noetig,
und eine bereits getroffene Zuordnung bleibt unberuehrt.

Der Name eines CCs fuehrt auf der Spielerseite jetzt zum Forumsbeitrag, sofern
einer verknuepft ist.

Weitere Korrekturen am Abgleich:

- Wer sein Forumskonto geloescht hat, stand ohne Profil-Link in der Zeile und
  hatte damit keinen Autor. Solche Antraege liessen sich niemandem zuordnen.
- Bei einer abgewiesenen Anfrage brach das ganze Board ab; die bis dahin
  gelesenen Seiten gingen mit verloren. Jetzt wird die genannte Wartezeit
  eingehalten, das Tempo fuer den Rest des Laufs gedrosselt und die Seite
  erneut versucht. Was gelesen wurde, bleibt in jedem Fall erhalten.
- Derselbe Schutz im GExtension-Abgleich, der sonst den Spieler uebersprungen
  haette.
- Der Board-Filter fragte nach einem Feld "board", das es nicht gibt.

Ein voller Lauf dauert rund eine halbe Minute und laenger, wenn das Forum
bremst. Er laeuft deshalb im Hintergrund weiter und meldet seinen Fortschritt,
statt an einer HTTP-Zeitgrenze zu sterben. Gelesen und geschrieben wird
gebuendelt statt Thread fuer Thread.
This commit is contained in:
2026-09-21 00:06:33 +02:00
parent e78a57e35e
commit 15d683c59e
16 changed files with 1034 additions and 193 deletions
+23 -2
View File
@@ -124,7 +124,7 @@ export async function createPlayer(input: PlayerInput, ctx: ActionContext) {
const steamId = canonicalSteamId(input.steamId);
if (steamId) await assertSteamIdFree(steamId);
return prisma.$transaction(async (tx) => {
const created = await prisma.$transaction(async (tx) => {
const created = await tx.player.create({
data: {
displayName: input.displayName.trim(),
@@ -143,6 +143,15 @@ export async function createPlayer(input: PlayerInput, ctx: ActionContext) {
return created;
});
// Wartende Forums-Anträge unter diesem Namen gleich mit übernehmen, sonst
// blieben sie bis zum nächsten vollen Abgleich in der Warteliste liegen.
if (created.forumName) {
const { claimThreadsForPlayer } = await import('./forum.js');
await claimThreadsForPlayer(created.id, [created.forumName]);
}
return created;
}
export async function updatePlayer(playerId: number, input: Partial<PlayerInput>, ctx: ActionContext) {
@@ -152,7 +161,7 @@ export async function updatePlayer(playerId: number, input: Partial<PlayerInput>
const steamId = input.steamId === undefined ? undefined : canonicalSteamId(input.steamId);
if (steamId) await assertSteamIdFree(steamId, playerId);
return prisma.$transaction(async (tx) => {
const updated = await prisma.$transaction(async (tx) => {
const updated = await tx.player.update({
where: { id: playerId },
data: {
@@ -172,6 +181,13 @@ export async function updatePlayer(playerId: number, input: Partial<PlayerInput>
return updated;
});
if (updated.forumName && updated.forumName !== existing.forumName) {
const { claimThreadsForPlayer } = await import('./forum.js');
await claimThreadsForPlayer(playerId, [updated.forumName]);
}
return updated;
}
/**
@@ -282,6 +298,11 @@ export async function addAlias(
details: { type, value, note: note ?? null },
});
if (type === AliasType.FORUM_NAME) {
const { claimThreadsForPlayer } = await import('./forum.js');
await claimThreadsForPlayer(playerId, [value]);
}
return created;
}