Add Status in Tablist
All checks were successful
Build Plugin / build-test (push) Successful in 51s

This commit is contained in:
tobid7 2024-11-23 19:14:39 +01:00
parent c747835eea
commit 682f361ea2
11 changed files with 484 additions and 7 deletions

8
README.md Normal file
View File

@ -0,0 +1,8 @@
# D7 Server Lite
D7ServerUtil in a more stable Version
Version 1.17.1+
# Building
```bash
mvn clean package
```

View File

@ -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;
}
}

View File

@ -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<UUID, PlayerEntry> 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<String, JsonElement> 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<UUID, PlayerEntry> 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;
}
}

View File

@ -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<String> defaultStatusList = new Vector<>();
HashMap<String, String> 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<String, JsonElement> 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<String, String> 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<String> getDefaultStatusList() {
return this.defaultStatusList;
}
public String getStatusColor(String s) {
if (tablistStatusColors.containsKey(s)) {
return tablistStatusColors.get(s);
}
return null;
}
}

View File

@ -1,12 +1,16 @@
package de.npid7.serverlite; package de.npid7.serverlite;
import java.util.logging.Logger; import de.npid7.serverlite.Commands.StatusCommand;
import de.npid7.serverlite.Configs.PlayerConfig;
import org.bukkit.Bukkit; import de.npid7.serverlite.Configs.PluginConfig;
import org.bukkit.plugin.java.JavaPlugin;
import de.npid7.serverlite.Helpers.Spielzeit; 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 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 * d7serverlite java plugin
@ -15,6 +19,8 @@ public class D7ServerLite extends JavaPlugin {
private static D7ServerLite inst; private static D7ServerLite inst;
private TablistTask tablistUpdater; private TablistTask tablistUpdater;
private PluginConfig pluginConfig;
private PlayerConfig playerConfig;
@Override @Override
public void onLoad() { public void onLoad() {
@ -23,7 +29,16 @@ public class D7ServerLite extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
if (!getDataFolder().exists()) {
getDataFolder().mkdirs();
}
pluginConfig = new PluginConfig(getDataFolder() + "/config.json");
playerConfig = new PlayerConfig(getDataFolder() + "/player_config.json");
tablistUpdater = new TablistTask(); tablistUpdater = new TablistTask();
getCommand("status").setExecutor(new StatusCommand());
getCommand("status").setTabCompleter(new StatusCompleter());
Bukkit.getPluginManager().registerEvents(new JoinListener(), this);
} }
@Override @Override
@ -32,4 +47,12 @@ public class D7ServerLite extends JavaPlugin {
public static D7ServerLite getInst() { public static D7ServerLite getInst() {
return inst; return inst;
} }
public PluginConfig getPluginConfig() {
return this.pluginConfig;
}
public PlayerConfig getPlayerConfig() {
return this.playerConfig;
}
} }

View File

@ -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<String> 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<String> getList() {
return wordlist;
}
}

View File

@ -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();
}
}
}

View File

@ -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<String> onTabComplete(
CommandSender sender, Command command, String alias, String[] args) {
List<String> 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;
}
}

View File

@ -55,6 +55,22 @@ public class TablistTask {
+ ChatColor.DARK_GRAY.toString() + ": " + ChatColor.GREEN.toString() + playtime + str + ChatColor.DARK_GRAY.toString() + ": " + ChatColor.GREEN.toString() + playtime + str
+ "\n"); + "\n");
pl.setPlayerListFooter("\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);
} }
} }

View File

@ -2,3 +2,7 @@ name: D7SerevrLite
main: de.npid7.serverlite.D7ServerLite main: de.npid7.serverlite.D7ServerLite
version: 1.0 version: 1.0
api-version: 1.17 api-version: 1.17
commands:
status:
description: Play Status Command