Chatfilter im Discord Bot

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

Hallo,
ich würde gerne in meinen Discord Bot einen Filter einbauen. Er soll sowohl Schimpfwörter als auch andere Buchstaben oder Wörter filtern, indem er die Nachrichten, die das Wort enthalten löscht. Allerdings soll der Filter nur in einem gewissem Channel eintreten, nicht auf jeden zurückgreifen (bitte hinterfragt den Sinn einfach nicht :K :D )

Mein Versuch wäre gewesen:
(Bitte nicht erschrecken, bin noch recht neu XD)

Code: Alles auswählen

async def on_message(message):
    if message.__contains__("SCHWIMPFWORT") and channel.id == "tz34657648766BLABLABLA":
        messages = []
    

        await client.delete_messages(messages)

        returnmsg = await client.send_message(message.channel, "Deleted messages.")
        await asyncio.sleep(4)
        await client.delete_message(returnmsg)

Den Codefetzen fand ich in einem ähnlichen Tutorial, also auch hier sorry wenn da etwas falsch läuft.

Der Error der kommt lautet:
AttributeError: 'Message' object has no attribute '__contains__'

Woher das kommt, keine Ahnung. Immerhin kann ich das Attribut "__contains__" sonst auch nutzen:

Code: Alles auswählen

if message.content.startswith(STATICS.PREFIX):
        invoke = message.content[len(STATICS.PREFIX):].split(" ")[0]
        args = message.content.split(" ")[1:]
        if commands.__contains__(invoke):
Deshalb bin ich leicht verwirrt. Hoffe jemand kann helfen, danke schonma im Voraus! :D
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Da ich auch recht neu bin, frage ich mal (an alle) :
- was bedeutet / macht dieses "async" eigentlich?
- "await client.delete_messages(messages)" , heißt das so viel, dass es gelöschte Nachrichten erwartet bzw wartet,bis es gelöschte Nachrichten bekommt? Denn wenn ja, ergibts doch kein Sinn...oder?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: `__contains__()` solltest Du gar nicht direkt benutzen sondern den ``in``-Operator. Und beides kann man nur auf Objekten benutzen die das auch haben/unterstützen. `message` ist halt was anderes als `commands` im anderen Beispiel. Du wunderst Dich ja auch nicht warum man Zahlen voneinander abziehen kann, aber Zeichenketten nicht. Ein Datentyp zeichnet sich ja gerade dadurch aus was er an Operationen und Methoden hat und was die bewirken.

@xXSkyWalkerXx1: Ich denke das ist keine Frage für's Forum oder um die in einem fremden Thema einfach mal so dazwischen zu schieben. ``async``/``await`` ist eine Art nebenläufige Programmierung zu machen, und das ist an sich schon ein etwas komplizierteres Feld.
“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

xXSkyWalkerXx1 hat geschrieben: Mittwoch 11. Juli 2018, 18:43 Da ich auch recht neu bin, frage ich mal (an alle) :
- was bedeutet / macht dieses "async" eigentlich?
- "await client.delete_messages(messages)" , heißt das so viel, dass es gelöschte Nachrichten erwartet bzw wartet,bis es gelöschte Nachrichten bekommt? Denn wenn ja, ergibts doch kein Sinn...oder?
Ich will mich jetzt nicht zu weit ausm Fenster lehnen, aber wenn ich mich nicht irre heißt es "asynchron", was bedeutet dass alles innerhalb dieser Funktion asynchron ausgeführt werden soll, was bei DIscord wichtig ist.

Was genau das "await" bedeutet, weiß ich nicht, blos dass es in Zusammenhang mit "async" steht und discord-befehle (send_message, delete_message...) ohne ein await nicht ausgeführt werden /werden können.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Naja, dass es "asynchron" heißt, weiß ich auch. :D
Aber was bedeutet genau "asynchron" ? :D
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

__blackjack__ hat geschrieben: Mittwoch 11. Juli 2018, 19:01 @Phobit: `__contains__()` solltest Du gar nicht direkt benutzen sondern den ``in``-Operator. Und beides kann man nur auf Objekten benutzen die das auch haben/unterstützen. `message` ist halt was anderes als `commands` im anderen Beispiel. Du wunderst Dich ja auch nicht warum man Zahlen voneinander abziehen kann, aber Zeichenketten nicht. Ein Datentyp zeichnet sich ja gerade dadurch aus was er an Operationen und Methoden hat und was die bewirken.
Danke, aber das hat mich leider auch nicht wirklich weitergebracht... if "sdfhbv" in message, oder auch "if "dfjs" in discord.message" funktioniert beides nicht, die Fehlermeldung besagt entweder TypeError: argument of type 'Message' is not iterable oder TypeError: argument of type 'Module' is not iterable...
Hat wer noch ne andere Lösung parat, oder auch wie ich generell auf gewisse Nachrichten in Discord reagieren kann??? :K
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

Ok, ich bin jetzt schon etwas weiter.
Jetzt schaff ich es den Bot zu starten, ohne Fehlermeldung, blos jetzt wiird mkieine message nicht gelöscht...
Hier der aktuelle Code:

Code: Alles auswählen

elif "SCHIMPFWORT" in message.content and discord.Channel.id == "133634785647BLABLABLA"
        messages = 1
        await client.delete_message(messages)

        returnmsg = await client.send_message(message.channel, "Deleted messages.")
        await asyncio.sleep(4)
        await client.delete_message(returnmsg)
So, es passiert jetzt einfach nichts. wenn ich min Schimpfwort abgebe, macht der Bot nix. Kein Error, kein nix...

Wie kann ich das ändern? er soll nur die letzte gesendete Messages löschen.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was erwartet denn `client.delete_message()` als Argument?
“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

Da ist ja das Problem XD ich weiß es auch nicht, eigentlich , also laut shell, "messages"
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und laut *Dokumentation*?
“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

This function is a coroutine.

Deletes a Message.

Your own messages could be deleted without any proper permissions. However to delete other people’s messages, you need the proper permissions to do so.

Parameters:
message (Message) – The message to delete.


Auch message...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

1 ist eine Zahl und keine `Message`. Die Dokumentation sagt ziemlich deutlich, dass dort das `Message`-Objekt übergeben werden soll welches gelöscht werden soll.
“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

Code: Alles auswählen

amount = 1
messages = []
    async for m in client.logs_from(message.channel, limit=amount):
       messages.append(m)

    await client.delete_messages(messages)

    returnmsg = await client.send_message(message.channel, "Es wurden %s Nachrichten gelöscht." % amount)
    await asyncio.sleep(4)
    await client.delete_message(returnmsg)

Ja, aber so würde es auch gehen...

bzw, das hier ist der verkürtzte ausschnitt, niormalerweise zeiht er die anzahl, also amount über die args der message
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Antworten