Discord Bot mit ZaehlerKlasse

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.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Hier der on_message Code:

Code: Alles auswählen

# hier der Befehlsregistrierung, die cmds werden weiter oben impotiert
commands = {

    "ping": cmd_ping,
    "autorole": cmd_autorole,
    "support": cmd_support,
    "help": cmd_help,
    "help2": cmd_help2,
    "clear": cmd_clear,
    "map": cmd_map,
    "info": cmd_info,
    "wer": cmd_wer,
    "sippe": cmd_sippe,
    "presence": cmd_presence

}
@client.event
async def on_message(message):
    if message.content.startswith(STATICS.PREFIX):
        invoke = message.content[len(STATICS.PREFIX):].split(" ")[0]
        args = message.content.split(" ")[1:]
        if commands.__contains__(invoke):
            cmd = commands[invoke]
            try:
                if not perms.check(message.author, cmd.perm):
                    await client.send_message(message.channel, embed=Embed(color=Color.red(), description="Fehlende Berechtigung zur Ausführung des Befehls!"))
                   
                    
            except:
                await cmd.ex(args, message, client, invoke)
                pass
            
            
        else:
            await client.send_message(message.channel, embed=Embed(color=Color.red(), description="Der Befehl **%s** wurde falsch geschreiben oder ist nicht verfügbar" % (invoke)))
Und hier dann der cmd_presence:

Code: Alles auswählen

from functools import partial
import itertools
from discord import Game
import time

perm = 2

async def ex(args, message, client, invoke, names):
    await client.change_presence(game=Game(name=next(names)))

preferences = ["Lotro", "Lotro2", "Lotro3"]
preferences(partial(ex, names=itertools.cycle(preferences)))
Und hier weiß ich eben nicht was da statt dem prefeerences am Ende hinsoll. Nochmal ex klappt nicht, da ihm dann args,message,client und invoke fehlen...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ach, die cmd_xy sind Module! Da muß man auch erst mal drauf kommen.

Einen String zwei mal zu splitten, um mal den ersten Teil mal den Rest zu verwenden, ist nicht nur Rechenzeitverschwendung sondern auch schwierig zu lesen.
Magic-Methods ruft man nicht direkt auf, hier benutzt man einfach den in-Operator.
Nackte Excepts nicht verwenden, weil das alles abfängt auch viele Programmierfehler. Welchen Fehler erwartest Du denn im try-Block? Ich kann keinen erkennen. ex sollte also besser handle_exception heißen, da es aber gar nicht den Fehler als Argument bekommt, wie soll dann eine sinnvolle Fehlerbehandlung funktionieren?
Das `pass` ist dann überflüssig.

Code: Alles auswählen

@client.event
async def on_message(message):
    invoke, *args = message.content.split(" ")
    if invoke.startswith(STATICS.PREFIX):
        try:
            try:
                cmd = commands[invoke[len(STATICS.PREFIX):]]
            except KeyError as err:
                raise RuntimeError("Der Befehl **%s** wurde falsch geschreiben oder ist nicht verfügbar" % err.args)
            else:
                try:
                    if not perms.check(message.author, cmd.perm):
                        raise RuntimeError("Fehlende Berechtigung zur Ausführung des Befehls!")
                    # was passiert hier?
                except SpecificException as err:
                    await cmd.handle_exception(args, message, client, invoke)
        except RuntimeError as err:
            await client.send_message(message.channel, embed=Embed(color=Color.red(), description=err.args[0]))
Da Du sowieso alles mit globalen Variablen machst, kannst Du das names auch noch global lassen.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Ja, hätte dazusagen sollen dass es Module sind, my bad :)

Ich möchte nicht unhöflich wirken, aber jetzt ist der Bot eben bis auf den einen Befehl eigentlich fertig und läuft flüssig, sauber und einwandfrei, also werde ich jetzt nichts mehr ändern was nicht "lebensnotwendig" ist, also wodurch der Bot nicht mehr funktionieren würde etc...

