# Bot für Discord



## Freshy (3. Jul 2019)

Hi,

ich bin neu auf dem Forum und brauche Hilfe.

Ich möchte einen Discord Bot erstellen, der in einer bestimmten Zeit einen bestimmten Befehl schreiben/ausführen soll.

Nun hänge ich an einem Timer fest. Ich habe alle Anleitungen probiert, doch keine Hilft.

Mein derz. Code: 

```
package de.coaster.timer;

import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.TextChannel;

public class Main {
    
    static int t=60;
    public static void main(String[] args) {
        
    }
    
    public static void timer() {
        
        t++ ;
            
        }
        
    }
```

Ich hoffe, mit kann jemand helfen.

LG.,
Freshy


----------



## Robat (3. Jul 2019)

Ohne deinen Code zu sehen wird man dir nicht helfen können


----------



## Freshy (3. Jul 2019)

Ich habe ja noch keinen Code für den Timer, der funktioniert.

Hier wäre eine Idee; 

```
package de.coaster.timer;

import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.TextChannel;

public class Main {
    
    static int t=60;
    public static void main(String[] args) {
        
    }
    
    public static void timer() {
        
        t++ ;
            
        }
        
    }
```


----------



## Robat (3. Jul 2019)

Warum möchtest du diesen Timer denn unbedingt selber schreiben? Mit Java Bordmitteln kann man das doch super umsetzen:

```
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
Runnable task = () -> {
    System.out.println("Do something here..");
};
executor.schedule(task, 10, TimeUnit.MINUTES); // run task after 10 min
executor.shutdown();
```


----------



## Freshy (3. Jul 2019)

Wer hat gesagt, dass ich den Timer selbst schreiben will? Wo finde ich denn die Bordmittel?


----------



## Freshy (3. Jul 2019)

Also bei Java finde ich nur das.


----------



## kneitzel (3. Jul 2019)

@Robat hat doch ein Beispiel mit dem ScheduledExecutorService gebracht.
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

Das wäre doch schon eine einfache Lösung, oder nicht?

