Rollen neu geschnitten, Seitenzahl korrigiert, frühere Konten
Der Forums-Abgleich las von 25 Archivseiten nur zwei. WoltLab verlinkt in der Blätterleiste nur die Nachbarseiten und führt die Gesamtzahl in einem eigenen Element; ausgewertet wurden aber die Links. Alles jenseits von Seite zwei war damit unsichtbar - etwa ein Antrag auf Seite vier, der deshalb nie ankam. Die Rollen verlaufen jetzt zwischen erfassen und gewähren statt zwischen Alltag und Verwaltung: Editoren erfassen Käufe und führen Datei-Import, GExtension- und Forums-Abgleich samt Entscheidung über Anträge durch. Kulanz zu vergeben bleibt Administratoren, ebenso das Auflösen unklarer Pakete, weil dabei Kulanz entstehen kann. Dazu lassen sich frühere Steam- und Forumskonten am Spieler hinterlegen. Abgleich und Import prüfen sie mit, sodass ein Kontowechsel die Zuordnung nicht abreißen lässt. Steam-Kennungen werden dabei auf dieselbe Form gebracht wie die Hauptangabe, und eine Kennung kann nicht zwei Spielern gehören.
This commit is contained in:
@@ -14,7 +14,9 @@ export const BOARDS: { board: ForumBoard; path: string }[] = [
|
||||
];
|
||||
|
||||
const MIN_REQUEST_GAP_MS = 1000;
|
||||
const MAX_PAGES_PER_BOARD = 20;
|
||||
// Das Archiv reicht Jahre zurück; bei einer Sekunde Abstand dauert ein voller
|
||||
// Lauf entsprechend. Die Grenze ist eine Notbremse, keine Sparmaßnahme.
|
||||
const MAX_PAGES_PER_BOARD = 60;
|
||||
let lastRequestAt = 0;
|
||||
|
||||
async function throttle(): Promise<void> {
|
||||
@@ -87,12 +89,25 @@ export async function scanForum(ctx: ActionContext): Promise<ForumScanSummary> {
|
||||
failedBoards: [],
|
||||
};
|
||||
|
||||
// Forumsnamen einmal laden statt je Thread zu suchen.
|
||||
const players = await prisma.player.findMany({
|
||||
where: { forumName: { not: null } },
|
||||
select: { id: true, forumName: true },
|
||||
});
|
||||
const byForumName = new Map(players.map((p) => [(p.forumName as string).toLowerCase(), p.id]));
|
||||
// Forumsnamen einmal laden statt je Thread zu suchen - die aktuellen und
|
||||
// frühere Konten, damit ein Namenswechsel die Zuordnung nicht abreißen lässt.
|
||||
const [players, aliases] = await Promise.all([
|
||||
prisma.player.findMany({
|
||||
where: { forumName: { not: null } },
|
||||
select: { id: true, forumName: true },
|
||||
}),
|
||||
prisma.playerAlias.findMany({
|
||||
where: { type: 'FORUM_NAME' },
|
||||
select: { playerId: true, value: true },
|
||||
}),
|
||||
]);
|
||||
|
||||
const byForumName = new Map<string, number>();
|
||||
for (const alias of aliases) byForumName.set(alias.value.toLowerCase(), alias.playerId);
|
||||
// Die Hauptangabe zuletzt, damit sie einen gleichlautenden Alias übersticht.
|
||||
for (const player of players) {
|
||||
byForumName.set((player.forumName as string).toLowerCase(), player.id);
|
||||
}
|
||||
|
||||
for (const { board, path } of BOARDS) {
|
||||
let threads: ForumThread[] = [];
|
||||
@@ -310,6 +325,9 @@ export async function classifyThread(
|
||||
|
||||
let characterId: number | null = null;
|
||||
|
||||
// Eine Entscheidung kann Kulanz verbrauchen. Das Vergeben von Kulanz ist
|
||||
// Admins vorbehalten, das Verbrauchen nicht - hier wird also nur gebucht,
|
||||
// was der Spieler bereits hat.
|
||||
if (input.classification === ForumClassification.REACTIVATION) {
|
||||
if (input.characterId === undefined) {
|
||||
throw badRequest('NO_CHARACTER', 'Bitte angeben, welcher CC zurückkehrt');
|
||||
|
||||
Reference in New Issue
Block a user