Discord Bot gibt Rolle nicht aus

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

Hllo,
mein Discord Bot soll jeden Befehl in einem Log speichern. Dazu soll er schreiben, auf welchem Server der Befehl ausgeführt wurde, wie der User heißt und welche Rollen er besitzt.
Das Problem ist, der Bot kann mir die Rolle nich sagen.
Hier wäre der COde:

Code: Alles auswählen

async def ex(args, message, client, invoke):
    LogMessagePing = ("[%s] Der Befehl 'ping' wurde von [%s] %s ausgeführt!" % (message.author.server.name, message.author.User.roles, message.author))
    sdatei = open("CMD_Log.txt")
    l = sdatei.readlines()
    sdatei.close
    l.append(LogMessagePing)
    with open("CMD_Log.txt", "w") as sdatei:
        sdatei.write("".join(l))
So, und das wäre die Ausgabe:


[MeinTestChannel] Der Befehl 'ping' wurde von [[<discord.role.Role object at 0x72c8e130>, <discord.role.Role object at 0x76d8e1b0>, <discord.role.Role object at 0x72c8e570>]] Phobit#6554 ausgeführt!

Wie man sieht, gibt der Bot den Server sowei den Namen des Befehlsschreibers aus, aber nicht dessen Rollen!

Weiß wer ne Lösung?
Danke im Vorraus!
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Rollen stehen doch da. Vielleicht möchtest Du ja gezielt eine Zeichenkette aus bestimmten Attributen von den `Role`-Objekten erstellen und die da einbauen. Dann musst Du halt genau das machen.

Es gibt übrigens einen Dateimodus um Daten ans Ende einer vorhandenen Datei anzuhängen. Logs immer wieder komplett einlesen und raus schreiben ist sehr ineffizient und birgt zudem die Gefahr das bereits vorhandene Daten verloren gehen wenn das Programm beispielsweise irregulär mit einem Fehler endet.

Zudem fehlt das Zeilenende bei den Protokolleinträgen.

Für's Logging lohnt sich auch ein Blick in das `logging`-Modul aus der Standardbibliothek.
“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

__blackjack__ hat geschrieben: Samstag 14. Juli 2018, 19:00 Die Rollen stehen doch da. Vielleicht möchtest Du ja gezielt eine Zeichenkette aus bestimmten Attributen von den `Role`-Objekten erstellen und die da einbauen. Dann musst Du halt genau das machen.
Mich wundert nur, dass er alle Objekte 'normal' ausgeben kann, aber mir dann bei rolle diese Zeichenkette gegeben wird...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Was heisst ”normal”? Das ist die normale Zeichenkettendarstellung einer Liste. Die `repr()`-Darstellung der Elemente, eingeschlossen in eckige Klammern und getrennt durch Kommas. Das ist das Ergebnis wenn man eine Liste in eine Zeichenkette umwandelt. Immer. Diese Form ist in aller Regel auch nicht für den Endbenutzer gedacht, sondern für den Programmierer, damit der sehen kann was da tatsächlich in der Liste enthalten ist.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Vergleiche mal type() von message.author.server.name, message.author.User.roles, message.author ;)
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

__blackjack__ hat geschrieben: Sonntag 15. Juli 2018, 12:22 @Phobit: Was heisst ”normal”? Das ist die normale Zeichenkettendarstellung einer Liste. Die `repr()`-Darstellung der Elemente, eingeschlossen in eckige Klammern und getrennt durch Kommas. Das ist das Ergebnis wenn man eine Liste in eine Zeichenkette umwandelt. Immer. Diese Form ist in aller Regel auch nicht für den Endbenutzer gedacht, sondern für den Programmierer, damit der sehen kann was da tatsächlich in der Liste enthalten ist.
Das beantwortet mir immer noch nicht so ganz, wieso jetzt die eine Sache als Fließtext ausgegeben wird, aber die Rolle als Zeichenkette!

Wenn alles so ausgegeben werden würde, wäre es ja kein Problem, aber er gibt ja immer nur die Rolle "anders" aus
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

