Huebi Charity 9 hat für mich mit vielen Bugs begonnen...

Und das hat definitiv nichts damit zu tun, dass ich vor dem großen Live-Event nicht getestet habe. *hust*

Huebi Charity 9 hat für mich mit vielen Bugs begonnen...
Sticker von @Ikaika

Wie man vielleicht schon bei meinem letzten Post über das Huebi Charity Spendendashboard gemerkt haben könnte: Ich habe die Struktur der Snapshots / Donations komplett verändert. Das hatte im Grunde große Vorteile, da ich nun deutlich größere Freiheiten mit den Daten habe und nicht mehr in Stunden rechne. Blöderweise hat das allerdings auch Nachteile mit sich gebracht: Ich hatte ungetesteten Code. Eine Menge davon.

"Okay, dann teste halt einfach den Code und gut ist... Wo ist das Problem? Wieso der Post jetzt hier?"
- Du, möglicherweise (jetzt gerade)

Das war leider nicht so einfach möglich, da ich hier die API von TipeeeStream abfrage, ohne selbst einen Account dort zu haben, oder überhaupt Donations erstellen zu können. Gleichzeitig hab ich nur eine Datenbank: Live. Das bedeutet, dass ich jegliche Änderungen an der Datenbank auch direkt auf der Live Version des Dashboards mache. Mir ist bewusst, dass das blöd ist, aber es passt in meinen Use-Case, und daher mache ich das so.

Was ist überhaupt passiert?

Der Huebi Charity 9 Stream begann am 4. Januar 2025 um 13 Uhr. Der erste Task lief ohne Probleme - aber gut, der musste auch nur kurz in die Datenbank schauen und einen Snapshot für 0 Minuten mit 0 € setzen. Das ist hartcodiert, damit jeder Stream bei 0 € beginnt.

Also wartete ich auf das Ergebnis des Tasks um 13:15 Uhr. Falls irgendwas schiefgehen sollte, würde ich das ja dank Fehler-Webhook auf Discord merken. Also wartete ich... Und ich wartete... bis ich dann nach knapp zwei Minuten beschlossen habe, dass da irgendwas nicht stimmt. Also habe ich versucht, den Task lokal auf meinem System auszuführen. Da kam dann direkt der Fehler zum Vorschein!

Fehler 1: Vergessener Import

Der erste Fehler war, um ehrlich zu sein, etwas peinlich. Okay, ein Flüchtigkeitsfehler, der schnell mal passieren, aber auch schnell wieder behoben werden kann.

Ich nutze für den Task eine Klasse namens TipeeeAPI.php. Das ist eine einfache Klasse, die früher die API von TipeeeStream abgefragt hat. Da ich jetzt aber einen kleinen API Client mit einfachen Typen geschrieben habe, verwende ich eben dieses in der TipeeeAPI Klasse. Blöderweise hatte ich vergessen, hier den Client zu importieren, daher ist der Task abgebrochen.

Ein Sticker von meinem Drachen, wie er facepalmt.
Sticker von @Ikaika

Okay. Kann passieren. Aber hey, jetzt sollte das ja behoben sein und ich kann den Task lokal nochmal ausführen lassen.

...

Warte mal... Jetzt, wo ich in Minuten rechne, rundet der Task nicht mehr sauber auf 0,25 auf... Heißt, wenn ich den Task wenige Minuten nach 13:15 Uhr aktivieren würde, würde er das z.B. als Minute 27 eintragen - damit können meine Diagramme nicht umgehen.

Okay, dann nutze ich einfach $argv und falls ein Argument übergeben wird, nutze ich das als Zeit. Klar, hier könnte man noch irgendein Package nutzen, welches die Argumente deutlich sauberer übernimmt (und vielleicht sogar eine Hilfe-Seite anzeigt), aber in diesem Moment ging es für mich nur darum, so schnell wie möglich das Dashboard zu aktualisieren.

Als ich dann den Task lokal mit der richtigen Zeit - 15 Minuten seit Start - gestartet hatte, sind mir zwei weitere Fehler aufgefallen:

Fehler 2: Komische Startzeit

Die Startzeit des TipeeeStream API Abrufes war 03.01.2025 um ~21:00 Uhr. Eigentlich hätte es der 04.01.2025 um 12 Uhr sein sollen. Komisch.

I mean, es ist gewollt, dass die Zeit bisschen nach Vorne gestellt wird, da man so vorherige Spenden mitbekommt. Da ich hier keinen großen schlimmen Fehler gesehen habe, habe ich dieses Problemchen vorerst ignoriert.

Fehler 3: Spenden außerhalb des Zeitraums

Wie ich oben schon erwähnt habe, frage ich von TipeeeStream nur einen kurzen Zeitraum ab, um die Wartezeit so kurz wie möglich zu halten. Komischerweise dauerte der Request immer noch relativ lange. Da habe ich mir zuerst nichts bei gedacht und habe die Tabelle meiner Datenbank immer wieder aktualisiert. Als dann tatsächlich die ersten Spenden zur Tabelle hinzugefügt wurden, sah ich: TipeeeStream lieferte Spenden in einem Zeitraum vom 04. Dezember 2024 bis zur aktuellen Zeit. Das war absolut nicht das, was ich brauchte.