Bei dem Try-Except Block kommt ein permission system ins Spiel, werd ich jetzt aber nicht schicken da das mit dem eigentlichen Problem nichts mehr zu tun hat...
Das System versucht zu überprüfen, ob der Bentzer die benötogte "perm" Stufe hat (über eine .json geregelt) und sagt nein wenn jemand die Stufe nicht besitzt, und (except) lässt es einfach durchlaufen wenn die Perms passen. Kann man sicher schöner/effizienter regeln, aber wie gesagt, es läuft und ich möchte jetzt am "Main" nich mehr viel rumschrauben.



Blos das ganze hat mir jetzt immer noch nicht beantwortet, was in den cmd_presence an die Stelle muss:

Code: Alles auswählen

preferences(partial(ex, names=itertools.cycle(preferences)))
Weil selbst ch weiß dass da preferences komplett falsch ist ;) ^^
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit welcher Logik bedeutet eine Ausnahme, dass jemand die nötigen Berechtigungen besitzt?
Das ist weit weg von sauber und einwandfrei.

Logisch wäre zum Beispiel das:

Code: Alles auswählen

    if perms.check(message.author, cmd.perm):
        await cmd.action(args, message, client, invoke)
    else:
        raise RuntimeError("Fehlende Berechtigung zur Ausführung des Befehls!")
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Aber wie jetzt auch schon mehrmals erwähnt, hat das NICHTS mit meinem eigentlichen Problem zu tun...?!
Das ganze wirft keinen fatalen Error, der Bot läuft einwandfrei und ohne Probleme wie auch oben schon erwähnt und mir geht es jetzt nur noch um das in der ersten Nachricht erwähnte Problem, dass ich auch an dieser Stelle im letzten Post nochmal erwähnt habe:
Blos das ganze hat mir jetzt immer noch nicht beantwortet, was in den cmd_presence an die Stelle muss:

preferences(partial(ex, names=itertools.cycle(preferences)))
Weil selbst ch weiß dass da preferences komplett falsch ist ;) ^^
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich denke, Deine Weigerung, Python zu lernen, hat schon etwas damit zu tun, ob Du Probleme selbständig lösen kannst oder nicht.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Was heisst jetzt hier "lernen", das Programm funktioniert ja, es gibt keinen Error also kann es scheiss egal sein, klar ist es nicht schön, und wenn ich in Zukunft mal diesen Fehler mache werde ich mich an diesen Thread erinnern.


Könnte jetzt BITTE mir jemand diese simpleeste Frage aller Fragen beantworten? oder mir wenigstens einen (am besten deutschen) Link schicken wo ich genau DIESE Frage nachlesen kann, die ich jetzt hier seit 5 Tagen stelle?






PS: und wenn hier jeder Python komplett gelernt hätte würde es dieses Forum ja gar nicht geben ;) Also zumindest in der jetzigen Form nicht ^^
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Das Forum würde es auch nicht geben wenn jeder so unwillig gewesen wäre Python zu lernen wie Du, weil dann keiner jemand anderem hätte helfen können. ;-)

Deine Frage wurde beantwortet. Du musst jetzt nur noch Python so weit lernen bis Du die Antwort anwenden kannst. Einen Link auf genau DIESE *Frage* ist übrigens dieses Thema hier, wo Du ja genau diese Frage gestellt hast. :-P Falls Du einen Link auf eine Lösung die Du ohne sie zu verstehen einfach blind kopieren kannst, erwartest: Mal sehen ob das jemand für Dich macht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Falls Du einen Link auf eine Lösung die Du ohne sie zu verstehen einfach blind kopieren kannst, erwartest: Mal sehen ob das jemand für Dich macht.
Naja, bisher lief das in diesem Forum irgendwie so ;) gut, dann werd ich mal nochmal schaun aber ich wette ich finde in diesem Thread auch nichts was mir wirlich weiterhilft...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Kann mir wenigstens jemand schnell ein Stichwort geben, was da hin muss, oder es am besten EINFACH SCHNELL SCHREIBEN, ich meine ihr habt mir oben diesen Ansatz gegeben, und jetzt brauch ich Hilfe weil ihn nicht verstehe, wie mache ich diesen Callback?

