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