[JAVA] J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord

introduction

** Veuillez noter que ceci est le premier message de qiita, donc il peut être difficile à lire. ** **

** Veuillez noter que nous ne présenterons pas comment obtenir le jeton API Discord Bot cette fois. ** **

Logiciel serveur Minecraft BE Avec l'extension plug-in de Nukkit J'ai écrit à l'implémentation de la fonction pour afficher le chat sur le serveur en temps réel avec Discord's Bot.

Déposez la bibliothèque avec Maven

Ajoutez-les à pom.xml.

pom.xml


...
<repositories>
    ...
    <repository>
        <id>jcenter</id>
        <url>http://jcenter.bintray.com</url>
    </repository>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
...

...
<dependencies>
    ...
    <dependency>
        <groupId>com.github.austinv11</groupId>
        <artifactId>Discord4J</artifactId>
        <version>2.10.1</version>
    </dependency>
</dependencies>
...

Si vous souhaitez le déposer manuellement, cliquez ici (https://discord4j.com/downloads.html)

Essayez d'utiliser la bibliothèque

S'identifier

DiscordChatService.java


public class DiscordChatService implements Listener {
    private final String Token = "Jeton d'API obtenu";
    private IDiscordClient client;
    private IChannel chatChannel;

    //Placez une classe qui hérite de PluginBase dans le constructeur.
    //Cette fois, j'utilise MyPlugin comme exemple.
    public DiscordChatService(MyPlugin plugin) {
        this.login();

        Server.getInstance().getPluginManager().registerEvents(this, plugin);
    }

    private void login() {
        //Connectez-vous à l'aide du jeton API obtenu auprès de Discord.
        this.client = new ClientBuilder().withToken(TOKEN).build();

        //Quand j'écris ceci@EventSubscriber Rappelle l'événement qui était attaché.
        this.client.getDispatcher().registerListener(this);

        //S'identifier
        this.client.login();
    }
}

Implémenter un rappel de fin de connexion

DiscordChatService.java


@EventSubscriber
public synchronized void onReady(ReadyEvent event) {
    Server.getInstance().getLogger().info("Bot s'est connecté.");

    //Obtenez la chaîne publiée par Bot ici.
    this.chatChannel = this.client.getChannels().stream().filter(ch -> ch.getName().equals("chat")
        && ch.getCategory().getName().equals("SERVER")).findFirst().get();
}

De là, le sujet principal (Discord-> Serveur) Implémentation du chat

DiscordChatService.java


@EventSubscriber
public synchronized void onMessage(MessageReceivedEvent event) throws RateLimitException, DiscordException, MissingPermissionsException {
    IMessage message = event.getMessage();
    IUser user = message.getAuthor();

    //Bloquer le chat Bot.
    if (user.isBot()) return;

    //Récupérez la chaîne du message.
    IChannel channel = message.getChannel();

    //Spécifier les canaux et les catégories Discord(Sans cela, vous recevrez des messages de tous les canaux)
    //Sauf indication contraire, vous pouvez le supprimer.
    if (channel.getCategory().getName().equals("SERVER")// "SERVER"Est-ce une catégorie nommée
            && channel.getName().equals("chat")) {// "chat"Est-ce une chaîne nommée

        //Corps du message.
        String mes = message.getContent();

        //Obtenez le nom d'utilisateur.
        String name = user.getName();

        //Concaténez les chaînes et diffusez le chat sur le serveur.
        Server.getInstance().broadcastMessage("[" + name + "] " + mes);
    }
}

(Serveur-> Discord) Implémentation du chat

C'était difficile. Cependant, il y a un problème avec ce code. Le serveur se fige momentanément car aucune discussion n'est envoyée de manière asynchrone.

DiscordChatService.java


@EventHandler
public void onPlayerChatEvent(PlayerChatEvent event) {
    Player player = event.getPlayer();
    String name = player.getName();
    String msg = "[" + name + "] " + event.getMessage();

    //Une mise en œuvre qui tient compte des restrictions tarifaires.(Renverra sans autorisation)
    //Si vous l'implémentez normalement, vous obtiendrez une RateLimitException.
    RequestBuffer.request(() -> {
        //Publier sur la chaîne.
        this.chatChannel.sendMessage(msg);
    });
}

Version améliorée

Voici la classe d'implémentation Oreore

Classe d'implémentation Oreore

ThreadPool.java



import java.util.HashMap;
import java.util.concurrent.ConcurrentLinkedQueue;

public final class ThreadPool {
    private static final HashMap<String, ActionThread> pool = new HashMap<>();

    static {
        registerThread("DiscordMassage");
    }

    public static void registerThread(String name) {
        Safe.nullCheck(name);

        ActionThread thread = new ActionThread(name);
        pool.put(name, thread);
        thread.start();
    }

    public static void addAction(String threadName, Runnable action) {
        ActionThread thread = pool.get(threadName);
        thread.addAction(action);
    }

    public static void close(String threadName) {
        ActionThread thread = pool.remove(threadName);
        thread.close();
    }

    private static class ActionThread extends Thread {
        private ConcurrentLinkedQueue<Runnable> actions = new ConcurrentLinkedQueue<>();
        private boolean isClose;

        public ActionThread(String name) {
            this.setName(name);
        }

        @Override
        public void run() {
            while (!this.isClose) {
                if (this.actions.isEmpty())
                    continue;
                this.actions.poll().run();
            }
        }

        public void addAction(Runnable action) {
            this.actions.offer(action);
        }

        public void close() {
            this.isClose = true;
        }
    }
}

Et utilisez la classe d'implémentation oleore

DiscordChatService.java


@EventHandler
public void onPlayerChatEvent(PlayerChatEvent event) {
    Player player = event.getPlayer();
    String name = player.getName();
    String msg = "[" + name + "] " + event.getMessage();

    //Utiliser ma classe d'implémentation
    ThreadPool.addAction("DiscordMassage", () -> {
        //Une mise en œuvre qui tient compte des restrictions tarifaires.(Renverra sans autorisation)
        RequestBuffer.request(() -> {
            //Publier sur la chaîne.
            this.chatChannel.sendMessage(msg);
        });
    }
}

Utilisez la magie noire pour effacer le journal Discord 4J

Parce que c'était un obstacle personnellement

DiscordChatService.java


public DiscordChatService(MyPlugin plugin) {
...
    try {
        Field f = Discord4J.class.getDeclaredField("LOGGER");//Obtenez un champ appelé Logger
        Field modifiersField = Field.class.getDeclaredField("modifiers");//Classe sombre qui gère l'accessibilité
        modifiersField.setAccessible(true);
        modifiersField.setInt(f, f.getModifiers() & ~Modifier.PRIVATE & ~Modifier.FINAL);//Falsification
        f.set(null, new DummyLogger());//Définir un enregistreur factice
    } catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }
}
Classe factice

DummyLogger


import org.slf4j.Logger;
import org.slf4j.Marker;

public class DummyLogger implements Logger {
    @Override
    public String getName() {
        return null;
    }

    @Override
    public boolean isTraceEnabled() {
        return false;
    }


    @Override
    public void trace(String s) {

    }

    @Override
    public void trace(String s, Object o) {

    }

    @Override
    public void trace(String s, Object o, Object o1) {

    }

    @Override
    public void trace(String s, Object... object) {

    }

    @Override
    public void trace(String s, Throwable throwable) {

    }

    @Override
    public boolean isTraceEnabled(Marker marker) {
        return false;
    }

    @Override
    public void trace(Marker marker, String s) {

    }

    @Override
    public void trace(Marker marker, String s, Object o) {

    }

    @Override
    public void trace(Marker marker, String s, Object o, Object o1) {

    }

    @Override
    public void trace(Marker marker, String s, Object... object) {

    }

    @Override
    public void trace(Marker marker, String s, Throwable throwable) {

    }

    @Override
    public boolean isDebugEnabled() {
        return false;
    }

    @Override
    public void debug(String s) {

    }

    @Override
    public void debug(String s, Object o) {

    }

    @Override
    public void debug(String s, Object o, Object o1) {

    }

    @Override
    public void debug(String s, Object... object) {

    }

    @Override
    public void debug(String s, Throwable throwable) {

    }

    @Override
    public boolean isDebugEnabled(Marker marker) {
        return false;
    }

    @Override
    public void debug(Marker marker, String s) {

    }

    @Override
    public void debug(Marker marker, String s, Object o) {

    }

    @Override
    public void debug(Marker marker, String s, Object o, Object o1) {

    }

    @Override
    public void debug(Marker marker, String s, Object... object) {

    }

    @Override
    public void debug(Marker marker, String s, Throwable throwable) {

    }

    @Override
    public boolean isInfoEnabled() {
        return false;
    }

    @Override
    public void info(String s) {

    }

    @Override
    public void info(String s, Object o) {

    }

    @Override
    public void info(String s, Object o, Object o1) {

    }

    @Override
    public void info(String s, Object... object) {

    }

    @Override
    public void info(String s, Throwable throwable) {

    }

    @Override
    public boolean isInfoEnabled(Marker marker) {
        return false;
    }

    @Override
    public void info(Marker marker, String s) {

    }

    @Override
    public void info(Marker marker, String s, Object o) {

    }

    @Override
    public void info(Marker marker, String s, Object o, Object o1) {

    }

    @Override
    public void info(Marker marker, String s, Object... object) {

    }

    @Override
    public void info(Marker marker, String s, Throwable throwable) {

    }

    @Override
    public boolean isWarnEnabled() {
        return false;
    }

    @Override
    public void warn(String s) {

    }

    @Override
    public void warn(String s, Object o) {

    }

    @Override
    public void warn(String s, Object... object) {

    }

    @Override
    public void warn(String s, Object o, Object o1) {

    }

    @Override
    public void warn(String s, Throwable throwable) {

    }

    @Override
    public boolean isWarnEnabled(Marker marker) {
        return false;
    }

    @Override
    public void warn(Marker marker, String s) {

    }

    @Override
    public void warn(Marker marker, String s, Object o) {

    }

    @Override
    public void warn(Marker marker, String s, Object o, Object o1) {

    }

    @Override
    public void warn(Marker marker, String s, Object... object) {

    }

    @Override
    public void warn(Marker marker, String s, Throwable throwable) {

    }

    @Override
    public boolean isErrorEnabled() {
        return false;
    }

    @Override
    public void error(String s) {

    }

    @Override
    public void error(String s, Object o) {

    }

    @Override
    public void error(String s, Object o, Object o1) {

    }

    @Override
    public void error(String s, Object... object) {

    }

    @Override
    public void error(String s, Throwable throwable) {

    }

    @Override
    public boolean isErrorEnabled(Marker marker) {
        return false;
    }

    @Override
    public void error(Marker marker, String s) {

    }

    @Override
    public void error(Marker marker, String s, Object o) {

    }

    @Override
    public void error(Marker marker, String s, Object o, Object o1) {

    }

    @Override
    public void error(Marker marker, String s, Object... object) {

    }

    @Override
    public void error(Marker marker, String s, Throwable throwable) {

    }
}

Et la paix est venue ...

Résumé

En plus de cela, il est nécessaire d'implémenter des fonctions telles que la limite de longueur et la transmission collective de chat, mais je l'écrirai s'il y a du temps dans le futur.

Recommended Posts

J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
J'ai essayé d'interagir avec Java
J'ai essayé de créer un serveur API avec Go (Echo) x MySQL x Docker x Clean Architecture
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de démarrer avec Web Assembly
J'ai essayé de résumer l'API Stream
J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai essayé de lier grafana et postgres [docker-compose]
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de créer un portefeuille avec AWS, Docker, CircleCI, Laravel [avec lien de référence]
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé de démarrer avec Spring Data JPA
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
J'ai essayé de vérifier le fonctionnement de la requête http (Put) avec Talented API Tester
J'ai essayé de moderniser une application Java EE avec OpenShift.
J'ai essayé DI avec Ruby
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
Ce à quoi j'étais accro avec l'API REST Redmine
J'ai essayé UPSERT avec PostgreSQL.
Lier l'API avec Spring + Vue.js
J'ai essayé BIND avec Docker
J'ai essayé de vérifier yum-cron
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
J'ai essayé de pouvoir passer plusieurs objets avec Ractor
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé de me connecter à MySQL en utilisant le modèle JDBC avec Spring MVC
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de créer un environnement de développement http2 avec Eclipse + Tomcat
J'ai essayé d'implémenter un mappage OU flexible avec MyBatis Dynamic SQL
J'ai essayé de réimplémenter Ruby's Float (arg, exception: true) avec builtin
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
J'ai essayé de mâcher C # (indexeur)
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé l'analyse morphologique avec MeCab
J'ai essayé de résumer le support d'iOS 14
J'ai essayé la communication UDP avec Java
J'ai essayé d'expliquer la méthode