Kebap hat geschrieben: Freitag 20. Juli 2018, 09:53 Vergleiche mal type() von message.author.server.name, message.author.User.roles, message.author ;)
ok, da ist mir jetzt etwas peinlich, aber wie vergleiche ich die??? :K :D

bei mir kommt da blos so Errors raus wie:
AttributeError: module 'discord.message' has no attribute 'author'

(was das bedeutet weiß ich ja, nur nicht wie ich den error vermeiden kann, message.author klappt ja im Code vom Bot auch)
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Fliesstext ist kein Datentyp, das ist auch eine Zeichenkette. Rollen wandelst Du ja auch gar nicht (implizit) in Zeichenketten um, sondern die Liste. Der '%s'-Platzhalter sorgt dafür, dass das Objekt welches da eingesetzt werden soll, gefragt wird wie es als Zeichenkette aussehen soll. Wie diese Darstellung für Listen zustande kommt, habe ich erklärt. Sowohl was technisch abläuft, als auch warum das so und nicht anders ist.

Den Typ eines Objekts bekommt man mit der `type()`-Funktion.
“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

__blackjack__ hat geschrieben: Samstag 28. Juli 2018, 15:12
Den Typ eines Objekts bekommt man mit der `type()`-Funktion.
Und mal wieder versteht keiner das Problem, also formuliere ich neu...

Genau DAS hab ich ja gemacht, aber es kam der oben erwähnte Error raus.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Genau *was* hast Du gemacht? Und welcher Error? Was haben die drei genannten Objekte denn jeweils für einen Typ?
“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

Phobit hat geschrieben: Samstag 28. Juli 2018, 13:49
Kebap hat geschrieben: Freitag 20. Juli 2018, 09:53 Vergleiche mal type() von message.author.server.name, message.author.User.roles, message.author ;)
ok, da ist mir jetzt etwas peinlich, aber wie vergleiche ich die??? :K :D

bei mir kommt da blos so Errors raus wie:
AttributeError: module 'discord.message' has no attribute 'author'

(was das bedeutet weiß ich ja, nur nicht wie ich den error vermeiden kann, message.author klappt ja im Code vom Bot auch)
Hier kann man den Error nachlesen.
Eingegeben habe ich

Code: Alles auswählen

import discord
type(message.author.server.name, message.author.User.roles, message.author)
Wie gesagt, der obige Error kam raus
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Bei den beiden Zeilen kommt ein `NameError` weil `message` nicht definiert ist.
“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

sorry, mein Fehler, wenn man aber oben noch ein from discord import message anhängt kommt der obige Error, AttributeError: module 'discord.message' has no attribute 'author', raus.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Das Modul hat ja auch kein Attribut `author`.
“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

Selstsamerweise kann ich mit

Code: Alles auswählen

 client.send_message(message.AUTHOR "Nachricht") 
eine Nachricht an den AUTOR der Nachricht schicken lassen, somit scheint message ja author zu besitzen, oder seh ich da was völlig falsch?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Falls das `author` statt `AUTHOR` sein sollte und da kein Komma fehlen würde, siehst Du das richtig. Hier ist der Name `message` dann aber auch nicht an ein Modul gebunden sondern an ein Objekt vom Typ `Message`.
“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

wie könnte man dann die drei Typen vergleichen, um auf den Beginn des Themas zurückzuführen ?
;)
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

In dem man `print()` und `type()` verwendet um sich von jedem der drei Objekte den Typ ausgeben zu lassen. Wobei das ja eigentlich gar nicht mehr nötig sein sollte, denn letztlich wurde ja schon alles dazu gesagt. Die Rollen sind in einer Liste und wie Listen sich selbst in eine Zeichenkette umwandeln, ist auch beschrieben worden. Wie sie das tun magst Du nicht, da kannst Du aber nichts dran ändern, den das ist so wie es ist, und letztlich auch sinnvoll so. Wenn Du das anders haben möchtest, musst Du Code schreiben der das anders macht. So wie Du möchtest.
“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

Ok, danke. Wegen so nem Code werd ich mal schauen
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Antworten