Code: Alles auswählen

async def ex(args, message, client, invoke, names):
    await client.change_presence(game=Game(name=next(names)))

preferences = ["Pre1", "Pre2", "Pre3"]
ex(partial(ex, names=itertools.cycle(preferences)))
Hier schreibt er hin im fehlen bei der ex(partial) Zeile die Argumente message, client, invoke, logisch, aber wenn ich jetzt diese Hinschreibe:

Code: Alles auswählen

ex(partial(ex, names=itertools.cycle(preferences, message, client, invoke)))
Sagt er message (und auch die anderen) sind nicht defined, und langsam weiß ich echt nicht emhr weiter, weder was ich tun soll noch was ich googlen soll noch sonst irgendwas...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Phobit hat geschrieben: Samstag 22. September 2018, 15:03 ich meine ihr habt mir oben diesen Ansatz gegeben
Da dachte hier auch noch jeder, Du würdest mit irgendeiner Art Callbacks arbeiten und nicht mit Modulen.

Ab einer gewissen Komplexität muß man einfach die Grundlagen kennen, bevor man selbständig eine Lösung finden kann.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Ja und was für Grundlagen wären das?


ich verstehe das ganze Problem nicht, ich bin jetzt locker 3 Monaten auf diesem Forum, bis jetzt lief es immer so dass man sein Problem geschilder tund seinen Code gepostet hat, danach wurde einem soweit Möglich eine Lösung gezeigt oder wenigsten gut bis zur Lösung verholfen, jetzt schildere ich mein Problem und poste meinen Code und eure Lösung ist es diesen Thread unendlich in die Länge zu ziehen indem ihr mir nur sagen wollt dass es an den Grundlagen hapert?!


WELCHE Grundlagen genau?!?!
An if clauses wirds ja z.B. wohl eher nicht liegen, oder? :---------)
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann hast Du die letzten drei Monate etwas falsch verstanden. Du solltest nicht nur abschreiben, sondern verstehen, was die Lösung ist. Die Grundlagen sind also alles das, was Du bisher nicht verstanden hast.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Ich verstehe aktuell diese eine Sache nicht, deswegen habe ich mich an das Forum gewendet. Aber scheinbar verstehts dort ja auch keiner, zumindest sehe ich immer noch niemanden der fähig dazu ist zu helfen...?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Niedlicher Trollversuch. Der Einzige in diesem Thema der nicht fähig ist das zu lösen bist Du. Das kannst letztlich auch nur Du ändern, in dem Du lernst wie man selbst programmiert, und nicht nur fertige Lösungen abschreibt, ohne sie zu verstehen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Und wie bereits oben erwähnt, habe ich scheinbar bisher alles dank eurer Hilfe verstanden, nur so ein Problem kam mir noch nie unter, deswegen schreibe ich ja hier im Forum.


Und anstatt dass ihr hier auf meine angeblichen "Niedlichen Trollversuch" eingeht, könntet ihr mir auch einfach helfen.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Also ich kann Dir nicht helfen. Keine Ahnung wie man Dich motivieren kann zu lernen. :-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Das ist doch jetzt wenigstens mal ne Antwort...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

So,
habe jetzt endlich ne funktionierende Lösung. (Falls noch wer den Thread liest, lol)

Code: Alles auswählen

with open("test.txt", "r+") as f:
            s = f.readlines()
            f.seek(0)
            await client.change_presence(game=Game(name=s[0]))
            Speicher = s[0]
            del s[0]
            f.writelines(s)
            f.writelines(PresenceSave)
Vllt nicht -wie immer- der Schönste Code, aber er läuft unter jeder Bedingung einwandfrei.

(Zum Verständnis: Die verschiedenen Presences sind in einer TXT gespeichert, und bei jedem Befehlsaufruf wird die erste Zeile, also der erste Presence als Presence gewählt, gelöscht und am Ende wieder angehängt. So zykelt es schön und sauber durch :-))
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Da fällt mir Clementine ein: "sauber ist nicht rein" ...
Antworten