Bot für Discord

Der letzte Code von Dir war in #22 und da war außer dem Timer nichts zu sehen. Sorry, dass meine Glaskugel kaputt ist und ich daher Deinen aktuellen Stand nicht sehen konnte.

Es geht ja auch jetzt nicht um die Integration in Discord sondern um das Erstellen des Timers.
Sicher, dass Du da zwei Mal new CommandManager() brauchst

Wo ist den das new CommandManager() 2x vorhanden?

QUOTE="Robat, post: 1189726, member: 42829"]
In der 4.0 BETA Version wurden das `core` Package in `api` umbenannt.
[/QUOTE]

Das ist ja alles richtig so.

Die ganzen Punkte, dass du zB schon einen lauffähigen Bot hast etc, hättest du ruhig am Anfang mit nennen können. Im ersten Post sah es so aus als hättest du NUR die main-Methode.

Ja, aber es ging ja jetzt prinzipiell NUR um das erstellen eines funktionstüchtigen Timers. Deswegen hatte ich es nicht für notwendig gehalten, die Integration mit zu posten.
 
Na wenn es dir NUR um den Timer geht hast du ja wiederholt schon antworten bekommen.. hier noch mal
Java:
final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(() -> {
     System.out.println("nächste Nachricht in 1h");
}, 0, 1, TimeUnit.HOURS);
Du scheinst aber nicht so richtig zu wissen wohin mit dem Code?
 
Also wohin das weiß ich. Aber der Code ist falsch/die Imports fehlen bei mir. Die folgenden Fehler tauchen auf:

  • Multiple markers at this line
    - ScheduledExecutorService cannot be resolved
    to a type
    - Executors cannot be resolved
  • Syntax error on token ".", @ expected after this token
  • Multiple markers at this line
    - Syntax error, insert "Identifier (" to complete
    MethodHeaderName
    - Syntax error on tokens, delete these tokens
    - Syntax error, insert "SimpleName" to complete
    QualifiedName
    - Syntax error, insert ")" to complete MethodDeclaration

Und der Befehl System.out.println("") gibt den Text ja in der Konsole aus, der Bot soll den Text aber in einem Channel ausgeben.
 
Auf der einen Seite sagst du, du weißt wohin mit dem Code, auf der anderen Seite schreibst du dass er ja nur etwas auf der Konsole ausgibt. Das ist mir schon klar .. aber wenn du weißt wohin mit dem Code wird es ja auch ein leichtes Unterfangen sein, die Konsolenausgabe mit einer Ausgabe auf dem Server zu ersetzen.

Mich würde wirklich mal interessieren, wo du den Code hinkopiert hast. Das ganze klingt irgendwie so, als würde es nicht in einer Methode, sondern direkt in einer Klasse stehen. Und wenn du selber sagst, dass dir Imports fehlen, dann füg sie doch hinzu?

Weil Wochenende ist .. ein letzer Versuch mit einem kompletten Code - sogar mit Imports und der JDA Version, die du verwendest.
Java:
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

import javax.security.auth.login.LoginException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TimerBotExample {

    public TimerBotExample() throws InterruptedException, LoginException {
        JDA jda = new JDABuilder("TOKEN")
                .addEventListeners(new MessageListener())
                .setActivity(Activity.playing("Some game..."))
                .setStatus(OnlineStatus.ONLINE)
                .build();
        jda.awaitReady();

    }

    class MessageListener extends ListenerAdapter {
        @Override
        public void onMessageReceived( MessageReceivedEvent event ) {
            final User author = event.getAuthor();

            if(!author.isBot()) {
                Message message = event.getMessage();
                String displayMessage = message.getContentDisplay();

                if(displayMessage.equals("/start")) {
                    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
                    service.scheduleAtFixedRate(() -> event.getChannel().sendMessage("Next message in 1h...").queue(), 0L, 1L, TimeUnit.HOURS);
                }
            }
        }
    }

    public static void main( String[] args ) throws LoginException, InterruptedException {
        new TimerBotExample();
    }
}
Das ist ein vollständiges Beispiel von einem Discord-Bot der einen Timer startet sobald du /start schreibst. Er gibt dann jede Stunde 1 mal die Nachricht "Next message in 1h.." aus. Dem ganzen müsste man natürlich noch ein kleines Refactoring unterziehen im Sinne von MessageListener in eine eigene Datei, nur 1 Timer starten, .. aber das spielt jetzt gerade keine Rolle.
 
Danke. Das funktioniert. Du hast gesagt
Und wenn du selber sagst, dass dir Imports fehlen, dann füg sie doch hinzu?
. Ja, wie soll ich denn wissen, welche Imports es sind, bzw. die Bezeichnung?

Natürlich müsste man noch bei deinem Code eine Stopp Methode einfügen, aber das spielt jetzt auch keine große Rolle.

Shit... mir ist gerade was aufgefallen. Der Timer ist ja hauptsächlich dazu da, dass er einen Command senden soll, worauf ein anderer Bot antworten soll. Nun ist das Problem, dass der Bot, der den Command dann ausführen soll, diesen nicht ausführt. Nur wenn ich den Command schreibe, dass wird dieser ausgeführt.

Gibt es eine Möglichkeit, dass man den Bot irgendwie als normalen User "tarnen" kann?
 
Kann es sein, dass du ohne IDE (Eclipse, Netbeans, Intellij, ... ) programmierst?
Eine IDE würde dir automatisch sagen wenn Klassen einen Import brauchen.
Wie du die Imports rauskriegst hab ich hier schon mal angesprochen. Das sollte dir die IDE (also Eclipse bei dir) automatisch sagen ..
Ob du den Bot tarnen kannst, weiß ich nicht. Kannst du die Funktion des Bots nicht einfach nachbasteln? Was macht der denn?
 
Das sollte dir die IDE (also Eclipse bei dir) automatisch sagen ..
Ja, aber macht sie komischer Weise nicht. Vielleicht habe ich auch was falsches aktiviert, müsste ich mal nach gucken. Aber ich habe eigentlich nicht an den Einstellungen rum gebastelt.

Der Bot, der den Befehl ausführen soll, DISBOARD. Dieser Bot gehört zufälliger Weise zur Website disboard.org. Wenn man nun aller 1 Stunden den Befehl !disboard bump eingibt, wird mein Server auf der Website nach oben gepusht, sodass ich mehr User auf meinen Server bekomme und ich mein Netzwerk aufbauen kann. Und da ich nicht immer alle 1 Stunde den Befehl eingeben will, ist es viel effektiver, wenn man einen Bot hat, der das macht.
 
Ich sags mal so. Wenn der Ersteller des anderen Bots nur will, dass dieses Command von Menschen ausgeführt wird, wird das schon seine Gründe haben 😉
 

Zurück
Oben