Aber mit dem Timer, den Du gefunden hast, kannst Du natürlich auch arbeiten. Da findet sich mit Google auch einiges an Beispielen, falls Dir die Doku alleine nicht ausreichen sollte. (z.B. https://www.journaldev.com/1050/java-timer-timertask-example)


----------



## Freshy (3. Jul 2019)

Mit dem Timer den ich gefunden habe, kann ich ja nicht arbeiten. Aber das Beispiel ist hilfreich. Danke. Ich werde es mal probieren.


----------



## kneitzel (3. Jul 2019)

Wieso kannst Du mit dem Timer nicht arbeiten? Was hast Du probiert? Was für Probleme gab es?


----------



## Freshy (3. Jul 2019)

Freshy hat gesagt.:


> package de.coaster.timer; import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.entities.TextChannel; public class Main { static int t=60; public static void main(String[] args) { } public static void timer() { t++ ; } }



Weil ich von dem bei Java das herausgelesen habe, was ja falsch ist.


----------



## kneitzel (3. Jul 2019)

Also der Code, den du da gepostet hast, enthält ja keinerlei Timer. Nur eine leere main Methode, so dass da nichts gemacht wird.


----------



## Freshy (3. Jul 2019)

Ich weiß, der Code war ja auch noch nicht fertig.


----------



## Robat (3. Jul 2019)

Bist du dir sicher, dass du dich schon für die Programmierung eines Bots bereit fühlst? Wenn man mit der JDA API arbeitet sollte man die Java Basics auf jeden Fall drauf haben. 

Ich frage nur weil die Antworten bisher etwas wirr sind.


----------



## Freshy (3. Jul 2019)

Warum wirr? Und ja, ich war mal vor ca. nem Jahr bei dem Java Kurs, wo ich die Basics gelernt habe^^


----------



## Freshy (4. Jul 2019)

kneitzel hat gesagt.:


> https://www.journaldev.com/1050/java-timer-timertask-example)



Das Beispiel klappt schon mal. Aber was ist denn überhaupt dieses "Daemon"? Und wo kann ich denn jetzt genau die Aufgabe eingeben, die mein Bot letztendlich machen soll? Bei 

```
public void run() {
        System.out.println("Timer task started at: "+new Date());
        completeTask();
        System.out.println("Timer task finished at: "+new Date());
    }
```
 ? Also anstatt den System.out.println?


----------



## mihe7 (4. Jul 2019)

Ja, die Methode run() wird vom Timer ausgeführt. Was macht eigentlich so ein Discord-Bot?


----------



## Freshy (4. Jul 2019)

Okay. Mein Bot soll einen Befehl alle 1 Stunde ausführen.


----------



## mihe7 (4. Jul 2019)

Freshy hat gesagt.:


> Mein Bot soll einen Befehl alle 1 Stunde ausführen.


Das erklärt aber noch nicht, was so ein Discord-Bot macht. Wozu braucht/verwendet man das Teil?


----------



## kneitzel (4. Jul 2019)

So ein Bot kann prinzipiell alles machen, das auch ein Discord User mit dem Client machen könnte. Es gibt eine Webseite mit herunterladbaren Bots:
https://discordbots.org/

Interessant finde ich z.B. Übersetzer: https://discordbots.org/bot/360081866461806595
Das kann interessant sein, wenn Discord bei Spielen für einen Chat eingesetzt wird und Spieler aus diversen Ländern zusammen spielen wollen ...


----------



## Freshy (4. Jul 2019)

@kneitzel Ja die Seite kenne ich, davon habe ich auch einige Bots. Aber ich finde halt keinen Bot, der alle x Minuten einen Befehl ausführt.

@mihe7 Unter einem *Bot* (von englisch robot ‚Roboter') versteht man ein Computerprogramm, das weitgehend automatisch sich wiederholende Aufgaben abarbeitet, ohne dabei auf eine Interaktion mit einem menschlichen Benutzer angewiesen zu sein.


----------



## mihe7 (4. Jul 2019)

@Freshy Danke für Deine Mühe. Mir ging es speziell um den Zusammenhang mit Discord (s. Antwort von @kneitzel) und Deinen Einsatzzweck


----------



## Freshy (4. Jul 2019)

@mihe7 Achso. Ich möchte, dass der Bot in einen definierten Channel alle x Stunden einen Befehl hinein schreibt, worauf ein anderer Bot den Befehl ausführen soll.

Bei mir sieht der Quellcode jetzt folgendermaßen aus: 

```
public class timer extends TimerTask {
    
    public void run() {
        System.out.println("Timer task started at: "+new Date());
        completeTask();
        TextChannel channel = event.getTextChannel();
        channel.sendMessage("Hi");
        System.out.println("Timer task finished at: "+new Date());
    }

    private void completeTask() {
        try {
            //assuming it takes 20 secs to complete the task
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new timer();
        //running timer task as daemon thread
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancel after sometime
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
        System.out.println("TimerTask cancelled");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
}
```

Bei der Zeile, wo 

```
TextChannel channel = event.getTextChannel();
```
 steht, 
 kommt der Fehler: event cannot be resolved.


----------



## mihe7 (4. Jul 2019)

Ja, die Variable event gibt es nicht. Du wirst doch irgendeine Lib verwenden, um einen Bot zu implementieren.


----------



## Freshy (4. Jul 2019)

Ich habe aber das richtige importiert. Ich habe die Lib von Discord.


----------



## mihe7 (4. Jul 2019)

Freshy hat gesagt.:


> Ich habe aber das richtige importiert.


Du verwendest aber nichts davon  



Freshy hat gesagt.:


> Ich habe die Lib von Discord.


Ist das die hier https://github.com/DV8FromTheWorld/JDA ?


----------



## Freshy (4. Jul 2019)

mihe7 hat gesagt.:


> Ist das die hier https://github.com/DV8FromTheWorld/JDA ?



Genau, die.



mihe7 hat gesagt.:


> Du verwendest aber nichts davon



Doch, ich verwende ja das "event", aber das klappt halt irgendwie nicht.


----------



## mihe7 (4. Jul 2019)

Freshy hat gesagt.:


> Doch, ich verwende ja das "event"


Das "event" kommt aber nicht aus der Lib sondern ist einfach eine Variable, die nirgends deklariert wurde.


----------



## Freshy (4. Jul 2019)

Wie soll ich es denn deklarieren?


----------



## Robat (4. Jul 2019)

Mal grob skizziert (aber ohne IDE getestet .. kann also Typos enthalten  )

```
class BotExample extends ListenerAdapter {
    public static void main(String[] args) {
        try {
            JDA jda = new JDABuilder("TOKEN")
                    .addEventListener(new BotExample())
                    .build();
            jda.awaitReady();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void onMessageReceived(MessageReceivedEvent event) {
        if(!event.getAuthor().isBot()) {
            String message = event.getMessage().getContentDisplay();
            if(message.equalsIgnoreCase("/start")) {
                final MessageChannel channel = event.getChannel();
                final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
                scheduler.scheduleAtFixedRate(() -> {
                    channel.sendMessage("Nachricht von /start .. nächste Nachricht in 1h").queue();
                }, 0, 1, TimeUnit.HOURS);
            }
        }
    }
}
```


----------



## mihe7 (4. Jul 2019)

Das steht doch auf der Seite:


```
public class ReadyListener implements EventListener
{
    public static void main(String[] args)
            throws LoginException, InterruptedException
    {
        // Note: It is important to register your ReadyListener before building
        JDA jda = new JDABuilder("token")
            .addEventListener(new ReadyListener())
            .build();

        // optionally block until JDA is ready
        jda.awaitReady();
    }

    @Override
    public void onEvent(Event event)
    {
        if (event instanceof ReadyEvent)
            System.out.println("API is ready!");
    }
}
```

Außerdem: https://github.com/DV8FromTheWorld/JDA/wiki/3)-Getting-Started

EDIT: @Robat war schneller.


----------



## Freshy (4. Jul 2019)

@Robat Danke. Jetz kommen aber folgende Fehler: 


Multiple markers at this line
    - JDA cannot be resolved to a type
    - JDABuilder cannot be resolved 
     to a type


MessageChannel cannot be resolved to a type


Multiple markers at this line
    - ScheduledExecutorService cannot be resolved 
     to a type
    - Executors cannot be resolved


TimeUnit cannot be resolved to a variable
@mihe7 Das hat doch aber nix mit einem Timer zu tun?


----------



## Robat (4. Jul 2019)

@Freshy und genau deswegen habe ich am Anfang gefragt, ob du die nötigen Grundlagen drauf hast.
Du musst natürlich die Klassen importieren. Und natürlich hat die Antwort von @mihe7 erstmal nichts mit einem Timer zu tun. Das ganze sollte als Grundlage dienen, wo du das Event herbekommst.

Nicht böse gemeint aber geh noch mal 3 Schritte zurück, nimm dir ein gutes Grundlagenbuch / Video / .. und lern die Basics.


----------



## Freshy (4. Jul 2019)

Die Klassen sind doch aber schon importiert, oder welche meinst du?

Kannst du mir da was empfehlen? Ich würde jetzt aber kein Buch für 50€ kaufen, was nicht viel bringt. Ich denke, die Videos von simpleclub auf YT sind hilfreich.

Ich dachte, es kann doch nicht so schwer sein, einen Timer zu coden...


----------



## Robat (4. Jul 2019)

Freshy hat gesagt.:


> Die Klassen sind doch aber schon importiert, oder welche meinst du?


Das kann ich dir nicht sagen. In meinem Beispielcode oben habe ich zB keine Imports mit angeführt. 


Freshy hat gesagt.:


> Ich denke, die Videos von simpleclub auf YT sind hilfreich.


Nicht wirklich - die erklären das ganze nur seeehr grob. Ich kann dir nur die Oracle Docu + Tutorial empfehlen. Andere schwören auf die Java Insel.


Freshy hat gesagt.:


> Ich dachte, es kann doch nicht so schwer sein, einen Timer zu coden...


Ist es auch nicht wenn man die Grundlagen drauf hat


----------



## Freshy (4. Jul 2019)

Robat hat gesagt.:


> Andere schwören auf die Java Insel.



Aber für 50€?



Robat hat gesagt.:


> Oracle Docu + Tutorial



Ich sehe aber bloß in Englisch, Deutsch ist da effektiver.



Robat hat gesagt.:


> Ist es auch nicht wenn man die Grundlagen drauf hat



Ich war ja mal bei einem Grundlagen Kurs, vor nem Jahr. Also sollte ich die Grundlagen ja drauf haben^^


----------



## Robat (4. Jul 2019)

Freshy hat gesagt.:


> Aber für 50€?


Gibts auch kostenlos im Netz.


Freshy hat gesagt.:


> Ich sehe aber bloß in Englisch, Deutsch ist da effektiver.


Auch da streiten sich die Geister. Wenn man wirklich Software entwickeln will kommt man irgendwann um Englisch nicht mehr drumherum.


Freshy hat gesagt.:


> Ich war ja mal bei einem Grundlagen Kurs, vor nem Jahr. Also sollte ich die Grundlagen ja drauf haben^^


Ich glaube wir haben eine unterschiedliche Auffassung von "Grundlagen". Die Grundlagen lernt man nicht mal eben in einem Kurs.
Da muss man schon etwas üben


----------



## Freshy (4. Jul 2019)

Robat hat gesagt.:


> Gibts auch kostenlos im Netz.



Hier?



Robat hat gesagt.:


> Wenn man wirklich Software entwickeln will kommt man irgendwann um Englisch nicht mehr drumherum.



Das ist mir schon klar. Aber ich muss ja verstehen, wenn man z.B. erklärt was eine Deklaration ist, was die mir da sagen. Da hilft Google Übersetzer auch nicht mehr. Es geht mir ja nicht um die Befehle usw. sondern um die Erklärungen etc. wie bei der Java Insel.



Robat hat gesagt.:


> Die Grundlagen lernt man nicht mal eben in einem Kurs.



Naja, mein Kurs ging 1 Jahr.


----------



## Robat (4. Jul 2019)

Freshy hat gesagt.:


> Aber ich muss ja verstehen, wenn man z.B. erklärt was eine Deklaration ist, was die mir da sagen.


Das sollte man auch auf Englisch verstehen. Aber da kommen wir wohl nicht auf einen Nenner.  Ist auch egal. Der Link von dir sollte der richtige sein.

Wie stehts denn nun eigentlich um deinen Bot.. wie weit bist du da?


----------



## Freshy (4. Jul 2019)

Robat hat gesagt.:


> Wie stehts denn nun eigentlich um deinen Bot.. wie weit bist du da?



Wie gesagt, ich hänge immernoch an dem Timer. Es kommen immer Fehler.

Wie hast du eigentlich das coden gelernt? Wie lange hat das bei dir gedauert?


----------



## Robat (4. Jul 2019)

Und was für Fehler kommen? Die Imports die du für das Beispiel von oben brauchst:

```
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.entities.MessageChannel;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
```



Freshy hat gesagt.:


> Wie hast du eigentlich das coden gelernt?


Ich zitiere mal (ich glaub Sokrates war es): "Ich weiß, dass ich nichts weiß."  
Man lernt beim Programmieren jeden Tag dazu. Angefangen hab ich vor ca 8 Jahren.


----------



## Freshy (4. Jul 2019)

Robat hat gesagt.:


> import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.JDABuilder; import net.dv8tion.jda.core.entities.MessageChannel; import net.dv8tion.jda.core.events.message.MessageReceivedEvent; import net.dv8tion.jda.core.hooks.ListenerAdapter;



Bei den Imports kommt folgendes: The import (Import)cannot be resolved.

Woher will man denn wissen, welche Import man braucht?


----------



## Robat (4. Jul 2019)

Kann es sein, dass du ohne IDE (Eclipse, Netbeans, Intellij, ... ) programmierst? 
Eine IDE würde dir automatisch sagen wenn Klassen einen Import brauchen.

Bei welchem Import wird denn gemeckert?


----------



## Freshy (4. Jul 2019)

Doch, ich arbeite mit Eclipse. Bei den in meiner vorherigen Nachricht zitierten Imports wird gemeckert.


----------



## Robat (4. Jul 2019)

Dann hast du wohl die JDA API nicht (richtig) eingebunden. Entweder JAR downloaden und diese dem Classpath deines Projekt hinzufügen oder - bessere Variante - maven/gradle nutzen und die Dependency hinzufügen.


----------



## kneitzel (4. Jul 2019)

Also nur um es mal etwas zu konkretisieren: Du hast erst einmal kein Problem mit einem Timer. Der würde funktionieren, aber Du hast ein Problem, in dem Timer dann etwas sinnvolles zu machen....

Dann nur ein paar Dinge, die mir so aufgefallen sind:
a) In deinem Code solltest Du doch sehen, dass dieses completeTask() nur ein Dummy war, in dem man seinen Code schreiben könnte. Da ist nur ein sleep drin und das macht so ja für Dich keinen Sinn. Da Du Deinen Code direkt in run() haben willst, kannst Du completeTask komplett entfernen.

b) Du musst über die Architektur nachdenken. Du willst ja eben nicht auf irgend ein event reagieren sondern willst selbst etwas machen. Daher hast du eben keine Variable event oder so.
==> Schau Dir die API in Ruhe an: Wie kannst Du eine Verbindung aufbauen? Irgendwo rein joinen und da dann etwas schreiben? Wären drei Schritte, die Du nach und nach implementieren kannst. Wenn Du das hast, dann kannst Du auch den Timer hinzu fügen um dann regelmäßig etwas zu machen ...


