- Betroffene Version
- WoltLab Suite 5.5
- Betroffene App
- WoltLab Suite Core
Ich bin der Meinung, dass die Trophäenbedingungen nicht korrekt funktionieren und dies basierend auf dem GitHub-Verlauf auch bereits länger der Fall ist. Falls tatsächlich ein Fehler vorliegt, könnte dieser auch für Meldungen wie bspw. Hinweis Bedingung Trophäe funktioniert nicht oder Hinweise werden nicht korrekt angezeigt verantwortlich sein.
Aufgefallen ist mir das Problem in einem Szenario, in dem ein Hinweis auf bestimmten Seiten angezeigt werden soll und dies auch nur, wenn ein Benutzer die Trophäe X besitzt und die Trophäe Y nicht besitzt. Das Resultat war, dass der Hinweis nicht angezeigt wurde, obwohl die Anforderungen erfüllt waren.
Ich habe mich dann auf die Suche begeben und folgendes festgestellt:
Meiner Meinung nach werden in UserTrophyCondition::checkUser(...) ab Zeile 106 falsche IDs für die Prüfung verwendet. Die Variable $trophyIDs wird dort mit den userTrophyIDs aus der UserTrophyList befüllt (wcf1_user_trophy).
Es müssten aber eigentlich die Trophäen-IDs verwendet werden, weil diese geprüft werden sollen:
Da $trophyIDs die IDs der Trophäen-Zuweisungen enthält ist sowohl die Prüfung für, als gegen den Besitz einer Trophäe unvorhersehbar fehlerhaft. Das Ergebnis des Abgleichs mit den Trophäen-IDs aus $condition->conditionData['userTrophyIDs'] und $condition->conditionData['notUserTrophyIDs'] ist purer Zufall. Diese Nebenwirkungen führen oftmals auch zu einem korrekten Verhalten (gerade bei wenig Trophäen und Aktivität), aber die Wahrscheinlichkeit dafür sinkt mit jeder Trophäen-Vergabe.
Das Problem ist in einer frischen Installation leicht zu reproduzieren.
- Trophäe erstellen (ID: 1)
- Hinweis erstellen mit der Bedingung, dass ein Benutzer Trophäe 1 besitzt
- Trophäe an Benutzer vergeben -> Hinweis wird angezeigt, da in $trophyIDs eine 1 für die erste Zuweisung zu finden ist
- Trophäe entziehen und neu vergeben -> Hinweis wird nicht mehr angezeigt, da es sich nun um die zweite Zuweisung handelt, aber nach Trophy-ID 1 gesucht wird
Eventuell habe ich etwas übersehen oder mein Debug-Skript ist nicht korrekt, aber im Prinzip stammt der Code aus dem NoticeHandler und der UserTrophyCondition.