diff --git a/.idea/artifacts/API.xml b/.idea/artifacts/API.xml
index 5347cb7..0987a84 100644
--- a/.idea/artifacts/API.xml
+++ b/.idea/artifacts/API.xml
@@ -4,6 +4,7 @@
+
\ No newline at end of file
diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml
new file mode 100644
index 0000000..780105b
--- /dev/null
+++ b/.idea/material_theme_project_new.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 59c36e8..a93cafe 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -9,51 +9,16 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -90,30 +55,30 @@
- {
+ "keyToString": {
+ "Maven.API [install].executor": "Run",
+ "Maven.API [package].executor": "Run",
+ "Maven.Chatsystem [package].executor": "Run",
+ "Maven.api [validate].executor": "Run",
+ "OpenRewrite.Faces4xMigrationToFaces41x.executor": "Run",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "SHARE_PROJECT_CONFIGURATION_FILES": "true",
+ "git-widget-placeholder": "main",
+ "kotlin-language-version-configured": "true",
+ "last_opened_file_path": "C:/Users/nicon/IdeaProjects/API/plugin.yml",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "project.structure.last.edited": "Artifacts",
+ "project.structure.proportion": "0.15",
+ "project.structure.side.proportion": "0.2",
+ "settings.editor.selected.configurable": "reference.settings.project.maven.repository.indices",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
@@ -196,7 +161,27 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -214,7 +199,31 @@
1725100719277
-
+
+
+ 1780238314802
+
+
+
+ 1780238314802
+
+
+
+ 1781464653808
+
+
+
+ 1781464653809
+
+
+
+ 1781643828458
+
+
+
+ 1781643828458
+
+
@@ -233,7 +242,9 @@
-
+
+
+
diff --git a/plugin.yml b/plugin.yml
index 3fe45c1..500d80c 100644
--- a/plugin.yml
+++ b/plugin.yml
@@ -5,19 +5,23 @@ author: legan100
main: de.legan100.api.API
commands:
color:
- farbe:
- farben:
+ aliases:
+ - farbe
+ - farben
rang:
wartung:
chat:
discord:
ts:
- Teamspeak:
+ aliases:
+ - teamspeak
regel:
- regelwerk:
- regeln:
- apiver:
+ aliases:
+ - regelwerk
+ - regeln
+ - rules
apiversion:
+ aliases: [apiver]
gruss:
msg:
tell:
@@ -37,4 +41,8 @@ commands:
kreativ:
adventure:
uuid:
- bcl:
\ No newline at end of file
+ bcl:
+ globalrestart:
+ GetBackendConnection:
+ gbc:
+ backendrestart:
\ No newline at end of file
diff --git a/src/de/legan100/api/API.java b/src/de/legan100/api/API.java
index b5d0e6c..6928bcb 100644
--- a/src/de/legan100/api/API.java
+++ b/src/de/legan100/api/API.java
@@ -3,6 +3,7 @@
import de.legan100.api.commands.*;
import de.legan100.api.listener.ChatListener;
import de.legan100.api.listener.JoinListener;
+import de.legan100.api.utils.BackendClient;
import de.legan100.api.utils.Broadcaster;
import de.legan100.api.utils.FileManager;
import de.legan100.api.utils.MySQL;
@@ -11,18 +12,45 @@
public class API extends JavaPlugin {
private static API instance;
+ private static BackendClient backend;
+ public static API getInstance() {
+ return instance;
+ }
+
+ public static BackendClient getBackend() {
+ return backend;
+ }
+ @Override
public void onEnable() {
- (new Broadcaster(this)).startBroadcast();
+ instance = this;
+ new Broadcaster(this).startBroadcast();
register();
FileManager.createFile();
- instance = this;
- }
+ backend = new BackendClient();
+ backend.connect();
+ backend.send("""
+ {
+ "type":"SERVER_START",
+ "server":"%s"
+ }
+ """.formatted(getServer().getName()));
+ }
+ @Override
public void onDisable() {
- MySQL.disconnect();
+ System.out.println("1");
+ if (backend != null) {
+ backend.send("""
+ {
+ "type":"SERVER_STOP ,
+ "server":"%s"
+ }
+ """.formatted(getServer().getName()));
+ backend.disconnect();
+ }
}
public void register() {
@@ -62,11 +90,11 @@ public void register() {
getCommand("uuid").setExecutor(new CMD_uuid());
getCommand("bcl").setExecutor(new CMD_BCL());
getCommand("gm").setExecutor(new CMD_GM());
+ getCommand("globalrestart").setExecutor(new CMD_globalrestart());
+ getCommand("GetBackendConnection").setExecutor(new CMD_GetBackendConnection());
+ getCommand("gbc").setExecutor(new CMD_globalchatclear());
+ getCommand("backendrestart").setExecutor(new CMD_backendrestart());
getServer().getPluginManager().registerEvents(new ChatListener(), this);
getServer().getPluginManager().registerEvents(new JoinListener(), this);
}
-
- public API getInstance(){
- return this;
- }
-}
+}
\ No newline at end of file
diff --git a/src/de/legan100/api/commands/CMD_APIver.java b/src/de/legan100/api/commands/CMD_APIver.java
index c1fb61e..5949a62 100644
--- a/src/de/legan100/api/commands/CMD_APIver.java
+++ b/src/de/legan100/api/commands/CMD_APIver.java
@@ -1,5 +1,6 @@
package de.legan100.api.commands;
+import de.legan100.api.API;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@@ -13,12 +14,12 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
File messageDE = new File("plugins//API//message_de_DE.yml");
YamlConfiguration cfg1 = YamlConfiguration.loadConfiguration(messageDE);
if (sender instanceof Player p) {
- if (p.hasPermission("system.admin"))
- sender.sendMessage(cfg1.getString("message.prefix") + "Das Plugin ist in der Version 1.1");
+ if (p.hasPermission("system.vorstand"))
+ sender.sendMessage(cfg1.getString("message.prefix") + "Das Plugin ist in der Version " + API.getInstance().getPluginMeta().getVersion());
else
p.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.noPerms"));
} else {
- sender.sendMessage(cfg1.getString("message.prefix") + "Das Plugin ist in der Version 1.1");
+ sender.sendMessage(cfg1.getString("message.prefix") + "Das Plugin ist in der Version " + API.getInstance().getPluginMeta().getVersion());
}
return true;
}
diff --git a/src/de/legan100/api/commands/CMD_BCL.java b/src/de/legan100/api/commands/CMD_BCL.java
index 64a8dff..d5468c7 100644
--- a/src/de/legan100/api/commands/CMD_BCL.java
+++ b/src/de/legan100/api/commands/CMD_BCL.java
@@ -14,7 +14,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
File messageDE = new File("plugins//API//message_de_DE.yml");
YamlConfiguration cfg1 = YamlConfiguration.loadConfiguration(messageDE);
if (sender instanceof Player p) {
- if (p.hasPermission("system.admin")) {
+ if (p.hasPermission("system.vorstand")) {
if (args.length >= 1) {
String bcMessage = "";
for (String arg : args) {
diff --git a/src/de/legan100/api/commands/CMD_Chatclear.java b/src/de/legan100/api/commands/CMD_Chatclear.java
index b56db7e..c4bc6e9 100644
--- a/src/de/legan100/api/commands/CMD_Chatclear.java
+++ b/src/de/legan100/api/commands/CMD_Chatclear.java
@@ -16,7 +16,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
if (sender instanceof Player p) {
if (p.hasPermission("System.Admin")||p.hasPermission("System.SrMod")){
for (Player players : Bukkit.getServer().getOnlinePlayers()) {
- if (!players.hasPermission("system.vorstand")) {
+ if (players.hasPermission("system.default")||players.hasPermission("system.media")) {
for (int i = 0; i < 150; i++) {
players.sendMessage(" ");
}
diff --git a/src/de/legan100/api/commands/CMD_GetBackendConnection.java b/src/de/legan100/api/commands/CMD_GetBackendConnection.java
new file mode 100644
index 0000000..5b654fc
--- /dev/null
+++ b/src/de/legan100/api/commands/CMD_GetBackendConnection.java
@@ -0,0 +1,25 @@
+package de.legan100.api.commands;
+
+import de.legan100.api.API;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+public class CMD_GetBackendConnection implements CommandExecutor {
+ @Override
+ public boolean onCommand(CommandSender sender, Command cmd, @NotNull String s, @NotNull String @NotNull [] strings) {
+ if(sender instanceof Player p) {
+ if(p.hasPermission("system.vorstand")){
+ if(API.getBackend().isConnected()){
+ p.sendMessage("API is connected");
+ }else {
+ p.sendMessage("API is disconnected");
+ }
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/de/legan100/api/commands/CMD_backendrestart.java b/src/de/legan100/api/commands/CMD_backendrestart.java
new file mode 100644
index 0000000..c183469
--- /dev/null
+++ b/src/de/legan100/api/commands/CMD_backendrestart.java
@@ -0,0 +1,36 @@
+package de.legan100.api.commands;
+
+import de.legan100.api.API;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+
+public class CMD_backendrestart implements CommandExecutor {
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] args) {
+ File messageDE = new File("plugins//Backend//message_de_DE.yml");
+ YamlConfiguration cfg1 = YamlConfiguration.loadConfiguration(messageDE);
+ if(sender instanceof Player p) {
+ if(p.hasPermission("backend.admin") ) {
+ if(args.length == 0) {
+ API.getBackend().send("bc_backendrestart");
+ p.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.backendrestart.send"));
+
+ }else {
+ p.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.backendrestart.usage"));
+ }
+ }else {
+ p.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.noPerms"));
+ }
+ }else {
+ sender.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.onlyPlayerAllowed"));
+ }
+
+ return false;
+ }
+}
diff --git a/src/de/legan100/api/commands/CMD_globalchatclear.java b/src/de/legan100/api/commands/CMD_globalchatclear.java
new file mode 100644
index 0000000..965c92b
--- /dev/null
+++ b/src/de/legan100/api/commands/CMD_globalchatclear.java
@@ -0,0 +1,40 @@
+package de.legan100.api.commands;
+
+import de.legan100.api.API;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+
+public class CMD_globalchatclear implements CommandExecutor {
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String s, String [] args) {
+ File messageDE = new File("plugins//Backend//message_de_DE.yml");
+ YamlConfiguration cfg1 = YamlConfiguration.loadConfiguration(messageDE);
+ if(sender instanceof Player p ) {
+ if(p.hasPermission("backend.admin")){
+ if (args.length >= 1) {
+ String bcMessage = "";
+ for (String arg : args) {
+ bcMessage = bcMessage + " " + arg;
+ }
+ if (bcMessage.contains("&")) {
+ bcMessage.replace("§", "&");
+ }
+ API.getBackend().send("bc_globalbroadcast_" + bcMessage);
+ } else {
+ p.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.bcl.usage"));
+ }
+ }else {
+ p.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.noPerms"));
+ }
+ }else {
+ sender.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.onlyPlayerAllowed"));
+ }
+
+ return false;
+ }
+}
diff --git a/src/de/legan100/api/commands/CMD_globalrestart.java b/src/de/legan100/api/commands/CMD_globalrestart.java
new file mode 100644
index 0000000..c5170dc
--- /dev/null
+++ b/src/de/legan100/api/commands/CMD_globalrestart.java
@@ -0,0 +1,30 @@
+package de.legan100.api.commands;
+
+import de.legan100.api.API;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+
+public class CMD_globalrestart implements CommandExecutor {
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String s, @NotNull String @NotNull [] strings) {
+ File messageDE = new File("plugins//Backend//message_de_DE.yml");
+ YamlConfiguration cfg1 = YamlConfiguration.loadConfiguration(messageDE);
+ if(sender instanceof Player p) {
+ if(p.hasPermission("backend.admin")){
+ API.getBackend().send("bc_globalrestart");
+ }else {
+ p.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.noPerms"));
+ }
+ }else {
+ sender.sendMessage(cfg1.getString("message.prefix") + cfg1.getString("message.onlyPlayerAllowed"));
+ }
+
+ return false;
+ }
+}
diff --git a/src/de/legan100/api/utils/BackendClient.java b/src/de/legan100/api/utils/BackendClient.java
new file mode 100644
index 0000000..c1caf7d
--- /dev/null
+++ b/src/de/legan100/api/utils/BackendClient.java
@@ -0,0 +1,243 @@
+package de.legan100.api.utils;
+
+import de.legan100.api.API;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.scheduler.BukkitTask;
+
+import java.io.*;
+import java.net.Socket;
+import java.util.concurrent.atomic.*;
+
+public class BackendClient {
+
+ private static final String HOST = "127.0.0.1";
+ private static final int PORT = 10000;
+ private static final long RECONNECT_DELAY = 5000L;
+ private static final int MAX_RECONNECT_ATTEMPTS = 3;
+
+ private Socket socket;
+ private PrintWriter out;
+ private BufferedReader in;
+
+ private Thread listenerThread;
+ private Thread reconnectThread;
+
+ private BukkitTask pingTask;
+
+ private final AtomicBoolean connected = new AtomicBoolean(false);
+ private final AtomicBoolean reconnecting = new AtomicBoolean(false);
+ private final AtomicBoolean shuttingDown = new AtomicBoolean(false);
+
+ private final AtomicInteger reconnectAttempts = new AtomicInteger(0);
+
+ public void connect() {
+
+ if (shuttingDown.get()) return;
+ try {
+ openSocket();
+ connected.set(true);
+ reconnectAttempts.set(0);
+ for (Player player : Bukkit.getOnlinePlayers()) {
+ if (player.hasPermission("backend.admin")) {
+ player.sendMessage("[BackendClient] Connected");
+ }
+ }
+ System.out.println("[BackendClient] Connected");
+ startListener();
+ } catch (Exception e) {
+ connected.set(false);
+ reconnect();
+ }
+ }
+
+ private void openSocket() throws IOException {
+ socket = new Socket(HOST, PORT);
+ socket.setKeepAlive(true);
+ socket.setTcpNoDelay(true);
+ out = new PrintWriter(socket.getOutputStream(), true);
+ in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+ }
+
+ private void startListener() {
+ listenerThread = new Thread(() -> {
+ try {
+ String line;
+ while (!shuttingDown.get()) {
+ try {
+ line = in.readLine();
+ if (line == null) {
+ break;
+ }
+ } catch (Exception e) {
+ break;
+ }
+ handle(line);
+ }
+ } finally {
+ connected.set(false);
+ if (!shuttingDown.get()) {
+ reconnect();
+ }
+ }
+ });
+ listenerThread.setName("Backend-Listener");
+ listenerThread.setDaemon(true);
+ listenerThread.start();
+ }
+
+ private void handle(String msg) {
+ if ("bc_globalrestart_allow".equalsIgnoreCase(msg)) {
+ API.getInstance().getServer().shutdown();
+ } else if (msg.startsWith("gbc_")) {
+ String zweiterString = "";
+ for (int x = 0; x < msg.length(); x++) {
+ if (msg.charAt(x) == '_') {
+ zweiterString = msg.substring(x + 1);
+ break;
+ }
+ }
+ API.getInstance().getServer().broadcastMessage("§9-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
+ API.getInstance().getServer().broadcastMessage("");
+ API.getInstance().getServer().broadcastMessage(zweiterString);
+ API.getInstance().getServer().broadcastMessage("");
+ API.getInstance().getServer().broadcastMessage("§9-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
+ } else if (msg.startsWith("bc_backendrestart")) {
+ for (Player player : Bukkit.getOnlinePlayers()) {
+ if (player.hasPermission("backend.admin")) {
+ player.sendMessage("Backendrestart");
+ }
+ }
+ }
+
+ System.out.println("[BACKEND] " + msg);
+ }
+
+ private void reconnect() {
+ if (shuttingDown.get()) return;
+ if (!reconnecting.compareAndSet(false, true)) {
+ return;
+ }
+
+ reconnectThread = new Thread(() -> {
+ try {
+ while (!connected.get() && !shuttingDown.get()) {
+ int attempt = reconnectAttempts.incrementAndGet();
+ try {
+ System.out.println("[BackendClient] Reconnect attempt " + attempt + "/" + MAX_RECONNECT_ATTEMPTS);
+ closeSocketQuietly();
+ openSocket();
+ connected.set(true);
+ reconnectAttempts.set(0);
+ for (Player player : Bukkit.getOnlinePlayers()) {
+ if (player.hasPermission("backend.admin")) {
+ player.sendMessage("Backend connected");
+ }
+ }
+ System.out.println("[BackendClient] Reconnected");
+ startListener();
+ send("statsport_" + API.getInstance().getServer().getPort());
+ return;
+ } catch (Exception ignored) {
+ if (attempt >= MAX_RECONNECT_ATTEMPTS) {
+ Bukkit.getLogger().severe("[BackendClient] Backend unreachable after " + MAX_RECONNECT_ATTEMPTS + " reconnect attempts. Shutting down server.");
+ Bukkit.getScheduler().runTask(API.getInstance(), Bukkit::shutdown);
+ return;
+ }
+ }
+ try {
+ Thread.sleep(RECONNECT_DELAY);
+ } catch (InterruptedException ignored) {
+ return;
+ }
+ }
+ } finally {
+ reconnecting.set(false);
+ }
+ });
+
+ reconnectThread.setName("Backend-Reconnect");
+ reconnectThread.setDaemon(true);
+ reconnectThread.start();
+ }
+
+ public void send(String msg) {
+
+ if (!isConnected()) {
+ return;
+ }
+ try {
+ out.println(msg);
+ if (out.checkError()) {
+ throw new IOException("Write failed");
+ }
+ } catch (Exception e) {
+ connected.set(false);
+ if (!shuttingDown.get()) {
+ reconnect();
+ }
+ }
+ }
+
+ public boolean isConnected() {
+ return connected.get() && socket != null && !socket.isClosed();
+ }
+
+ public void disconnect() {
+ shuttingDown.set(true);
+ connected.set(false);
+ System.out.println("DISCONNECT START");
+ for (Player player : Bukkit.getOnlinePlayers()) {
+ if (player.hasPermission("backend.admin")) {
+ player.sendMessage("DISCONNECT START");
+ }
+ }
+ if (pingTask != null) {
+ pingTask.cancel();
+ pingTask = null;
+ }
+ closeSocketQuietly();
+ if (listenerThread != null) {
+ listenerThread.interrupt();
+ }
+ if (reconnectThread != null) {
+ reconnectThread.interrupt();
+ }
+ System.out.println("DISCONNECT END");
+ for (Player player : Bukkit.getOnlinePlayers()) {
+ if (player.hasPermission("backend.admin")) {
+ player.sendMessage("DISCONNECT END");
+ }
+ }
+ }
+
+ private void closeSocketQuietly() {
+ try {
+ if (socket != null) {
+ socket.shutdownInput();
+ socket.shutdownOutput();
+ }
+ } catch (Exception ignored) {}
+
+ try {
+ if (in != null) {
+ in.close();
+ }
+ } catch (Exception ignored) {}
+ try {
+ if (out != null) {
+ out.close();
+ }
+ } catch (Exception ignored) {}
+
+ try {
+ if (socket != null) {
+ socket.close();
+ }
+ } catch (Exception ignored) {}
+
+ in = null;
+ out = null;
+ socket = null;
+ }
+}
\ No newline at end of file