Forums-Anträge erfassen und von Hand entscheiden
Der GExtension-Abgleich liefert die Käufe, der Verbrauch steht im Forum. Die App liest jetzt die drei CC-Boards und sammelt die Anträge. Gelesen wird nur die Board-Übersicht: sie führt bereits den Ersteller, nicht nur den letzten Antwortenden. Damit bleibt ein Lauf bei wenigen Anfragen statt einer je Thread. Unterforen und globale Kästen tragen ebenfalls Thread-Links, deshalb liest der Parser strikt entlang der Listeneinträge - sonst landen Changelogs und Bewerbungen in der Antragsliste. Klassifiziert wird ausschließlich von Hand. Weder Titel noch Board sind verlässlich genug: Threads werden nicht immer verschoben, ein genehmigter Antrag kann weiter im Antrags-Board liegen. Das Board steht deshalb nur als Hinweis an der Zeile. Angenommene Anträge rufen dieselben Aktionen wie die Knöpfe auf der Spielerseite, es gibt keinen zweiten Buchungsweg mit eigenen Regeln. Wandert ein bereits entschiedener Thread später in ein anderes Board, erscheint das als Hinweis zum Abhaken - der CC-Status ändert sich nie von allein. Die Thread-ID bleibt beim Verschieben stabil und traegt deshalb die Wiedererkennung; die Board-Historie wird mitgeschrieben. Zurückgelassene Verweise erkennt der Parser und zählt sie nicht als eigenen Antrag.
This commit is contained in:
@@ -46,6 +46,19 @@ enum ProductTarget {
|
||||
IGNORE
|
||||
}
|
||||
|
||||
enum ForumBoard {
|
||||
CUSTOM_CHARACTERS
|
||||
AKTIVE_CCS
|
||||
CC_ARCHIV
|
||||
}
|
||||
|
||||
enum ForumClassification {
|
||||
NEW_CC
|
||||
REDESIGN
|
||||
REJECTED
|
||||
IGNORE
|
||||
}
|
||||
|
||||
enum ImportStatus {
|
||||
PENDING
|
||||
COMMITTED
|
||||
@@ -101,10 +114,11 @@ model Player {
|
||||
gextensionUsage Int?
|
||||
gextensionSyncedAt DateTime?
|
||||
|
||||
ledger CreditLedger[]
|
||||
characters Character[]
|
||||
orders ImportedOrder[]
|
||||
unmatched UnmatchedPackage[]
|
||||
ledger CreditLedger[]
|
||||
characters Character[]
|
||||
orders ImportedOrder[]
|
||||
unmatched UnmatchedPackage[]
|
||||
forumThreads ForumThread[]
|
||||
|
||||
@@index([displayName])
|
||||
}
|
||||
@@ -191,6 +205,7 @@ model Character {
|
||||
successors Character[] @relation("CharacterLineage")
|
||||
|
||||
ledgerEntries CreditLedger[]
|
||||
forumThreads ForumThread[]
|
||||
|
||||
createdById Int?
|
||||
createdBy User? @relation("CharacterCreatedBy", fields: [createdById], references: [id], onDelete: SetNull)
|
||||
@@ -290,3 +305,55 @@ model AuditLog {
|
||||
@@index([targetType, targetId])
|
||||
@@index([actorUserId])
|
||||
}
|
||||
|
||||
/// Ein CC-Antrag im Forum. Die Thread-ID bleibt stabil, auch wenn der Thread
|
||||
/// in ein anderes Board verschoben wird - deshalb ist sie der Schlüssel und
|
||||
/// nicht die Board-Zugehörigkeit.
|
||||
model ForumThread {
|
||||
threadId Int @id
|
||||
title String
|
||||
url String
|
||||
|
||||
authorName String?
|
||||
/// Überlebt Namensänderungen im Forum, anders als der Anzeigename.
|
||||
authorForumId Int?
|
||||
|
||||
playerId Int?
|
||||
player Player? @relation(fields: [playerId], references: [id], onDelete: SetNull)
|
||||
|
||||
currentBoard ForumBoard
|
||||
firstSeenAt DateTime @default(now())
|
||||
lastSeenAt DateTime @default(now())
|
||||
lastBoardChangeAt DateTime?
|
||||
|
||||
/// Bleibt leer, bis ein Mensch entschieden hat. Es gibt bewusst keine
|
||||
/// Vorbelegung aus Titel oder Board - beides ist nicht verlässlich genug.
|
||||
classification ForumClassification?
|
||||
needsClassification Boolean @default(true)
|
||||
classifiedById Int?
|
||||
classifiedAt DateTime?
|
||||
|
||||
linkedCharacterId Int?
|
||||
linkedCharacter Character? @relation(fields: [linkedCharacterId], references: [id], onDelete: SetNull)
|
||||
|
||||
/// Ein bereits entschiedener Thread ist in ein anderes Board gewandert.
|
||||
/// Reine Gedächtnisstütze, löst nie eine Buchung aus.
|
||||
boardChangeNotice Boolean @default(false)
|
||||
|
||||
history ForumThreadBoard[]
|
||||
|
||||
@@index([needsClassification])
|
||||
@@index([playerId])
|
||||
@@index([currentBoard])
|
||||
}
|
||||
|
||||
/// Wann lag ein Thread in welchem Board. Für Streitfälle nachvollziehbar.
|
||||
model ForumThreadBoard {
|
||||
id Int @id @default(autoincrement())
|
||||
threadId Int
|
||||
thread ForumThread @relation(fields: [threadId], references: [threadId], onDelete: Cascade)
|
||||
board ForumBoard
|
||||
observedAt DateTime @default(now())
|
||||
|
||||
@@index([threadId])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user