** 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.
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)
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();
    }
}
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();
}
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);
    }
}
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);
    });
}
Voici la 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);
        });
    }
}
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();
    }
}
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 ...
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