Nach ungefähr 30 Minuten debugging habe ich meinen guten Kumpel Kitsune_Yasu nach Hilfe gefragt. Wir haben die komplette API von TipeeeStream auseinander genommen, nochmal manuell per curl getestet, und sogar einen var_dump in GuzzleHTTP (die Web Library, die ich verwende) gesteckt, um irgendwie nachzuschauen, ob GuzzleHTTP irgendetwas mit dem Request kaputt macht.

Da haben wir dann herausgefunden: Ich hatte geschludert.

Exkurs: Wie funktioniert die TipeeeStream API?

Die TipeeeStream API ist relativ einfach gebaut. Ich werde nicht auf jeglichen Parameter hier eingehen, den die API besitzt, sondern nur die, die ich in diesem Fall genutzt habe. Weitere Infos zur API kann man hier finden.

Man kann verschiedene Events (wie Spenden, Abos, ...) über u.A. die URL https://api.tipeeestream.com/v1.0/events abfragen. Dabei muss man dann folgende Variablen als Parameter in die Abfrage geben:

type[0]: donation
limit: 0
apiKey: <<apiKey>>
start: "2025-01-04T12:00:00+01:00"
end: "2025-01-04T13:15:00+01:00"

Dieses Beispiel gibt einem alle Spenden zwischen vom 4. Januar 2025 zwischen 12:00 und 13:15 Uhr aus.

Der eigentliche Fehler

Okay, jetzt wissen wir, wie man die TipeeeStream API theoretisch nutzt. Und wie habe ich es in der Praxis verwendet?

$response = $this->httpClient->get(
    "/v1.0/events",
    [
        'query' => [
            'apiKey' => $this->apiKey,
            'type' => array_map(fn(EventType $eventType) => $eventType->value, $types),
            'limit' => $limit,
            'from' => $from?->format('Y-m-d\TH:i:sO') ?? null,
            'to' => $to?->format('Y-m-d\TH:i:sO') ?? null
        ]
    ]
);

Na, sieht irgendwas komisch aus? Nein? Achte mal auf die Zeitangaben...

Genau! TipeeeStream braucht start und end, währenddessen ich from und to verwendet habe. Das... ist ein ziemlich peinlicher Fehler, für den ich knapp 1,5 Stunden zum Finden gebraucht habe...

Ein Sticker von meinem Drachen, wie er seinen Kopf auf einen Tisch schlägt.
Sticker von @Ikaika

Wie konnte mir das passieren?

Da fragt man sich natürlich sofort, wie einem so etwas passieren kann. Ich hatte auf dem zweiten Bildschirm Hoppscotch (ein API Debugging Tool) laufen, und hätte eigentlich nur davon, oder von der TipeeeStream API Dokumentation abschreiben müssen. Theoretisch hätte ich auch einfach den Code von der originalen TipeeeAPI.php Klasse kopieren und anpassen können.

Zum Glück weiß ich genau, wie das passiert ist. Und die Antwort könnte dümmer nicht sein... Es war KI.

Zu meiner Verteidigung: Ich verwende weder GitHub Copilot, noch diese große JetBrains KI. Ich habe nur die lokale KI am Laufen, die kontextbasiert einzelne Zeilen vervollständigen kann. Das ist meiner Meinung nach der einzige faire Weg, KI zu benutzen.

Da ich meine Variablen in der Funktion $from und $to genannt habe, weil ich das einfach angenehmer finde, und ich einfach von den Argumenten die Parameter abgetippt habe - mit der Hilfe von KI - habe ich hier einfach geschlafen und nicht gemerkt, dass das nicht stimmt.

In den kleinen Tests, die ich außerhalb von Huebi Charity machen konnte, lief die API auch. Also gabs da augenscheinlich keine Probleme.

Ende Gut, Alles Gut?

Als der Fehler mit der API dann behoben war, war ich bereit, die Task mehrfach hintereinander ausführen zu lassen, um die knapp 2 Stunden nachzuholen.

Da ist mir aber noch Fehler 2, also diese Startzeit, eingefallen. Ich wollte nachschauen, wo hier das Problem lag. Es stellt sich heraus: Der Fehler war ziemlich simpel.

Ich hatte ja die Zeitberechnung von Stunden auf Minuten geändert. Da habe ich wohl übersehen, eine Berechnung anzupassen. Die hatte also gedacht, dass Minuten = Stunden sind. Das ist natürlich falsch.

Damit mir das nicht nochmal passieren konnte, hat mir Kitsune_Yasu Carbon für Zeitberechnung empfohlen. So brauchte ich die Minuten nicht mehr in Stunden und Rest-Minuten umzurechnen, sondern konnte direkt Minuten zu einer Zeit hinzufügen bzw. subtrahieren.

Jetzt aber, Fertig!

Ab hier habe ich nur noch einzelne Typen-Probleme behoben und sonst noch kleine Sachen hinzugefügt, wie z.B. ein Spenden-Knopf. Ist alles nicht so wirklich nennenswert.

Was allerdings nennenswert ist, ist, dass zum Zeitpunkt der Veröffentlichung dieses Posts noch der Huebi Charity Livestream läuft. Das heißt, wenn du das Dashboard in Aktion sehen möchtest, kann ich dir sehr empfehlen, es dir mal anzuschauen und.. hey, vielleicht hast du ja Lust, auch etwas für den guten Zweck zu spenden! 😁

Huebi Charity 9 Spendendashboard
Ein Spendenverlauf von allen Huebi Charitys.
❤️
Danke an Violet, Tuxel und Finn für's Korrekturlesen!