Seite 1 von 1

Counter in Discord Bot

Verfasst: Sonntag 9. September 2018, 17:45
von Phobit
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...

Re: Counter in Discord Bot

Verfasst: Sonntag 9. September 2018, 18:16
von Sirius3
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.

Re: Counter in Discord Bot

Verfasst: Sonntag 9. September 2018, 18:25
von __blackjack__
@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.