D.JS: Herausfiltern von Discord Invites & Informationen des Zielservers
Die neuste Erweiterung meines The Cycle Discord Bots sollte ein Filter sein, der Discord Einladungen automatisch löscht bzw. mit einer Whitelist abgleicht, ob ein Link zugelassen ist..
Die Idee war recht simpel, doch in der Umsetzung stand ich auf einmal vor dem Problem einen Discord Link überhaupt zu identifizieren, auch wenn er in einen Text verpackt ist.
Als wäre das nicht schon Aufgabe genug, gibt es ja zig Variationen diese Links. Zusätzlich wollte ich ja dann auch nicht nur den Link selbst auf eine Whitelist setzen, sondern bestenfalls den Zielserver, sodass letztlich alle generierten Links zu einem solchen Server zugelassen sind.
Meine Suche verlief jedoch zunächst nicht sehr erfolgreich. Viele gefundene Ansätze passte nicht wirklich in mein Konzept. Im letzten Schritt kontaktierte ich dann auf dem offiziellen Discord von D.JS die Community und hatte innerhalb von 2 Minuten doch tatsächlich einen brauchbaren Ansatz, der letztlich auch eine Lösung lieferte.
Um vielleicht Anderen, die vor dem gleichen Problem stehen, die Suche zu vereinfachen, hier ein Auszug, wie ich das gelöst habe.
Zur Identifikation des Links in einer Nachricht verwendet man RegEx (Regular Expression) das genaue Suchmuster für Discord Links wurde mir glücklicher Weise direkt von einem Communitymitglied mit geliefert.
Letztlich sieht dann die Suche wie folgt aus:
let DiscordInvite = /(https:\/\/)?(www\.)?(discord\.gg|discord\.me|discordapp\.com\/invite|discord\.com\/invite)\/([a-z0-9-.]+)?/i;
DiscordInvite = DiscordInvite.exec(message.content);
Dies gibt in dann in DiscordInvite
ein Array mit diversen Informationen zum gefundenen Link aus. Der Link selbst befindet sich dabei auf Position 0.
discordInvite = discordInvite[0];
Der Erste Teil meines Ziels war somit Erreicht. Möchte man übrigens nur feststellen, ob ein Link vorhanden ist, kann man auch einfach nur
DiscordInvite = DiscordInvite.test(message.content);
nutzen. Hier bekommt man dann ein true
bzw. false
.
Die letztlichen Informationen über den Zielserver kann man dann über
client.fetchInvite(discordInvite).then(invite => { }
abrufen. invite.guild.id
liefert dann zum Beispiel die ID des Zielservers, invite.guild.name
den Namen, und so weiter.
Ich hoffe ich konnte mit diesem kurzen Abriss dem Einen oder Anderen helfen. In diesem Sinne viel Spaß mit eurem Discord Bot.