----------



## Freshy (4. Jul 2019)

@Robat Maven und Dependency sind ja auch schon vorhanden: 

```
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>CommandLoopBot</groupId>
  <artifactId>CommandLoopBot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <repositories>
      <repository>
        <id>jcenter</id>
        <name>jcenter-bintray</name>
        <url>http://jcenter.bintray.com</url>
    </repository>
  </repositories>
  <dependencies>
      <dependency>
        <groupId>net.dv8tion</groupId>
        <artifactId>JDA</artifactId>
        <version>4.BETA.0_18</version>
        <exclusions>
            <exclusion>
                <groupId>club.minnced</groupId>
                <artifactId>opus-java</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
  </dependencies>
</project>
```

@kneitzel 


kneitzel hat gesagt.:


> a) In deinem Code solltest Du doch sehen, dass dieses completeTask() nur ein Dummy war, in dem man seinen Code schreiben könnte. Da ist nur ein sleep drin und das macht so ja für Dich keinen Sinn. Da Du Deinen Code direkt in run() haben willst, kannst Du completeTask komplett entfernen.



Da steht aber "assuming it takes 20 secs to complete the task". Und das ist halt genau das, was ich brauche. Bei mir müssten dann aber die Millisekunden für 1 Stunde drin stehen. Wofür ich die main brauche, verstehe ich nicht, denn was ist denn dieses "Daemon"?



