Wikipedia Diskussion:WikiProjekt Begrüßung von Neulingen/Technik

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Statistik-Dashboard[Quelltext bearbeiten]

@FNDE: Ein immer aktuelles Statistik-Dashboard wäre echt super. Ich könnte dir die Listen der Begrüßten und die Kontrollgruppe im Redis auf der Toolforge bereitstellen. Dann wäre das Statistik-Dashboard ansonsten von der Botprogrammierung unabhängig. Was hältst du davon?
Wir können uns auch im IRC oder im Wikimedia Community Discord absprechen.
Maintainer des Toolaccounts dewikigreetbot bist du jetzt auch. --Count Count (Diskussion) 16:34, 22. Nov. 2019 (CET)Beantworten

Cool! Habe vorher noch nicht mit Redis gearbeitet, ist das easy mit der Connection? Die Python Library sieht ja erstmal simpel aus, da koennte man also was mit Flask oder so machen. --FNDE 19:26, 22. Nov. 2019 (CET)Beantworten

Redis ist eine ganz einfache Schlüssel-Werte-Datenbank. Hier ist der ganze Code der Einbindung schon inklusive Funktionen um die Liste der begrüßten Benutzer und die Kontrollgruppe wieder herauszuholen:

class RedisDb:
    def __init__(self, secret: str) -> None:
        self.secret = secret
        self.redis = Redis(host="tools-redis" if os.name != "nt" else "localhost", decode_responses=True)

    def getKey(self, greetedUser: str) -> str:
        return f"{self.secret}:greetedUser:{greetedUser}"

    def addGreetedUser(self, greeter: str, user: str) -> None:
        key = self.getKey(user)
        p = self.redis.pipeline()  # type: ignore
        p.set(key, greeter)
        p.sadd(f"{self.secret}:greetedUsers", user)
        p.expire(key, timedelta(days=30))
        p.execute()

    def addControlGroupUser(self, user: str) -> None:
        self.redis.sadd(f"{self.secret}:controlGroup", user)  # type: ignore

    def getAndRemoveGreetedUserFromRedis(self, user: str) -> Optional[str]:
        key = self.getKey(user)
        greeter = self.redis.get(key)
        if greeter:
            self.redis.delete(key)  # type: ignore
        return cast(Optional[str], greeter)

    def getAllGreetedUsers(self) -> List[str]:
        return cast(List[str], self.redis.smembers(f"{self.secret}:greetedUsers"))  # type: ignore

    def getAllControlGroupUsers(self) -> List[str]:
        return cast(List[str], self.redis.smembers(f"{self.secret}:controlGroup"))  # type: ignore

Das secret ist notwendig, da es nur eine Redis-Instanz für allen Tools gibt, sich also alle den Namensraum teilen. --Count Count (Diskussion) 21:04, 22. Nov. 2019 (CET)Beantworten

Ja cool. Wenn wir eine zeitbasierte Auswertung machen, brauchen wir aber noch einen Key mit Timestamp - oder ist der bereits vorhanden? --FNDE 14:19, 25. Nov. 2019 (CET)Beantworten
Im Moment nicht, kann ich aber leicht einbauen. --Count Count (Diskussion) 13:03, 26. Nov. 2019 (CET)Beantworten