Initial RS-ServerAdmnin commit

This commit is contained in:
BigPappa committed 2026-06-11 13:58:08 -05:00
commit 3cf919c460
22 files changed
+1843

No files matched your search

+47
View File
@@ -0,0 +1,47 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
.kotlin
.idea/
*.iml
out/
dependency-reduced-pom.xml
logs/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
+94
View File
@@ -0,0 +1,94 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rsscripting</groupId>
<artifactId>RS-ServerAdmin</artifactId>
<name>RS-ServerAdmin</name>
<version>1.0.0</version>
<properties>
<java.version>21</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.50.3.0</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,137 @@
package com.rsscripting.serveradmin;
import com.rsscripting.serveradmin.database.DatabaseManager;
import com.rsscripting.serveradmin.database.SettingsDAO;
import com.rsscripting.serveradmin.commands.RSAdminCommand;
import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO;
import com.rsscripting.serveradmin.listeners.CreeperListener;
import com.rsscripting.serveradmin.security.SecurityManager;
import com.rsscripting.serveradmin.listeners.InventoryListener;
import com.rsscripting.serveradmin.listeners.CreeperEntityDamageListener;
import com.rsscripting.serveradmin.update.GitHubUpdateChecker;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.Bukkit;
import org.bukkit.World;
import java.util.logging.Level;
public class RSServerAdmin extends JavaPlugin {
private static RSServerAdmin instance;
private KeepInventoryDAO keepInventoryDAO;
private DatabaseManager databaseManager;
private SettingsDAO settingsDAO;
private SecurityManager securityManager;
@Override
public void onEnable() {
instance = this;
saveDefaultConfig();
databaseManager = new DatabaseManager(this);
try {
databaseManager.connect();
settingsDAO = new SettingsDAO(databaseManager);
settingsDAO.initializeDefaults();
keepInventoryDAO = new KeepInventoryDAO(databaseManager);
securityManager = new SecurityManager(this);
boolean keepInventoryDefault =
settingsDAO.getDefault(
SettingKey.KEEP_INVENTORY_NEW_WORLD
);
for (World world : Bukkit.getWorlds()) {
keepInventoryDAO.ensureWorldExists(
world.getName(),
keepInventoryDefault
);
}
if (getCommand("rsadmin") != null) {
getCommand("rsadmin").setExecutor(
new RSAdminCommand(this)
);
} else {
getLogger().severe(
"Command 'rsadmin' not found in plugin.yml!"
);
}
getServer().getPluginManager().registerEvents(
new InventoryListener(),
this
);
getServer().getPluginManager().registerEvents(
new CreeperListener(),
this
);
getServer().getPluginManager().registerEvents(
new CreeperEntityDamageListener(),
this
);
} catch (Exception ex) {
getLogger().log(
Level.SEVERE,
"Failed to initialize database.",
ex
);
getServer().getPluginManager().disablePlugin(this);
return;
}
new GitHubUpdateChecker(
this
).checkForUpdates();
getLogger().info("RS-ServerAdmin enabled.");
}
@Override
public void onDisable() {
if (databaseManager != null) {
databaseManager.disconnect();
}
getLogger().info("RS-ServerAdmin disabled.");
}
public KeepInventoryDAO getKeepInventoryDAO() {return keepInventoryDAO;}
public static RSServerAdmin getInstance() {
return instance;
}
public DatabaseManager getDatabaseManager() {
return databaseManager;
}
public SettingsDAO getSettingsDAO() {
return settingsDAO;
}
public SecurityManager getSecurityManager() {
return securityManager;
}
}
@@ -0,0 +1,50 @@
package com.rsscripting.serveradmin.commands;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.security.UserRole;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class RSAdminCommand implements CommandExecutor {
private final RSServerAdmin plugin;
public RSAdminCommand(RSServerAdmin plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(
CommandSender sender,
Command command,
String label,
String[] args
) {
if (!(sender instanceof Player player)) {
sender.sendMessage("Players only.");
return true;
}
UserRole role =
plugin.getSecurityManager().getRole(
player.getUniqueId()
);
if (role == UserRole.NONE) {
player.sendMessage("§cYou do not have access.");
return true;
}
player.openInventory(
com.rsscripting.serveradmin.gui.MainMenu.create()
);
return true;
}
}
@@ -0,0 +1,97 @@
package com.rsscripting.serveradmin.database;
import com.rsscripting.serveradmin.RSServerAdmin;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DatabaseManager {
private final RSServerAdmin plugin;
private Connection connection;
public DatabaseManager(RSServerAdmin plugin) {
this.plugin = plugin;
}
public void connect() throws SQLException {
File dataFolder = plugin.getDataFolder();
if (!dataFolder.exists()) {
dataFolder.mkdirs();
}
File databaseFile = new File(
dataFolder,
plugin.getConfig().getString(
"database.file",
"serveradmin.db"
)
);
connection = DriverManager.getConnection(
"jdbc:sqlite:" + databaseFile.getAbsolutePath()
);
createTables();
}
private void createTables() throws SQLException {
try (Statement statement = connection.createStatement()) {
statement.execute("""
CREATE TABLE IF NOT EXISTS settings (
world_name TEXT NOT NULL,
setting_key TEXT NOT NULL,
value INTEGER NOT NULL,
PRIMARY KEY(world_name, setting_key)
)
""");
statement.execute("""
CREATE TABLE IF NOT EXISTS worlds (
world_name TEXT PRIMARY KEY
)
""");
statement.execute("""
CREATE TABLE IF NOT EXISTS defaults (
setting_key TEXT PRIMARY KEY,
value INTEGER NOT NULL
)
""");
statement.execute(
"""
CREATE TABLE IF NOT EXISTS keep_inventory
(
world_name TEXT PRIMARY KEY,
enabled INTEGER NOT NULL
)
"""
);
}
}
public Connection getConnection() {
return connection;
}
public void disconnect() {
if (connection == null) {
return;
}
try {
connection.close();
} catch (SQLException ignored) {
}
}
}
@@ -0,0 +1,134 @@
package com.rsscripting.serveradmin.database;
import com.rsscripting.serveradmin.settings.SettingKey;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SettingsDAO {
private final DatabaseManager databaseManager;
public SettingsDAO(DatabaseManager databaseManager) {
this.databaseManager = databaseManager;
}
public void initializeDefaults() throws SQLException {
for (SettingKey key : SettingKey.values()) {
if (!defaultExists(key)) {
boolean value = getDefaultValue(key);
setDefault(key, value);
}
}
}
private boolean defaultExists(SettingKey key) throws SQLException {
Connection connection = databaseManager.getConnection();
try (PreparedStatement statement = connection.prepareStatement(
"SELECT setting_key FROM defaults WHERE setting_key = ?")) {
statement.setString(1, key.name());
try (ResultSet rs = statement.executeQuery()) {
return rs.next();
}
}
}
private boolean getDefaultValue(SettingKey key) {
return switch (key) {
case KEEP_INVENTORY -> true;
case CREEPER_BLOCK_DAMAGE,
CREEPER_ENTITY_DAMAGE -> false;
case KEEP_INVENTORY_NEW_WORLD -> false;
};
}
public void setDefault(
SettingKey key,
boolean value
) throws SQLException {
Connection connection = databaseManager.getConnection();
try (PreparedStatement statement = connection.prepareStatement(
"""
INSERT OR REPLACE INTO defaults
(setting_key, value)
VALUES (?, ?)
"""
)) {
statement.setString(1, key.name());
statement.setInt(2, value ? 1 : 0);
statement.executeUpdate();
}
}
public boolean getDefault(
SettingKey key
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT value
FROM defaults
WHERE setting_key = ?
"""
)) {
statement.setString(
1,
key.name()
);
try (ResultSet rs =
statement.executeQuery()) {
if (rs.next()) {
return rs.getInt("value") == 1;
}
}
}
return false;
}
public void toggleDefault(
SettingKey key
) throws SQLException {
boolean current =
getDefault(key);
setDefault(
key,
!current
);
}
}
@@ -0,0 +1,171 @@
package com.rsscripting.serveradmin.gui;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class CreeperMenu {
public static Inventory create() {
RSMenuHolder holder =
new RSMenuHolder("creeper");
Inventory inventory =
Bukkit.createInventory(
holder,
27,
"Creeper Settings"
);
try {
try {
boolean disableBlockDamage =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
);
ItemStack blockDamage =
new ItemStack(Material.TNT);
ItemMeta blockMeta =
blockDamage.getItemMeta();
if (blockMeta != null) {
blockMeta.setDisplayName(
"§aBlock Damage"
);
blockMeta.setLore(
java.util.List.of(
"§7Disable Creeper damage to blocks",
"",
disableBlockDamage
? "§aCurrent: Explosion will not damage blocks"
: "§cCurrent: Explosion will damage blocks"
)
);
blockDamage.setItemMeta(
blockMeta
);
}
if (disableBlockDamage) {
GUIUtils.addGlow(
blockDamage
);
}
inventory.setItem(
11,
blockDamage
);
boolean disableEntityDamage =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
);
ItemStack entityDamage =
new ItemStack(
Material.TOTEM_OF_UNDYING
);
ItemMeta entityMeta =
entityDamage.getItemMeta();
if (entityMeta != null) {
entityMeta.setDisplayName(
"§aEntity Damage"
);
entityMeta.setLore(
java.util.List.of(
"§7Disable Creeper damage to players and mobs",
"",
disableEntityDamage
? "§aCurrent: Explosion will not damage entities"
: "§cCurrent: Explosion will damage entities"
)
);
entityDamage.setItemMeta(
entityMeta
);
}
if (disableEntityDamage) {
GUIUtils.addGlow(
entityDamage
);
}
inventory.setItem(
15,
entityDamage
);
} catch (Exception ex) {
ex.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
ItemStack back =
new ItemStack(Material.ARROW);
ItemMeta backMeta =
back.getItemMeta();
if (backMeta != null) {
backMeta.setDisplayName(
"§cBack"
);
back.setItemMeta(
backMeta
);
}
inventory.setItem(
22,
back
);
GUIUtils.fillEmptySlots(
inventory
);
return inventory;
}
}
@@ -0,0 +1,66 @@
package com.rsscripting.serveradmin.gui;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
public class GUIUtils {
private GUIUtils() {
}
public static ItemStack createFiller() {
ItemStack item =
new ItemStack(Material.LIGHT_BLUE_STAINED_GLASS_PANE);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName(" ");
item.setItemMeta(meta);
}
return item;
}
public static void fillEmptySlots(Inventory inventory) {
ItemStack filler = createFiller();
for (int slot = 0; slot < inventory.getSize(); slot++) {
if (inventory.getItem(slot) == null) {
inventory.setItem(slot, filler);
}
}
}
public static void addGlow(ItemStack item) {
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return;
}
meta.addEnchant(
Enchantment.UNBREAKING,
1,
true
);
meta.addItemFlags(
ItemFlag.HIDE_ENCHANTS
);
item.setItemMeta(meta);
}
}
@@ -0,0 +1,227 @@
package com.rsscripting.serveradmin.gui;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.keepinventory.KeepInventoryDAO;
import com.rsscripting.serveradmin.gui.RSMenuHolder;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.sql.SQLException;
import java.util.List;
public class KeepInventoryMenu {
private static final int WORLDS_PER_PAGE = 45;
public static Inventory create(
int page
) throws SQLException {
RSMenuHolder holder =
new RSMenuHolder(
"KEEP_INVENTORY"
);
holder.setPage(
page
);
Inventory inventory =
Bukkit.createInventory(
holder,
54,
"Keep Inventory"
);
GUIUtils.fillEmptySlots(
inventory
);
createBackButton(
inventory
);
createDefaultButton(
inventory
);
populateWorlds(
inventory,
page
);
return inventory;
}
private static void createBackButton(
Inventory inventory
) {
ItemStack item =
new ItemStack(
Material.ARROW
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§cBack"
);
item.setItemMeta(
meta
);
}
inventory.setItem(
0,
item
);
}
private static void createDefaultButton(
Inventory inventory
) throws SQLException {
boolean enabled =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.KEEP_INVENTORY_NEW_WORLD
);
ItemStack item =
new ItemStack(
Material.CHEST
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§eDefault For New Worlds"
);
meta.setLore(
List.of(
"§7Controls newly detected worlds",
"",
enabled
? "§aCurrent: New worlds keep inventory"
: "§cCurrent: New worlds drop inventory"
)
);
item.setItemMeta(
meta
);
}
if (enabled) {
GUIUtils.addGlow(
item
);
}
inventory.setItem(
4,
item
);
}
private static void populateWorlds(
Inventory inventory,
int page
) throws SQLException {
KeepInventoryDAO dao =
RSServerAdmin.getInstance()
.getKeepInventoryDAO();
List<String> worlds =
dao.getAllWorlds();
int start =
page * WORLDS_PER_PAGE;
int slot =
9;
for (int i = start;
i < worlds.size() && slot < 54;
i++) {
String worldName =
worlds.get(i);
boolean enabled =
dao.getWorldSetting(
worldName
);
ItemStack item =
new ItemStack(
Material.CHEST
);
ItemMeta meta =
item.getItemMeta();
if (meta != null) {
meta.setDisplayName(
"§e" + worldName
);
meta.setLore(
List.of(
"§7Keep Inventory",
"",
enabled
? "§aCurrent: Players keep inventory on death"
: "§cCurrent: Players drop inventory on death"
)
);
item.setItemMeta(
meta
);
}
if (enabled) {
GUIUtils.addGlow(
item
);
}
inventory.setItem(
slot,
item
);
slot++;
}
}
}
@@ -0,0 +1,57 @@
package com.rsscripting.serveradmin.gui;
import com.rsscripting.serveradmin.gui.GUIUtils;
import com.rsscripting.serveradmin.gui.RSMenuHolder;
import com.rsscripting.serveradmin.gui.KeepInventoryMenu;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class MainMenu {
public static Inventory create() {
RSMenuHolder holder =
new RSMenuHolder("main");
Inventory inventory =
Bukkit.createInventory(
holder,
27,
"Main Menu"
);
ItemStack creeper = new ItemStack(Material.CREEPER_HEAD);
ItemMeta creeperMeta = creeper.getItemMeta();
if (creeperMeta != null) {
creeperMeta.setDisplayName("§aCreepers");
creeper.setItemMeta(creeperMeta);
}
inventory.setItem(11, creeper);
ItemStack keepInventory =
new ItemStack(Material.CHEST);
ItemMeta keepMeta =
keepInventory.getItemMeta();
if (keepMeta != null) {
keepMeta.setDisplayName("§aKeep Inventory");
keepInventory.setItemMeta(keepMeta);
}
inventory.setItem(15, keepInventory);
GUIUtils.fillEmptySlots(inventory);
return inventory;
}
}
@@ -0,0 +1,57 @@
package com.rsscripting.serveradmin.gui;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.jetbrains.annotations.NotNull;
public class RSMenuHolder
implements InventoryHolder {
private final String menuId;
private int page = 1;
public RSMenuHolder(
String menuId
) {
this.menuId = menuId;
}
public String getMenuId() {
return menuId;
}
public int getPage() {
return page;
}
public void setPage(
int page
) {
if (page < 1) {
page = 1;
}
this.page = page;
}
@Override
public @NotNull Inventory getInventory() {
throw new UnsupportedOperationException(
"RSMenuHolder does not store an inventory."
);
}
}
@@ -0,0 +1,179 @@
package com.rsscripting.serveradmin.keepinventory;
import com.rsscripting.serveradmin.database.DatabaseManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class KeepInventoryDAO {
private final DatabaseManager databaseManager;
public KeepInventoryDAO(
DatabaseManager databaseManager
) {
this.databaseManager = databaseManager;
}
public boolean getWorldSetting(
String worldName
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT enabled
FROM keep_inventory
WHERE world_name = ?
"""
)) {
statement.setString(
1,
worldName
);
try (ResultSet rs =
statement.executeQuery()) {
if (rs.next()) {
return rs.getInt(
"enabled"
) == 1;
}
}
}
return false;
}
public void setWorldSetting(
String worldName,
boolean enabled
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
INSERT OR REPLACE INTO keep_inventory
(
world_name,
enabled
)
VALUES
(
?,
?
)
"""
)) {
statement.setString(
1,
worldName
);
statement.setInt(
2,
enabled ? 1 : 0
);
statement.executeUpdate();
}
}
public void ensureWorldExists(
String worldName,
boolean defaultValue
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
INSERT OR IGNORE INTO keep_inventory
(
world_name,
enabled
)
VALUES
(
?,
?
)
"""
)) {
statement.setString(
1,
worldName
);
statement.setInt(
2,
defaultValue ? 1 : 0
);
statement.executeUpdate();
}
}
public java.util.List<String> getAllWorlds()
throws SQLException {
java.util.List<String> worlds =
new java.util.ArrayList<>();
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT world_name
FROM keep_inventory
ORDER BY world_name
"""
);
ResultSet rs =
statement.executeQuery()) {
while (rs.next()) {
worlds.add(
rs.getString(
"world_name"
)
);
}
}
return worlds;
}
}
@@ -0,0 +1,44 @@
package com.rsscripting.serveradmin.listeners;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.entity.Creeper;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
public class CreeperEntityDamageListener implements Listener {
@EventHandler
public void onEntityDamage(
EntityDamageByEntityEvent event
) {
if (!(event.getDamager() instanceof Creeper)) {
return;
}
try {
boolean disableEntityDamage =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
);
if (!disableEntityDamage) {
return;
}
event.setCancelled(true);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@@ -0,0 +1,45 @@
package com.rsscripting.serveradmin.listeners;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.entity.Creeper;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent;
public class CreeperListener implements Listener {
@EventHandler
public void onEntityExplode(
EntityExplodeEvent event
) {
if (!(event.getEntity() instanceof Creeper)) {
return;
}
try {
boolean disableBlockDamage =
RSServerAdmin.getInstance()
.getSettingsDAO()
.getDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
);
if (!disableBlockDamage) {
return;
}
event.blockList().clear();
event.setYield(0F);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@@ -0,0 +1,133 @@
package com.rsscripting.serveradmin.listeners;
import com.rsscripting.serveradmin.gui.KeepInventoryMenu;
import com.rsscripting.serveradmin.gui.RSMenuHolder;
import com.rsscripting.serveradmin.gui.CreeperMenu;
import com.rsscripting.serveradmin.RSServerAdmin;
import com.rsscripting.serveradmin.settings.SettingKey;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
public class InventoryListener implements Listener {
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (!(event.getInventory().getHolder() instanceof RSMenuHolder holder)) {
return;
}
if (event.getClickedInventory() == null) {
return;
}
if (event.getClickedInventory() != event.getView().getTopInventory()) {
return;
}
event.setCancelled(true);
switch (holder.getMenuId()) {
case "main" -> {
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
switch (event.getSlot()) {
case 11 -> player.openInventory(
CreeperMenu.create()
);
case 15 -> {
try {
player.openInventory(
KeepInventoryMenu.create(
1
)
);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
case "creeper" -> {
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
switch (event.getSlot()) {
case 11 -> {
try {
RSServerAdmin.getInstance()
.getSettingsDAO()
.toggleDefault(
SettingKey.CREEPER_BLOCK_DAMAGE
);
} catch (Exception ex) {
ex.printStackTrace();
}
player.openInventory(
CreeperMenu.create()
);
}
case 15 -> {
try {
RSServerAdmin.getInstance()
.getSettingsDAO()
.toggleDefault(
SettingKey.CREEPER_ENTITY_DAMAGE
);
} catch (Exception ex) {
ex.printStackTrace();
}
player.openInventory(
CreeperMenu.create()
);
}
case 22 -> player.openInventory(
com.rsscripting.serveradmin.gui.MainMenu.create()
);
}
}
}
}
}
@@ -0,0 +1,51 @@
package com.rsscripting.serveradmin.security;
import com.rsscripting.serveradmin.RSServerAdmin;
import java.util.List;
import java.util.UUID;
public class SecurityManager {
private final RSServerAdmin plugin;
public SecurityManager(RSServerAdmin plugin) {
this.plugin = plugin;
}
public UserRole getRole(UUID uuid) {
String uuidString = uuid.toString();
List<String> owners =
plugin.getConfig().getStringList("security.owners");
if (owners.contains(uuidString)) {
return UserRole.OWNER;
}
List<String> admins =
plugin.getConfig().getStringList("security.admins");
if (admins.contains(uuidString)) {
return UserRole.ADMIN;
}
return UserRole.NONE;
}
public boolean canAccess(UUID uuid) {
return getRole(uuid) != UserRole.NONE;
}
public boolean isOwner(UUID uuid) {
return getRole(uuid) == UserRole.OWNER;
}
public boolean isAdmin(UUID uuid) {
UserRole role = getRole(uuid);
return role == UserRole.ADMIN
|| role == UserRole.OWNER;
}
}
@@ -0,0 +1,9 @@
package com.rsscripting.serveradmin.security;
public enum UserRole {
OWNER,
ADMIN,
NONE
}
@@ -0,0 +1,10 @@
package com.rsscripting.serveradmin.settings;
public enum SettingKey {
CREEPER_BLOCK_DAMAGE,
CREEPER_ENTITY_DAMAGE,
KEEP_INVENTORY_NEW_WORLD,
KEEP_INVENTORY
}
@@ -0,0 +1,123 @@
package com.rsscripting.serveradmin.update;
import org.bukkit.plugin.java.JavaPlugin;
import javax.xml.parsers.DocumentBuilderFactory;
import java.net.URL;
public class GitHubUpdateChecker {
private final JavaPlugin plugin;
private final String pomUrl;
private static final String POM_URL =
"https://raw.githubusercontent.com/RS-Scripting/RS-ServerAdmin/main/pom.xml";
public GitHubUpdateChecker(
JavaPlugin plugin
) {
this.plugin = plugin;
this.pomUrl = POM_URL;
}
public void checkForUpdates() {
plugin.getServer()
.getScheduler()
.runTaskAsynchronously(
plugin,
() -> {
try {
String currentVersion =
plugin.getDescription()
.getVersion();
String latestVersion =
getLatestVersion();
if (latestVersion == null) {
plugin.getLogger().warning(
"Unable to determine latest version."
);
return;
}
if (currentVersion.equals(
latestVersion
)) {
plugin.getLogger().info(
"Running latest version ("
+ currentVersion
+ ")."
);
} else {
plugin.getLogger().warning(
"Update available! Current: "
+ currentVersion
+ " Latest: "
+ latestVersion
);
}
} catch (Exception ex) {
plugin.getLogger().warning(
"Update check failed."
);
}
}
);
}
private String getLatestVersion()
throws Exception {
URL url =
new URL(
POM_URL
);
var document =
DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(
url.openStream()
);
var versions =
document.getElementsByTagName(
"version"
);
if (versions.getLength() == 0) {
return null;
}
return versions
.item(0)
.getTextContent()
.trim();
}
}
@@ -0,0 +1,93 @@
package com.rsscripting.serveradmin.worlds;
import com.rsscripting.serveradmin.database.DatabaseManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class WorldsDAO {
private final DatabaseManager databaseManager;
public WorldsDAO(
DatabaseManager databaseManager
) {
this.databaseManager = databaseManager;
}
public void ensureWorldExists(
String worldName
) throws SQLException {
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
INSERT OR IGNORE INTO worlds
(
world_name
)
VALUES
(
?
)
"""
)) {
statement.setString(
1,
worldName
);
statement.executeUpdate();
}
}
public List<String> getAllWorlds()
throws SQLException {
List<String> worlds =
new ArrayList<>();
Connection connection =
databaseManager.getConnection();
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT world_name
FROM worlds
ORDER BY world_name
"""
);
ResultSet rs =
statement.executeQuery()) {
while (rs.next()) {
worlds.add(
rs.getString(
"world_name"
)
);
}
}
return worlds;
}
}
+7
View File
@@ -0,0 +1,7 @@
security:
owners:
- [Owner UUID]
admins: []
+12
View File
@@ -0,0 +1,12 @@
name: RS-ServerAdmin
version: ${project.version}
main: com.rsscripting.serveradmin.RSServerAdmin
api-version: '1.21'
author: Big Pappa
contributors:
- Atlas
commands:
rsadmin:
description: Open RS-ServerAdmin