kneitzel hat gesagt.:


> Wie kannst Du eine Verbindung aufbauen? Irgendwo rein joinen und da dann etwas schreiben?



Der Bot ist ja schon auf dem Server. Ich muss dafür auch nicht irgendwo rein joinen. Was der Bot aber machen muss, ist die Nachricht in einen definierten Channel rein zu schreiben. Danach soll er halt die Nachricht senden.


----------



## kneitzel (4. Jul 2019)

Also da scheint Dir etwas das Verständnis zu fehlen. Das Beispiel selbst sich nur rein auf den Timer konzentriert hat, gab es keine Aktivität, die Zeit beansprucht. Daher das "Thread.sleep(20000);" was einfach 20 Sekunden schläft.
Das macht aber doch bei Dir überhaupt keinen Sinn. Der Timer wird aufgerufen, wenn Die Tätigkeit ausgeführt werden soll und dann wird diese Tätigkeit direkt durchgeführt.

Und erst einmal hast Du nur ein reines Java Programm. Das ist nicht mit Discord verbunden. So wie ich das verstanden habe, dient zum Kontakt aufnehmen der JDABuilder: https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/core/JDABuilder.html.
Da kannst Du dann über ein Token die Verbindung aufbauen.

Nach dem build()  Aufruf hast Du eine JDA instanz. Damit kannst Du dann weiter arbeiten. Also z.B. getTextChanelById um den TextChannel zu bekommen auf dem du etwas schreiben kannst. https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/core/JDA.html

