AntiSpamManager.messagesByUser ist eine normale HashMap<User, Integer>, die von mehreren
JDA-Event-Threads parallel beschrieben wird (nicht thread-safe, mögliche Lost Updates).
Zusätzlich wird der Timeout + die DM-Benachrichtigung bei jeder weiteren Nachricht erneut
ausgelöst, sobald der Schwellenwert (> 5) einmal überschritten wurde:
if (messagesByUser.get(event.getAuthor()) > 5) {
// timeoutUntil(...) + DM -> läuft bei jeder weiteren Nachricht erneut!
}
Vorschlag:
- Thread-sichere Datenstruktur verwenden (z. B. `ConcurrentHashMap` + `AtomicInteger`, oder
computeIfAbsent/merge statt containsKey/replace)
- Zähler nach dem Bestrafen zurücksetzen, damit die Aktion nur einmal pro Vorfall ausgelöst wird
AntiSpamManager.messagesByUserist eine normaleHashMap<User, Integer>, die von mehrerenJDA-Event-Threads parallel beschrieben wird (nicht thread-safe, mögliche Lost Updates).
Zusätzlich wird der Timeout + die DM-Benachrichtigung bei jeder weiteren Nachricht erneut
ausgelöst, sobald der Schwellenwert (
> 5) einmal überschritten wurde:Vorschlag:
computeIfAbsent/mergestatt containsKey/replace)