Seite 1 von 2

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Mittwoch 19. September 2018, 17:14
von Phobit
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...

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Mittwoch 19. September 2018, 18:52
von Sirius3
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.

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Mittwoch 19. September 2018, 20:08
von Phobit
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 ;) ^^

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Mittwoch 19. September 2018, 21:00
von Sirius3
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!")

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Donnerstag 20. September 2018, 17:03
von Phobit
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 ;) ^^

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Donnerstag 20. September 2018, 21:24
von Sirius3
Ich denke, Deine Weigerung, Python zu lernen, hat schon etwas damit zu tun, ob Du Probleme selbständig lösen kannst oder nicht.

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Freitag 21. September 2018, 16:12
von Phobit
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 ^^

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Freitag 21. September 2018, 19:08
von __blackjack__
@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.

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 14:04
von Phobit
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...

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 15:03
von Phobit
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...

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 15:42
von Sirius3
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.

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 16:24
von Phobit
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? :---------)

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 16:34
von Sirius3
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.

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 17:09
von Phobit
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...?

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 17:18
von __blackjack__
@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.

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 17:43
von Phobit
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.

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Samstag 22. September 2018, 18:11
von __blackjack__
@Phobit: Also ich kann Dir nicht helfen. Keine Ahnung wie man Dich motivieren kann zu lernen. :-)

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Sonntag 23. September 2018, 10:57
von Phobit
Das ist doch jetzt wenigstens mal ne Antwort...

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Dienstag 2. Oktober 2018, 17:31
von Phobit
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 :-))

Re: Discord Bot mit ZaehlerKlasse

Verfasst: Dienstag 2. Oktober 2018, 18:45
von kbr
Da fällt mir Clementine ein: "sauber ist nicht rein" ...