Und da hast Du dann z.B. das sendMessage.

Daher halte ich meine Hinweise für gerechtfertigt und Du solltest Deinen Ansatz / Vorgehen überdenken und erst einmal zu einem generellen Verständnis kommen.


----------



## Freshy (4. Jul 2019)

kneitzel hat gesagt.:


> Das ist nicht mit Discord verbunden. So wie ich das verstanden habe, dient zum Kontakt aufnehmen der JDABuilder



Natürlich ist es bereit in Discord voll integriert: 

```
public CommandLoopBot() throws LoginException, IllegalArgumentException {
        INSTANCE = this;
        
        DefaultShardManagerBuilder builder = new DefaultShardManagerBuilder();
        builder.setToken("TOKEN");
        
        builder.setActivity(Activity.playing("EUGaming Bot by CEO."));
        builder.setStatus(OnlineStatus.ONLINE);
        
        this.cmdMan = new CommandManager();
        
        builder.addEventListeners(new CommandListener());
        
        shardMan = builder.build();
        System.out.println("Bot ist jetzt online.");
```


----------



## kneitzel (5. Jul 2019)

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.

Sicher, dass Du da zwei Mal new CommandManager() brauchst und nicht cmdMan beim addEventListeners angeben musst?

Und wo ist jetzt Dein Problem? Du hast dann ja jetzt in shardMan die IDA Instanz so dass Du die Schritte wie von mir beschrieben ausführen können müsstest. Hast Du das schon einmal probiert? Und ggf. mehr bezüglich der Probleme, die Du derzeit hast, sagen.


