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

Samstag 14. Juli 2018, 17:41

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: 1552
Registriert: Samstag 2. Juni 2018, 10:21

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.

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.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Phobit
User
Beiträge: 118
Registriert: Freitag 4. Mai 2018, 18:13

Sonntag 15. Juli 2018, 10:57

__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: 1552
Registriert: Samstag 2. Juni 2018, 10:21

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.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Benutzeravatar
Kebap
User
Beiträge: 402
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Freitag 20. Juli 2018, 09:53

Vergleiche mal type() von message.author.server.name, message.author.User.roles, message.author ;)
MorgenGrauen: 1 Welt, >12 Gilden, >85 Abenteuer, >1000 Waffen und Rüstungen,
>2500 NPC, >16000 Räume, >170 freiwillige Programmierer, einfach Text, seit 1992.
Phobit
User
Beiträge: 118
Registriert: Freitag 4. Mai 2018, 18:13

Samstag 28. Juli 2018, 13:43

__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: 118
Registriert: Freitag 4. Mai 2018, 18:13

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)
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 1552
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 28. Juli 2018, 15:12

@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.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Phobit
User
Beiträge: 118
Registriert: Freitag 4. Mai 2018, 18:13

Samstag 28. Juli 2018, 17:07

__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: 1552
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 28. Juli 2018, 17:43

Genau *was* hast Du gemacht? Und welcher Error? Was haben die drei genannten Objekte denn jeweils für einen Typ?

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Phobit
User
Beiträge: 118
Registriert: Freitag 4. Mai 2018, 18:13

Samstag 28. Juli 2018, 18:07

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: 1552
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 28. Juli 2018, 20:02

@Phobit: Bei den beiden Zeilen kommt ein `NameError` weil `message` nicht definiert ist.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Phobit
User
Beiträge: 118
Registriert: Freitag 4. Mai 2018, 18:13

Sonntag 29. Juli 2018, 13:33

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: 1552
Registriert: Samstag 2. Juni 2018, 10:21

Sonntag 29. Juli 2018, 15:24

@Phobit: Das Modul hat ja auch kein Attribut `author`.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Phobit
User
Beiträge: 118
Registriert: Freitag 4. Mai 2018, 18:13

Freitag 10. August 2018, 10:15

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!
Antworten