diff --git a/README.md b/README.md new file mode 100644 index 0000000..d4f1afa --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# D7 Server Lite +D7ServerUtil in a more stable Version + +Version 1.17.1+ +# Building +```bash +mvn clean package +``` \ No newline at end of file diff --git a/src/main/java/de/npid7/serverlite/Commands/StatusCommand.java b/src/main/java/de/npid7/serverlite/Commands/StatusCommand.java new file mode 100644 index 0000000..f10189a --- /dev/null +++ b/src/main/java/de/npid7/serverlite/Commands/StatusCommand.java @@ -0,0 +1,52 @@ +package de.npid7.serverlite.Commands; + +import de.npid7.serverlite.Configs.PlayerConfig; +import de.npid7.serverlite.D7ServerLite; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class StatusCommand implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String s, String[] strings) { + if (strings.length != 1 && strings.length != 2) { + sender.sendMessage("Verwendung: /status Status"); + return false; + } + String str = ""; + boolean is_def = false; + for (String st : D7ServerLite.getInst().getPluginConfig().getDefaultStatusList()) { + if (strings[0].equals(st)) { + str = strings[0]; + is_def = true; + } + } + if (is_def) { + // Leave empty + } else if (strings[0].equals("custom")) { + if (strings.length != 2) { + sender.sendMessage("Verwendung: /status custom Status"); + return false; + } + if (strings[1].length() > 10) { + sender.sendMessage(ChatColor.RED.toString() + "Maximale länge ist 10 Zeichen!"); + return false; + } + str = strings[1]; + } else { + sender.sendMessage( + ChatColor.RED.toString() + "Was auch immer du versuchst... lass es einfach!"); + return false; + } + if (D7ServerLite.getInst().getPluginConfig().getWordBlacklist().find(str) != null) { + sender.sendMessage(ChatColor.RED.toString() + "Diser Status ist nicht erlaubt!"); + return false; + } + PlayerConfig pcfg = D7ServerLite.getInst().getPlayerConfig(); + pcfg.setStatus(((Player) sender).getUniqueId(), str); + pcfg.Save(); + return false; + } +} diff --git a/src/main/java/de/npid7/serverlite/Configs/PlayerConfig.java b/src/main/java/de/npid7/serverlite/Configs/PlayerConfig.java new file mode 100644 index 0000000..1f5887b --- /dev/null +++ b/src/main/java/de/npid7/serverlite/Configs/PlayerConfig.java @@ -0,0 +1,116 @@ +package de.npid7.serverlite.Configs; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class PlayerConfig { + File file = null; + int cfg_version = 0; + + public static class PlayerEntry { + public String status = ""; + public String name = ""; + public PlayerEntry() {} + public PlayerEntry(String s, String n) { + status = s; + name = n; + } + } + + HashMap player_map = new HashMap<>(); + + public PlayerConfig(String path) { + file = new File(path); + Load(); + } + + public boolean Load() { + if (!file.exists()) { + return false; + } + try { + FileReader r = new FileReader(file); + JsonParser prs = new JsonParser(); + JsonObject js = prs.parse(r).getAsJsonObject(); + r.close(); + int pver = js.get("version").getAsInt(); + if (pver != cfg_version) { + // Use PVER to not create a complete new config + file.delete(); + return false; + } + player_map.clear(); + // Load Data + for (Map.Entry e : js.entrySet()) { + if (e.getKey().equals("version")) { + continue; + } + UUID key = UUID.fromString(e.getKey()); + PlayerEntry pe = new PlayerEntry(); + pe.name = e.getValue().getAsJsonObject().get("name").getAsString(); + pe.status = e.getValue().getAsJsonObject().get("status").getAsString(); + player_map.put(key, pe); + } + } catch (IOException e) { + e.printStackTrace(); + return true; + } + return false; + } + + public boolean Save() { + JsonObject js = new JsonObject(); + js.addProperty("version", cfg_version); + for (Map.Entry e : player_map.entrySet()) { + JsonObject o = new JsonObject(); + o.addProperty("name", e.getValue().name); + o.addProperty("status", e.getValue().status); + js.add(e.getKey().toString(), o); + } + try { + FileWriter w = new FileWriter(file); + Gson g = new GsonBuilder().setPrettyPrinting().create(); + g.toJson(js, w); + w.close(); + } catch (IOException e) { + e.printStackTrace(); + return true; + } + return false; + } + + public PlayerEntry Find(UUID ref) { + if (player_map.containsKey(ref)) { + return player_map.get(ref); + } + return null; + } + + public void Add(UUID k, PlayerEntry e) { + player_map.put(k, e); + } + + public String getStatus(UUID ref) { + return this.player_map.get(ref).status; + } + public void setStatus(UUID ref, String value) { + this.player_map.get(ref).status = value; + } + + public String getName(UUID ref) { + return this.player_map.get(ref).name; + } + public void setName(UUID ref, String value) { + this.player_map.get(ref).name = value; + } +} \ No newline at end of file diff --git a/src/main/java/de/npid7/serverlite/Configs/PluginConfig.java b/src/main/java/de/npid7/serverlite/Configs/PluginConfig.java new file mode 100644 index 0000000..c445c3c --- /dev/null +++ b/src/main/java/de/npid7/serverlite/Configs/PluginConfig.java @@ -0,0 +1,142 @@ +package de.npid7.serverlite.Configs; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import de.npid7.serverlite.Helpers.Wordlist; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; +import org.bukkit.ChatColor; + +public class PluginConfig { + File file = null; + + int cfg_version = 0; + Wordlist wordBlacklist = new Wordlist(); + + String defaultStatus = ""; + // Maybe the name is missleading but i refer to the docs for that + Vector defaultStatusList = new Vector<>(); + HashMap tablistStatusColors = new HashMap<>(); + + public PluginConfig(String path) { + file = new File(path); + Load(); + } + + public boolean Load() { + tablistStatusColors.clear(); + if (!file.exists()) { + CreateNew(0); + return false; + } + try { + FileReader r = new FileReader(file); + JsonParser prs = new JsonParser(); + JsonObject js = prs.parse(r).getAsJsonObject(); + r.close(); + int pver = js.get("version").getAsInt(); + if (pver != cfg_version) { + // Use PVER to not create a complete new config + CreateNew(pver); + return false; + } + wordBlacklist.fromJsonArray(js.get("word_blacklist").getAsJsonArray()); + defaultStatus = js.get("default_status").getAsString(); + JsonArray default_status = js.get("default_status_list").getAsJsonArray(); + defaultStatusList.clear(); + for (JsonElement e : default_status) { + defaultStatusList.add(e.getAsString()); + } + JsonObject color_map = + js.get("tablist").getAsJsonObject().get("status_colors").getAsJsonObject(); + for (Map.Entry e : color_map.entrySet()) { + tablistStatusColors.put(e.getKey(), color_map.get(e.getKey()).getAsString()); + } + } catch (IOException e) { + e.printStackTrace(); + return true; + } + return false; + } + + public boolean Save() { + JsonObject js = new JsonObject(); + js.addProperty("version", cfg_version); + js.add("word_blacklist", wordBlacklist.toJsonArray()); + JsonObject tablist = new JsonObject(); + JsonObject color_table = new JsonObject(); + for (Map.Entry e : tablistStatusColors.entrySet()) { + color_table.addProperty(e.getKey(), e.getValue()); + } + tablist.add("status_colors", color_table); + JsonArray default_status = new JsonArray(); + for (String s : defaultStatusList) { + default_status.add(s); + } + js.addProperty("default_status", defaultStatus); + js.add("default_status_list", default_status); + js.add("tablist", tablist); + try { + FileWriter w = new FileWriter(file); + Gson g = new GsonBuilder().setPrettyPrinting().create(); + g.toJson(js, w); + w.close(); + } catch (IOException e) { + e.printStackTrace(); + return true; + } + return false; + } + + void CreateNew(int prev_ver) { + if (prev_ver < 1) { + wordBlacklist.add("ADMIN"); + wordBlacklist.add("HOST"); + wordBlacklist.add("MOD"); + wordBlacklist.add("TEAM"); + wordBlacklist.add("STAFF"); + defaultStatus = ""; + defaultStatusList.add("Online"); + defaultStatusList.add("AFK"); + defaultStatusList.add("Beschäftigt"); + tablistStatusColors.put("D7", ChatColor.GOLD.toString()); + tablistStatusColors.put("Online", ChatColor.GREEN.toString()); + tablistStatusColors.put("AFK", ChatColor.GOLD.toString()); + tablistStatusColors.put("Beschäftigt", ChatColor.RED.toString()); + } + // Make sure default latest plugin config version is set + cfg_version = 0; + this.Save(); + } + + public Wordlist getWordBlacklist() { + return this.wordBlacklist; + } + + public String getDefaultStatus() { + return this.defaultStatus; + } + public void setDefaultStatus(String value) { + this.defaultStatus = value; + } + + public Vector getDefaultStatusList() { + return this.defaultStatusList; + } + + public String getStatusColor(String s) { + if (tablistStatusColors.containsKey(s)) { + return tablistStatusColors.get(s); + } + return null; + } +} diff --git a/src/main/java/de/npid7/serverlite/D7ServerLite.java b/src/main/java/de/npid7/serverlite/D7ServerLite.java index 87f926f..d48012c 100644 --- a/src/main/java/de/npid7/serverlite/D7ServerLite.java +++ b/src/main/java/de/npid7/serverlite/D7ServerLite.java @@ -1,12 +1,16 @@ package de.npid7.serverlite; -import java.util.logging.Logger; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.java.JavaPlugin; - +import de.npid7.serverlite.Commands.StatusCommand; +import de.npid7.serverlite.Configs.PlayerConfig; +import de.npid7.serverlite.Configs.PluginConfig; import de.npid7.serverlite.Helpers.Spielzeit; +import de.npid7.serverlite.Listeners.JoinListener; +import de.npid7.serverlite.TabCompleters.StatusCompleter; import de.npid7.serverlite.Tasks.TablistTask; +import java.util.logging.Logger; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; /* * d7serverlite java plugin @@ -15,6 +19,8 @@ public class D7ServerLite extends JavaPlugin { private static D7ServerLite inst; private TablistTask tablistUpdater; + private PluginConfig pluginConfig; + private PlayerConfig playerConfig; @Override public void onLoad() { @@ -23,7 +29,16 @@ public class D7ServerLite extends JavaPlugin { @Override public void onEnable() { + if (!getDataFolder().exists()) { + getDataFolder().mkdirs(); + } + pluginConfig = new PluginConfig(getDataFolder() + "/config.json"); + playerConfig = new PlayerConfig(getDataFolder() + "/player_config.json"); tablistUpdater = new TablistTask(); + getCommand("status").setExecutor(new StatusCommand()); + getCommand("status").setTabCompleter(new StatusCompleter()); + + Bukkit.getPluginManager().registerEvents(new JoinListener(), this); } @Override @@ -32,4 +47,12 @@ public class D7ServerLite extends JavaPlugin { public static D7ServerLite getInst() { return inst; } + + public PluginConfig getPluginConfig() { + return this.pluginConfig; + } + + public PlayerConfig getPlayerConfig() { + return this.playerConfig; + } } diff --git a/src/main/java/de/npid7/serverlite/Helpers/Spielzeit.java b/src/main/java/de/npid7/serverlite/Helpers/Spielzeit.java index 26d6384..0bc6272 100644 --- a/src/main/java/de/npid7/serverlite/Helpers/Spielzeit.java +++ b/src/main/java/de/npid7/serverlite/Helpers/Spielzeit.java @@ -19,7 +19,7 @@ public class Spielzeit { } return timers; } - + public static int getHours(int ticks) { int time = ticks / 20; return time / 3600; diff --git a/src/main/java/de/npid7/serverlite/Helpers/Wordlist.java b/src/main/java/de/npid7/serverlite/Helpers/Wordlist.java new file mode 100644 index 0000000..92d87f5 --- /dev/null +++ b/src/main/java/de/npid7/serverlite/Helpers/Wordlist.java @@ -0,0 +1,69 @@ +package de.npid7.serverlite.Helpers; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.util.Map; +import java.util.Vector; + +public class Wordlist { + Vector wordlist = new Vector<>(); + + public Wordlist() {} + + public void fromJsonArray(JsonArray a) { + if (a == null) { + return; + } + for (JsonElement e : a) { + wordlist.add(e.getAsString()); + } + } + + public JsonArray toJsonArray() { + JsonArray a = new JsonArray(); + for (String s : wordlist) { + a.add(s); + } + return a; + } + + public boolean add(String s) { + // wra -> With rights allowed + if (find(s) != null) { + return false; + } + wordlist.add(s); + return true; + } + + public boolean remove(String s) { + String e = find(s); + if (e == null) { + return false; + } + wordlist.remove(e); + return true; + } + + public String find(String word) { + for (String s : wordlist) { + if (s.equalsIgnoreCase(word)) { + return s; + } + } + return null; + } + + public boolean isAllowed(String word) { + String w = find(word); + if (w != null) { + return false; + } + return true; + } + + public Vector getList() { + return wordlist; + } +} diff --git a/src/main/java/de/npid7/serverlite/Listeners/JoinListener.java b/src/main/java/de/npid7/serverlite/Listeners/JoinListener.java new file mode 100644 index 0000000..2199873 --- /dev/null +++ b/src/main/java/de/npid7/serverlite/Listeners/JoinListener.java @@ -0,0 +1,22 @@ +package de.npid7.serverlite.Listeners; + +import de.npid7.serverlite.Configs.PlayerConfig; +import de.npid7.serverlite.D7ServerLite; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class JoinListener implements Listener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + if (D7ServerLite.getInst().getPlayerConfig().Find(player.getUniqueId()) == null) { + D7ServerLite.getInst().getPlayerConfig().Add(player.getUniqueId(), + new PlayerConfig.PlayerEntry( + D7ServerLite.getInst().getPluginConfig().getDefaultStatus(), player.getName())); + D7ServerLite.getInst().getPlayerConfig().Save(); + } + } +} \ No newline at end of file diff --git a/src/main/java/de/npid7/serverlite/TabCompleters/StatusCompleter.java b/src/main/java/de/npid7/serverlite/TabCompleters/StatusCompleter.java new file mode 100644 index 0000000..cf35cbd --- /dev/null +++ b/src/main/java/de/npid7/serverlite/TabCompleters/StatusCompleter.java @@ -0,0 +1,25 @@ +package de.npid7.serverlite.TabCompleters; + +import de.npid7.serverlite.D7ServerLite; +import java.util.ArrayList; +import java.util.List; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; + +public class StatusCompleter implements TabCompleter { + @Override + public List onTabComplete( + CommandSender sender, Command command, String alias, String[] args) { + List completions = new ArrayList<>(); + if (command.getName().equalsIgnoreCase("status")) { + if (args.length == 1) { + for (String s : D7ServerLite.getInst().getPluginConfig().getDefaultStatusList()) { + completions.add(s); + } + completions.add("custom"); + } + } + return completions; + } +} \ No newline at end of file diff --git a/src/main/java/de/npid7/serverlite/Tasks/TablistTask.java b/src/main/java/de/npid7/serverlite/Tasks/TablistTask.java index a7ee813..ceb15f0 100644 --- a/src/main/java/de/npid7/serverlite/Tasks/TablistTask.java +++ b/src/main/java/de/npid7/serverlite/Tasks/TablistTask.java @@ -55,6 +55,22 @@ public class TablistTask { + ChatColor.DARK_GRAY.toString() + ": " + ChatColor.GREEN.toString() + playtime + str + "\n"); pl.setPlayerListFooter("\n"); + String body = ""; + String status = D7ServerLite.getInst().getPlayerConfig().getStatus(pl.getUniqueId()); + if (!status.equals("")) { + body += "["; + String color = D7ServerLite.getInst().getPluginConfig().getStatusColor(status); + if (color == null) { + color = ChatColor.WHITE.toString(); + } + body += color; + body += status; + body += ChatColor.WHITE.toString(); + body += "] "; + } + body += ChatColor.WHITE.toString() + pl.getDisplayName(); + body += " " + ChatColor.RED.toString() + pl.getStatistic(Statistic.DEATHS); + pl.setPlayerListName(body); } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ce57664..ca2c62f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,4 +1,8 @@ name: D7SerevrLite main: de.npid7.serverlite.D7ServerLite version: 1.0 -api-version: 1.17 \ No newline at end of file +api-version: 1.17 + +commands: + status: + description: Play Status Command \ No newline at end of file