Upload files to "src/main/java/com/wulliestudio/icon"
This commit is contained in:
46
src/main/java/com/wulliestudio/icon/IconManager.java
Normal file
46
src/main/java/com/wulliestudio/icon/IconManager.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package com.wulliestudio.icon;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class IconManager{
|
||||||
|
|
||||||
|
private final PluginMain plugin;
|
||||||
|
private final List<File> icons = new ArrayList<>();
|
||||||
|
private final Random random = new Random();
|
||||||
|
|
||||||
|
// init function
|
||||||
|
public IconManager(PluginMain plugin){
|
||||||
|
this.plugin = plugin;
|
||||||
|
loadIcons();
|
||||||
|
}
|
||||||
|
|
||||||
|
// loads the icons
|
||||||
|
private void loadIcons(){
|
||||||
|
File folder = new File(plugin.getDataFolder(), "images");
|
||||||
|
|
||||||
|
// checks to see if icon location exists
|
||||||
|
if(!folder.exists()){
|
||||||
|
folder.mkdirs();
|
||||||
|
}
|
||||||
|
File[] files = folder.listFiles((dir, name) -> name.toLowerCase().endsWith(".png"));
|
||||||
|
|
||||||
|
if(files != null){
|
||||||
|
for (File f : files) icons.add(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// gets random icon
|
||||||
|
public File getRandomIcon(){
|
||||||
|
if(icons.isEmpty()) return null;
|
||||||
|
return icons.get(random.nextInt(icons.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// gets the count of icons
|
||||||
|
public int getIconCount(){
|
||||||
|
return icons.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
113
src/main/java/com/wulliestudio/icon/MotdManager.java
Normal file
113
src/main/java/com/wulliestudio/icon/MotdManager.java
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
package com.wulliestudio.icon;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MotdManager
|
||||||
|
*
|
||||||
|
* Loads motd.yml -> key "motd" (List<String>).
|
||||||
|
* Expected input format in motd.yml: "<red><bold>'your message'"
|
||||||
|
* The manager will:
|
||||||
|
* - extract the inner quoted text if present
|
||||||
|
* - parse MiniMessage tags (<red>, <bold>, etc.)
|
||||||
|
* - convert to legacy text (section codes) which the server MOTD accepts
|
||||||
|
*/
|
||||||
|
public class MotdManager {
|
||||||
|
|
||||||
|
private final PluginMain plugin;
|
||||||
|
private final List<String> motds = new ArrayList<>(); // stores converted (legacy) strings
|
||||||
|
private final MiniMessage mini = MiniMessage.miniMessage();
|
||||||
|
|
||||||
|
private final Random random = new Random();
|
||||||
|
|
||||||
|
public MotdManager(PluginMain plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
loadMotdFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMotdFile() {
|
||||||
|
File file = new File(plugin.getDataFolder(), "motd.yml");
|
||||||
|
|
||||||
|
if (!file.exists()) {
|
||||||
|
plugin.saveResource("motd.yml", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
FileConfiguration cfg = YamlConfiguration.loadConfiguration(file);
|
||||||
|
List<String> raw = cfg.getStringList("motd");
|
||||||
|
|
||||||
|
motds.clear();
|
||||||
|
for (String entry : raw) {
|
||||||
|
if (entry == null) continue;
|
||||||
|
|
||||||
|
// If the entry contains a single-quoted substring like '<...>',
|
||||||
|
// extract the inner quoted content. Example:
|
||||||
|
// "<red><bold>'this is a test'" -> "<red><bold>this is a test"
|
||||||
|
String processed = extractQuotedOrUseWhole(entry);
|
||||||
|
|
||||||
|
// Parse MiniMessage to Component, then serialize to legacy section format (with § codes)
|
||||||
|
try {
|
||||||
|
Component comp = mini.deserialize(processed);
|
||||||
|
String legacy = LegacyComponentSerializer.legacySection().serialize(comp);
|
||||||
|
motds.add(legacy);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
// Fallback: if parsing fails, store the raw processed string (so something still appears)
|
||||||
|
plugin.getLogger().warning("Failed to parse MOTD entry: " + entry + " — using raw text.");
|
||||||
|
motds.add(processed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (motds.isEmpty()) {
|
||||||
|
// Add a default MOTD (already converted)
|
||||||
|
Component defaultComp = mini.deserialize("<red><bold>'default motd — no entries found'");
|
||||||
|
motds.add(LegacyComponentSerializer.legacySection().serialize(defaultComp));
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.getLogger().info("Loaded " + motds.size() + " MOTD(s).");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the raw string contains an inner single-quoted substring, return that substring
|
||||||
|
* appended to any leading tags. Otherwise return the original string.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
* "<red><bold>'hello world'" -> "<red><bold>hello world"
|
||||||
|
* "<green>noquotes here" -> "<green>noquotes here"
|
||||||
|
*/
|
||||||
|
private String extractQuotedOrUseWhole(String raw) {
|
||||||
|
if (raw == null) return "";
|
||||||
|
|
||||||
|
// find first single quote and last single quote
|
||||||
|
int first = raw.indexOf('\'');
|
||||||
|
int last = raw.lastIndexOf('\'');
|
||||||
|
|
||||||
|
// if there are at least two single quotes and they're not the same position, extract inner
|
||||||
|
if (first != -1 && last != -1 && last > first) {
|
||||||
|
String before = raw.substring(0, first); // tags and any text before the quote
|
||||||
|
String inner = raw.substring(first + 1, last); // text inside quotes
|
||||||
|
return before + inner;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise return the whole string unchanged
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRandomMotd() {
|
||||||
|
if (motds.isEmpty()) return null;
|
||||||
|
return motds.get(random.nextInt(motds.size()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMotdCount() {
|
||||||
|
return motds.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
38
src/main/java/com/wulliestudio/icon/PluginMain.java
Normal file
38
src/main/java/com/wulliestudio/icon/PluginMain.java
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package com.wulliestudio.icon;
|
||||||
|
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
|
||||||
|
// plugin class
|
||||||
|
public class PluginMain extends JavaPlugin{
|
||||||
|
|
||||||
|
private IconManager iconManager;
|
||||||
|
private MotdManager motdManager;
|
||||||
|
|
||||||
|
// handle on enable
|
||||||
|
@Override
|
||||||
|
public void onEnable(){
|
||||||
|
|
||||||
|
iconManager = new IconManager(this);
|
||||||
|
motdManager = new MotdManager(this);
|
||||||
|
|
||||||
|
getServer().getPluginManager().registerEvents(
|
||||||
|
new ServerListPingListener(iconManager, motdManager), this
|
||||||
|
);
|
||||||
|
getLogger().info("dynamic server banners Loaded");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IconManager getIconManager(){
|
||||||
|
return iconManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MotdManager getMotdManager(){
|
||||||
|
return motdManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package com.wulliestudio.icon;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit; // optional - remove if unused
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.server.ServerListPingEvent;
|
||||||
|
import org.bukkit.map.MapView;
|
||||||
|
import org.bukkit.util.CachedServerIcon; // note: some APIs use org.bukkit.craftbukkit... but this should be available via API
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class ServerListPingListener implements Listener {
|
||||||
|
|
||||||
|
private final IconManager iconManager;
|
||||||
|
private final MotdManager motdManager;
|
||||||
|
|
||||||
|
public ServerListPingListener(IconManager iconManager, MotdManager motdManager) {
|
||||||
|
this.iconManager = iconManager;
|
||||||
|
this.motdManager = motdManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPing(ServerListPingEvent event) {
|
||||||
|
|
||||||
|
// MOTD
|
||||||
|
String motd = motdManager.getRandomMotd();
|
||||||
|
if (motd != null) event.setMotd(motd);
|
||||||
|
|
||||||
|
// ICON
|
||||||
|
File img = iconManager.getRandomIcon();
|
||||||
|
if (img != null) {
|
||||||
|
try {
|
||||||
|
// loadServerIcon is on the Server (Bukkit.getServer())
|
||||||
|
org.bukkit.util.CachedServerIcon icon = Bukkit.getServer().loadServerIcon(img);
|
||||||
|
event.setServerIcon(icon);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
// image invalid for server-icon; ignore to avoid spam
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user