----------



## Robat (5. Jul 2019)

Freshy hat gesagt.:


> Maven und Dependency sind ja auch schon vorhanden:


In der 4.0 BETA Version wurden das `core` Package in `api` umbenannt.
Aus `net.dv8tion.jda.core.JDA;` wird also `net.dv8tion.jda.api.JDA` ... gleiches Spiel mit den anderen Packages.
Außerdem wurde aus der `addEventListener()` Methode eine  `addEventListeners()` Methode ..

Die Punkte müsste man also in meinem Beispiel umändern.

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.


----------



## Freshy (5. Jul 2019)

kneitzel hat gesagt.:


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


kneitzel hat gesagt.:


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



Robat hat gesagt.:


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


----------



## Robat (5. Jul 2019)

Na wenn es dir NUR um den Timer geht hast du ja wiederholt schon antworten bekommen.. hier noch mal

```
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?


----------



## Freshy (5. Jul 2019)

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.


----------



## Robat (5. Jul 2019)

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. 

```
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.


----------



## Freshy (5. Jul 2019)

Danke. Das funktioniert. Du hast gesagt 





Robat hat 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?


----------



## Robat (5. Jul 2019)

Robat hat gesagt.:


> 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?


----------



## Freshy (5. Jul 2019)

Robat hat gesagt.:


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


----------



## Robat (5. Jul 2019)

Ich würde jetzt mal behaupten, dass das so ohne weiteres mit der JDA Api nicht möglich ist.


----------



## Freshy (5. Jul 2019)

Ich habe mal den Discord Support angeschrieben, ob es da vielleicht eine Lösung gibt.


----------



## Robat (6. Jul 2019)

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


----------



## Freshy (6. Jul 2019)

Ja, Discord hat auch geschrieben 





> Generell ist das nicht möglich und du kannst diese Einschränkung der API, welche es aus gutem Grund gibt, nicht umgehen.



Naja... Dann verwende ich den Bot eben anders..


----------



## Freshy (9. Jul 2019)

-


----------

