Seite 1 von 1

Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 14. Juli 2018, 17:41
von Phobit
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!

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 14. Juli 2018, 19:00
von __blackjack__
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.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Sonntag 15. Juli 2018, 10:57
von Phobit
__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...

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Sonntag 15. Juli 2018, 12:22
von __blackjack__
@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.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Freitag 20. Juli 2018, 09:53
von Kebap
Vergleiche mal type() von message.author.server.name, message.author.User.roles, message.author ;)

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 28. Juli 2018, 13:43
von Phobit
__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

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 28. Juli 2018, 13:49
von Phobit
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)

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 28. Juli 2018, 15:12
von __blackjack__
@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.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 28. Juli 2018, 17:07
von Phobit
__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.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 28. Juli 2018, 17:43
von __blackjack__
Genau *was* hast Du gemacht? Und welcher Error? Was haben die drei genannten Objekte denn jeweils für einen Typ?

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 28. Juli 2018, 18:07
von Phobit
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

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Samstag 28. Juli 2018, 20:02
von __blackjack__
@Phobit: Bei den beiden Zeilen kommt ein `NameError` weil `message` nicht definiert ist.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Sonntag 29. Juli 2018, 13:33
von Phobit
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.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Sonntag 29. Juli 2018, 15:24
von __blackjack__
@Phobit: Das Modul hat ja auch kein Attribut `author`.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Freitag 10. August 2018, 10:15
von Phobit
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?

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Freitag 10. August 2018, 11:15
von __blackjack__
@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`.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Freitag 10. August 2018, 11:20
von Phobit
wie könnte man dann die drei Typen vergleichen, um auf den Beginn des Themas zurückzuführen ?
;)

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Freitag 10. August 2018, 11:31
von __blackjack__
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.

Re: Discord Bot gibt Rolle nicht aus

Verfasst: Freitag 10. August 2018, 12:34
von Phobit
Ok, danke. Wegen so nem Code werd ich mal schauen