** Bitte beachten Sie, dass dies der erste Qiita-Beitrag ist, daher kann es schwierig sein, ihn zu lesen. ** ** **
** Bitte beachten Sie, dass wir dieses Mal nicht vorstellen werden, wie Sie das Discord Bot API-Token erhalten. ** ** **
Minecraft BE Server Software Mit der Plug-In-Erweiterung von Nukkit Ich habe bis zur Implementierung der Funktion geschrieben, um den Chat auf dem Server in Echtzeit mit Discord's Bot anzuzeigen.
Fügen Sie diese zu pom.xml hinzu.
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>
...
Wenn Sie es manuell löschen möchten, klicken Sie hier (https://discord4j.com/downloads.html).
DiscordChatService.java
public class DiscordChatService implements Listener {
private final String Token = "API-Token erhalten";
private IDiscordClient client;
private IChannel chatChannel;
//Fügen Sie eine Klasse, die PluginBase erbt, in den Konstruktor ein.
//Dieses Mal verwende ich MyPlugin als Beispiel.
public DiscordChatService(MyPlugin plugin) {
this.login();
Server.getInstance().getPluginManager().registerEvents(this, plugin);
}
private void login() {
//Melden Sie sich mit dem von Discord erhaltenen API-Token an.
this.client = new ClientBuilder().withToken(TOKEN).build();
//Wenn ich das schreibe@EventSubscriber Ruft das angehängte Ereignis zurück.
this.client.getDispatcher().registerListener(this);
//Einloggen
this.client.login();
}
}
DiscordChatService.java
@EventSubscriber
public synchronized void onReady(ReadyEvent event) {
Server.getInstance().getLogger().info("Bot hat sich angemeldet.");
//Holen Sie sich den Kanal von Bot hier gepostet.
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();
//Blockieren Sie den Bot-Chat.
if (user.isBot()) return;
//Holen Sie sich den Kanal aus der Nachricht.
IChannel channel = message.getChannel();
//Geben Sie Discord-Kanäle und -Kategorien an(Ohne sie erhalten Sie Nachrichten von allen Kanälen)
//Sofern nicht anders angegeben, können Sie es löschen.
if (channel.getCategory().getName().equals("SERVER")// "SERVER"Ist es eine Kategorie namens
&& channel.getName().equals("chat")) {// "chat"Ist es ein Kanal namens
//Nachrichtentext.
String mes = message.getContent();
//Holen Sie sich den Benutzernamen.
String name = user.getName();
//Verketten Sie Zeichenfolgen und senden Sie den Chat auf dem Server.
Server.getInstance().broadcastMessage("[" + name + "] " + mes);
}
}
Das war schwierig. Es gibt jedoch ein Problem mit diesem Code. Der Server friert kurz ein, da keine Chats asynchron gesendet werden.
DiscordChatService.java
@EventHandler
public void onPlayerChatEvent(PlayerChatEvent event) {
Player player = event.getPlayer();
String name = player.getName();
String msg = "[" + name + "] " + event.getMessage();
//Implementierung, die Ratenbeschränkungen berücksichtigt.(Wird ohne Erlaubnis erneut gesendet)
//Wenn Sie es normal implementieren, erhalten Sie eine RateLimitException.
RequestBuffer.request(() -> {
//Auf Kanal posten.
this.chatChannel.sendMessage(msg);
});
}
Hier kommt die Oreore-Implementierungsklasse
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;
}
}
}
Und verwenden Sie die Oleore-Implementierungsklasse
DiscordChatService.java
@EventHandler
public void onPlayerChatEvent(PlayerChatEvent event) {
Player player = event.getPlayer();
String name = player.getName();
String msg = "[" + name + "] " + event.getMessage();
//Verwenden Sie meine Implementierungsklasse
ThreadPool.addAction("DiscordMassage", () -> {
//Implementierung, die Ratenbeschränkungen berücksichtigt.(Wird ohne Erlaubnis erneut gesendet)
RequestBuffer.request(() -> {
//Auf Kanal posten.
this.chatChannel.sendMessage(msg);
});
}
}
Weil es persönlich ein Hindernis war
DiscordChatService.java
public DiscordChatService(MyPlugin plugin) {
...
try {
Field f = Discord4J.class.getDeclaredField("LOGGER");//Holen Sie sich ein Feld namens Logger
Field modifiersField = Field.class.getDeclaredField("modifiers");//Dunkle Klasse, die die Zugänglichkeit verwaltet
modifiersField.setAccessible(true);
modifiersField.setInt(f, f.getModifiers() & ~Modifier.PRIVATE & ~Modifier.FINAL);//Manipulationen
f.set(null, new DummyLogger());//Stellen Sie einen Dummy-Logger ein
} 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) {
}
}
Und Frieden ist gekommen ...
Darüber hinaus ist es notwendig, Funktionen wie Längenbegrenzung und kollektive Chat-Übertragung zu implementieren, aber ich werde es schreiben, wenn es in Zukunft Zeit gibt.