Java Discord Bot soll auf DM / PM in Channel auf Server antworten. Wie?
Java Discord Bot soll auf DM / PM (DirectMessage / Private Message) in einen Channel auf einem bestimmten Server antworten. Wie kann ich den Channel deklarieren, wenn das Event MessageRevieved ist und `.getGuild` nicht funktioniert, da es ja der Privat Chat ist?
1 Antwort
Das MessageReceivedEvent Objekt bzw. das vererbte Objekt hat ein Attribut Type (getType()), welcher vom Java Typ ein Enum ist.
Wenn man sich das Enum anschaut, gibt es z.B. TEXT für ein Textkanal in einer Guilde oder ein PRIVATE für ein Privaten Chat bzw. Chatgruppe.
Auf diese Info kannst du dann entsprechend reagieren.
Alternativ könntest du auch den internen Test von getGuild() aufrufen. Es gibt die Methode isFromGuild().
getGuild() müsste dauerhaft fehlschlagen.
Du fragst isFromGuild() ab und machst bei einer richtigen Aussage nichts. Im else, also wo es definitiv ein privater Channel ist, rufst du getGuild() auf. Es wird die Exception fliegen.
Wenn die Klammern durch das Weglassen nicht verrückt wurde, musst du das erste If Statement umkehren.
Wenn ich dich richtig verstehe bekommt der Bot eine private Nachricht vom einem User. Diese Nachricht soll dann in einem bestimmten TextChannel auf einem bestimmten Server weiterleiten.
Beim Vorgehen musst du auch vorher schon den Server (Guild) fest definieren. Wenn der Bot die Nachricht in einem privaten Channel erhält, kann der Bot keine Referenz zum Server schließen. Das geht nur, wenn die Nachricht über ein Server an den Bot geschickt wurde. Daher wird auch intern dieser Code ausgeführt:
if (!isFromGuild())
throw new IllegalStateException("This message event did not happen in a guild");
Damit sollte es funktionieren:
final JDA bot = JDABuilder.createDefault(...)
.build(); // bestehende Instanz benutzen
TextChannel botDm = bot.getTextChannelById(botDMChannel);
...
Damit sollte es funktionieren. Da du dann getTextChannelById auf dem gesamten Bot aufrufst, wird die Abfrage des Channels nicht auf den nicht existierenden Server limiert. Siehe Doku:
[...] For a guild, this would mean it only returns channels within the same guild. [...]
Der Server und Channel muss bereits im Cache des Bots sein.
Diese Zeile soll nur ein Hinweis sein, worauf ich diese Methode aufrufe. Du wirst bestimmt irgendwo eine JDA Instanz haben, die du benutzen sollst.
Ohne dem Hinweis hätte es die nächste Nachfrage von dir gegeben. Mein Token wollte ich hier nicht teilen, da du sonst mein Bot übernehmen kannst.
Entweder ich kann mich nicht richtig ausdrücken, oder bin zu doof deinen Rat zu verstehen 😅🤣.
Das ist mein Code bis jetzt. Das mit der Deklaration von dem Channel scheint auch zu passen, zumindest meckert er nicht.
Allerding schickt er kein Embed in den Channel. Berechtigung und ChannelId hinter der Variablen botDmChannel passen. Was muss ich anders machen?