Counter in Discord Bot

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Hallo,
ich möchte das mein DiscordBot bei Aufruf eines gewissen Befehls 1 zu einem Counter hinzuaddiert. D.H. bei erstem Befehlsaufruf ist der Counter 1, bei einem erneuten wird er zu 2, etc... Ist er bei 5 angelangt, soll alles wieder zurückgesetzt werden.
Hier mein (nicht funktionierender) Code Schnipsl:

Code: Alles auswählen

async def ex(message, client, invoke, args):
    counter =+ 1
    print(counter)
    if counter == "1":
        await client.change_presence(game=Game(name="Presence1"))
    elif counter == "2":
        await client.change_presence(game=Game(name="Presence2"))
    elif counter == "3":
        await client.change_presence(game=Game(name="Presence3"))
    elif counter == "4":
        await client.change_presence(game=Game(name="Presence4"))
    elif counter == "5":
        await client.change_presence(game=Game(name="Presence5"))
    else:
        await client.send_message(message.channel, "Gehe zurück zu null!")
Hat jemand die Lösung :K?
Aktuell gibt er immer 1 aus...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was erwartest Du? Du setzt die Variable `counter` auf 1, wobei man der Klarheit wegen das Leerzeichen vor das `+` setzt und nicht dahinter: `counter = +1`.
Die Vergleiche schlagen auch immer fehl, weil counter eine Zahl ist und Du mit Strings vergleichst.

Wenn Du einen Zustand über das Ende einer Funktion hinaus speichern willst, brauchst Du eine Klasse und Methoden.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Bei dem Code ist `counter` immer 1 weil Du dem Namen +1 zuweist. Das ``+`` könntest Du da auch einfach weg lassen, das würde das gleiche bedeuten denn ``counter =+ 1`` ist das gleiche wie ``counter = +1`` ist das gleiche wie ``counter = 1``.

Als nächstes landest Du *immer* im ``else``, denn eine Zahl ist immer ungleich einer Zeichenkette. Auch wenn die Zeichenkette zufällig die Ziffern enthält, die diese Zahl als Dezimalzahl darstellen.

Code: Alles auswählen

In [39]: 42 == '42'
Out[39]: False
Die vielen ``if``/``elif``-Zweige sind umständlich weil sie ja alle im Grunde das gleiche enthalten. Die Zeile unterscheidet sich nur durch ein Zeichen, was dann auch noch genau der Zeichenkettendarstellung vom Wert von `counter` entspricht. Den vorhandenen Code kann man also auch so ausdrücken:

Code: Alles auswählen

    if 1 <= counter <= 5:
        await client.change_presence(game=Game(name=f'Presence{counter}'))
    else:
        await client.send_message(message.channel, 'Gehe zurück zu null!')
Zum `counter`-Problem: Dafür braucht man objektorientierte Programmierung um das sauber zu lösen. Denn Du willst Dir dort Zustand (den Zähler) über Aufrufe hinweg merken.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten