Java Discord Bot soll auf DM / PM in Channel auf Server antworten. Wie?

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().

Nic2207 
Fragesteller
 14.06.2022, 20:29

Entweder ich kann mich nicht richtig ausdrücken, oder bin zu doof deinen Rat zu verstehen 😅🤣.

public void onMessageReceived (MessageReceivedEvent nachrichtErhalten) {
  if (nachrichtErhalten.isFromGuild()) {
  }
  else{
    [...]
    System.out.println("DM");
    System.out.println("User: " + AutorNickname + " / " + AutorMention + " / " + AutorTag + " / " + AutorID);
    System.out.println("Nachricht: " + Nachricht + "\n");

    TextChannel botDm = nachrichtErhalten.getGuild().getTextChannelById(botDMChannel);
    
    EmbedBuilder dmEmbed = new EmbedBuilder();
    dmEmbed.setAuthor(AutorTag, AutorProfilbildURL);
    dmEmbed.setColor(0xff0000);
    dmEmbed.setFooter("RGN Manager",RGNManagerQuadrat);

    botDm.sendMessageEmbeds(dmEmbed.build()).queue();
}

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?

0
tide1109  14.06.2022, 21:03
@Nic2207

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.

0
Nic2207 
Fragesteller
 14.06.2022, 21:08
@tide1109

Hab ich da so einen außergewöhnliche Idee? Ich will einfach die Nachricht, die an den Bot geht auf den Server weiterleiten. Die erste If-Abfrage ist gewollt haha

0
Nic2207 
Fragesteller
 14.06.2022, 21:09
@tide1109

klar dass getGuild() falsch sein muss und auch Null ist, aber wie bekomme ich trotzdem den Channel auf dem Server mit der ID: ...?

0
tide1109  14.06.2022, 21:26
@Nic2207

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.

1
Nic2207 
Fragesteller
 14.06.2022, 21:42
@tide1109

Ok man versteht mich, vielen Dank. Jetzt nur noch, was muss in die Klammer hinter Default? Er will ja "Token". Was ist damit gemeint?

0
tide1109  15.06.2022, 15:22
@Nic2207

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.

0