Discord.py bot soll eine Rolle eines bestimmten Nutzers entfernen, sobald der Bot gestartet hat.

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
onefckcps
User
Beiträge: 4
Registriert: Montag 13. Januar 2020, 11:41

Hallo,

ich habe jetzt schon in mehreren Foren danach gefragt, leider nie eine richtige Antwort.
Ich möchte dass mein bot eine rolle eines bestimmten User entfernt, sobald der Bot bereit ist. Ohne dass dafür ein command ausgeführt werden muss! Ich weiß dass man dafür user und rollen Objekt braucht. Jedoch weiß ich nicht wie ich das umsetzten soll...ich hoffe man versteht meine Frage und schonmal viel Dank für die Hilfe...

1 Versuch:

Code: Alles auswählen

@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name)
    print(bot.user.id)
    print('------')
    user:discord.Member='bobrtc#3323'
    role:discord.Role='Member []'

    user.remove_roles(*role, reason=None)
Hier bekomme ich den Fehler

Code: Alles auswählen

    user.remove_roles(*role, reason=None)
AttributeError: 'str' object has no attribute 'remove_roles'
2. Versuch:

Code: Alles auswählen

bot = commands.Bot('J')
async def remove(user: discord.Member, *role: discord.Role):
        await user.remove_roles(*role, reason=None)
@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name)
    print(bot.user.id)
    print('------')
    await remove("member#1234", "role name")
Hier bekomme ich den Fehler

Code: Alles auswählen

remove("member#1234", "role name")
TypeError: 'Command' object is not callable
vielleicht habe ich auch einen komplett Falschen Ansatz, vllt kann mir ja hier einer weiterhelfen
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Laß das mal mit den Typ-Annotationen. Die sind eh überflüssig und vor allem, wenn die auch noch falsch sind.
Du behauptest, user wäre vom Typ discord.Member weist ihm aber den String 'bobrtc#3323' zu.
Du willst wohl bot.user.remove_role verwenden.
onefckcps
User
Beiträge: 4
Registriert: Montag 13. Januar 2020, 11:41

wie genau soll ich das Lösen? Ich muss ja iwie den Namen des users und die Rolle angeben....kann das aber nicht als String machen.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@onefckcps: Das erste Beispiel ist syntaktisch falsch, das läuft also überhaupt nicht, kann also auch nicht die Ausnahme auslösen die Du da behauptest. Sowohl `user` als auch `role` sind in dem Schnippsel undefiniert. Wenn da eine Ausnahme kommt das `user` eine Zeichenkette ist und kein `remove_roles`-Attribut hat, dann ist das Beispiel offensichtlich nicht vollständig und wir müssen raten was da tatsächlich noch so gemacht wird.

Beim zweiten Beispiel sehe ich nicht wie aus der `remove()`-Funktion auf magische Weise etwas vom Typ `Command` werden kann. Das kann nicht sein, oder es wird auch hier wieder nicht alles gezeigt.

Und wenn man schon diese blöden Typannotationen macht sollte man sie a) konsequent machen und b) auch ein Werkzeug zum prüfen verwenden, sonst machen die nämlich keinen Sinn. Wenn man das macht, sollte aufgefallen sein, dass man etwas was den Typ `discord.Member` haben sollte nicht an eine Zeichenkette binden kann, weil Zeichenketten sicher kein `remove_roles`-Attribut haben. Was ja schon das Problem beim ersten Beispiel war. Und auch `discord.Role` ist ziemlich sicher nicht mit einer Zeichenkette ersetzbar.

In beiden Fällen sollte `role` wohl `roles` heissen, denn es handelt sich ja offensichtlich um ein iterierbares Objekt von Rollen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
onefckcps
User
Beiträge: 4
Registriert: Montag 13. Januar 2020, 11:41

Code: Alles auswählen

@bot.command()
async def remove(ctx, user: discord.Member, *role: discord.Role):
        await user.remove_roles(*role, reason=None)
der command funktioniert, jedoch möchte ich ja dass der Bot automatisch sobald er gestartet ist, die Rolle eines Users entfernt, ohne dass man dafür etwas schreiben muss
onefckcps
User
Beiträge: 4
Registriert: Montag 13. Januar 2020, 11:41

https://stackoverflow.com/questions/597 ... ot-startup das war mein Beitrag auf Stackoverflow. In den Kommentaren haben wir weiter geschriben und er meinte ich bräuchte eine Instance von Client. Jedoch weiß ich nicht was er damit mein
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

1)
Diese API sollte dir eigentlich eine super Hilfe sein: https://discordpy.readthedocs.io/en/async/api.html

2)
Mit Instanz ist das Objekt bzw die Klasse Discord gemeint.
Ich mein, wie soll sich denn dein Bot in den Discord-Channel einloggen? Du hast weder die Instanz erzeugt, noch (folglich) dich mittels deines Tokens eingeloggt.

Das ist damit gemeint:

Code: Alles auswählen

client = discord.Client()
client.run(token,bot=True) #Variable 'bot' kann auch weggelassen werden, da standardmäßig 'true'
Dazu musst du natürlich dein Token herausfinden. Ich hatte mir auch Mal ein Discord-Bot erstellt, ist schon lange her...
Du musst aufjedenfall über der Discord-Webseite ein Bot einstellen und deiner Community zuweisen und dann schaust du über die Browserkonsole nach dem Token deines Bots.
Der sollte sich bei den Cookies befinden, wenn ich mich recht erinnere.

Und nun, erst durch erzeugen der Instanz "client", kann dein Bot überhaupt was machen.
Antworten