Ersteller statt letztem Antwortendem lesen
Ein Antrag hing bei einem Spieler, der ihn weder geschrieben noch kommentiert hatte. Die Ursache steht im HTML der Boarduebersicht: Der Ersteller "-Daniel-" hat sein Konto geloescht und steht dort ohne Profil-Link. Der einzige Profil-Link der Zeile gehoerte damit dem letzten Antwortenden - und genau den nahm der Parser, weil er nach dem ersten Treffer im ganzen Zeilenblock suchte. Jetzt wird die Zeile vor der Spalte "letzter Beitrag" abgeschnitten und zuerst in der Zelle gesucht, die den Ersteller fuehrt. Erst wenn dort kein Link steht, gilt der blosse Text - so wie es bei einem geloeschten Konto der Fall ist. Auf vier Stichprobenseiten des Archivs trifft das fuenf von achtzig Threads; hochgerechnet liegen im Bestand also rund drei Dutzend falsch. Die falschen Zuordnungen bleiben nicht stehen: Aendert sich der Ersteller eines bekannten Threads, wird seine Zuordnung neu bestimmt - aber nur, wenn die bisherige von selbst zustande kam. Wer von Hand zugeordnet hat, wusste mehr als der Abgleich, das bleibt unangetastet. Die Abschlussmeldung nennt, wie viele Threads dabei gewandert sind.
This commit is contained in:
@@ -110,6 +110,9 @@ export interface ForumScanSummary {
|
||||
/// in der Arbeitsliste, gehen aber auch nicht verloren.
|
||||
unassignedThreads: number;
|
||||
matchedPlayers: number;
|
||||
/// Threads, deren Ersteller sich geändert hat und die deshalb einem anderen
|
||||
/// Spieler zugeschlagen wurden.
|
||||
reassigned: number;
|
||||
/// Wie oft das Forum den Abruf gebremst hat. Über null heißt: der Lauf hat
|
||||
/// länger gedauert, gelesen wurde trotzdem alles.
|
||||
rateLimited: number;
|
||||
@@ -230,6 +233,7 @@ async function scanIntern(ctx: ActionContext): Promise<ForumScanSummary> {
|
||||
skippedLabels: 0,
|
||||
unassignedThreads: 0,
|
||||
matchedPlayers: 0,
|
||||
reassigned: 0,
|
||||
rateLimited: 0,
|
||||
failedBoards: [],
|
||||
};
|
||||
@@ -364,6 +368,31 @@ async function scanIntern(ctx: ActionContext): Promise<ForumScanSummary> {
|
||||
// Eine später nachgetragene Zuordnung nicht wieder überschreiben.
|
||||
const nachgetragen = existing.playerId === null && playerId !== null;
|
||||
|
||||
/**
|
||||
* Ein anderer Ersteller als beim letzten Mal.
|
||||
*
|
||||
* Das kommt vor, wenn jemand sich im Forum umbenennt - und es kam vor,
|
||||
* weil der Ersteller einmal falsch gelesen wurde: bei einem geloeschten
|
||||
* Konto stand in der Zeile nur noch der letzte Antwortende mit Profil,
|
||||
* und der landete als Ersteller in den Daten. Solche Threads hingen
|
||||
* anschliessend beim falschen Spieler.
|
||||
*
|
||||
* Korrigiert wird nur, was von selbst zustande kam: wenn die bisherige
|
||||
* Zuordnung genau die ist, die der alte Name ergeben haette. Eine von
|
||||
* Hand gesetzte bleibt stehen - wer sie gesetzt hat, wusste mehr als der
|
||||
* Abgleich.
|
||||
*/
|
||||
const autorGeaendert = existing.authorName !== thread.authorName;
|
||||
const zuordnungWarAutomatisch =
|
||||
existing.playerId !== null &&
|
||||
existing.authorName !== null &&
|
||||
byForumName.get(existing.authorName.toLowerCase()) === existing.playerId;
|
||||
const zuordnungKorrigieren =
|
||||
autorGeaendert &&
|
||||
zuordnungWarAutomatisch &&
|
||||
existing.needsClassification &&
|
||||
existing.playerId !== playerId;
|
||||
|
||||
// Das Antragsdatum kam erst später dazu; bestehende Threads holen es hier
|
||||
// nach, ohne dass ein vorhandener Wert überschrieben wird.
|
||||
const datumFehlt = existing.postedAt === null && thread.postedAt !== null;
|
||||
@@ -373,6 +402,7 @@ async function scanIntern(ctx: ActionContext): Promise<ForumScanSummary> {
|
||||
const geaendert =
|
||||
verschoben ||
|
||||
nachgetragen ||
|
||||
zuordnungKorrigieren ||
|
||||
datumFehlt ||
|
||||
profilFehlt ||
|
||||
existing.title !== thread.title ||
|
||||
@@ -394,6 +424,11 @@ async function scanIntern(ctx: ActionContext): Promise<ForumScanSummary> {
|
||||
...(datumFehlt ? { postedAt: thread.postedAt } : {}),
|
||||
...(profilFehlt ? { authorProfileUrl: thread.authorProfileUrl } : {}),
|
||||
...(nachgetragen ? { player: { connect: { id: playerId as number } } } : {}),
|
||||
...(zuordnungKorrigieren
|
||||
? playerId === null
|
||||
? { player: { disconnect: true } }
|
||||
: { player: { connect: { id: playerId } } }
|
||||
: {}),
|
||||
...(verschoben
|
||||
? {
|
||||
currentBoard: board,
|
||||
@@ -406,6 +441,8 @@ async function scanIntern(ctx: ActionContext): Promise<ForumScanSummary> {
|
||||
},
|
||||
});
|
||||
|
||||
if (zuordnungKorrigieren) summary.reassigned += 1;
|
||||
|
||||
if (verschoben) {
|
||||
historie.push({ threadId: thread.threadId, board });
|
||||
summary.movedThreads += 1;
|
||||
|
||||
Reference in New Issue
Block a user