mirror of
https://github.com/arcadiadevs/hubcore.git
synced 2024-11-25 06:45:11 +01:00
HubCore rewrite for PS v3.1
This commit is contained in:
parent
a676c1e400
commit
48801fc1c5
72
dependency-reduced-pom.xml
Normal file
72
dependency-reduced-pom.xml
Normal file
@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>PSHubCore</groupId>
|
||||
<artifactId>PSHubCore</artifactId>
|
||||
<version>v3-dev</version>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>17</source>
|
||||
<target>17</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<finalName>PSHubCore</finalName>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>placeholderapi</id>
|
||||
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.18.2-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.24</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.clip</groupId>
|
||||
<artifactId>placeholderapi</artifactId>
|
||||
<version>2.9.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>6.1.5.Final</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
32
pom.xml
32
pom.xml
@ -10,8 +10,23 @@
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>11</source>
|
||||
<target>11</target>
|
||||
<source>17</source>
|
||||
<target>17</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<finalName>PSHubCore</finalName>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
@ -30,10 +45,6 @@
|
||||
<id>placeholderapi</id>
|
||||
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
@ -61,12 +72,12 @@
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>2.0.1</version>
|
||||
<version>2.0.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<version>2.0.0</version>
|
||||
<version>2.0.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.moandjiezana.toml</groupId>
|
||||
@ -90,6 +101,11 @@
|
||||
<version>2.9.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>6.1.5.Final</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<groupId>PSHubCore</groupId>
|
||||
|
@ -1,106 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore;
|
||||
|
||||
import com.samjakob.spigui.SpiGUI;
|
||||
import lombok.Getter;
|
||||
import lombok.SneakyThrows;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import os.arcadiadevs.playerservers.hubcore.commands.CommandManager;
|
||||
import os.arcadiadevs.playerservers.hubcore.database.DataBase;
|
||||
import os.arcadiadevs.playerservers.hubcore.database.DataSource;
|
||||
import os.arcadiadevs.playerservers.hubcore.events.ClickEvent;
|
||||
import os.arcadiadevs.playerservers.hubcore.events.HubEvents;
|
||||
import os.arcadiadevs.playerservers.hubcore.events.JoinEvent;
|
||||
import os.arcadiadevs.playerservers.hubcore.objects.ServerCache;
|
||||
import os.arcadiadevs.playerservers.hubcore.placeholders.PlayerCount;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class PSHubCore extends JavaPlugin {
|
||||
|
||||
private static PSHubCore PSH;
|
||||
@Getter
|
||||
private static DataBase dataBase;
|
||||
@Getter
|
||||
public YamlConfiguration multinode;
|
||||
@Getter
|
||||
private SpiGUI spiGUI;
|
||||
|
||||
@Getter
|
||||
public ServerCache serverCache;
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public void onEnable() {
|
||||
PSH = this;
|
||||
getConfig().options().copyDefaults(true);
|
||||
saveConfig();
|
||||
createMultiNodeConfig();
|
||||
|
||||
DataSource ds = new DataSource();
|
||||
ds.registerDataSource();
|
||||
|
||||
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
||||
/*
|
||||
* We register the EventListeneres here, when PlaceholderAPI is installed.
|
||||
* Since all events are in the main class (this class), we simply use "this"
|
||||
*/
|
||||
new PlayerCount(this).register();
|
||||
}
|
||||
|
||||
Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
|
||||
Bukkit.getPluginManager().registerEvents(new ClickEvent(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new JoinEvent(), this);
|
||||
Bukkit.getPluginManager().registerEvents(new HubEvents(), this);
|
||||
|
||||
Objects.requireNonNull(getCommand("servers")).setExecutor(new CommandManager());
|
||||
|
||||
// Initialize SpiGUI
|
||||
spiGUI = new SpiGUI(this);
|
||||
|
||||
// Initialize ServerCache
|
||||
serverCache = new ServerCache();
|
||||
|
||||
// Create ServerCache refreshing task
|
||||
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
|
||||
executor.scheduleAtFixedRate(serverCache, 1, getConfig().getInt("cache-time"), TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
private void createMultiNodeConfig() throws IOException {
|
||||
|
||||
if (!getConfig().getBoolean("multi-node")) {
|
||||
return;
|
||||
}
|
||||
|
||||
File configFile = new File(this.getDataFolder(), "multinode.yml");
|
||||
|
||||
if (!configFile.exists()) {
|
||||
InputStream inputStream = getClass().getResourceAsStream("/multinode.yml");
|
||||
OutputStream outputStream = new FileOutputStream(configFile);
|
||||
int read;
|
||||
byte[] bytes = new byte[1024];
|
||||
while ((read = inputStream.read(bytes)) != -1) {
|
||||
outputStream.write(bytes, 0, read);
|
||||
}
|
||||
inputStream.close();
|
||||
outputStream.close();
|
||||
}
|
||||
|
||||
multinode = YamlConfiguration.loadConfiguration(configFile);
|
||||
}
|
||||
|
||||
public static PSHubCore getInstance() {
|
||||
return PSH;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
super.onDisable();
|
||||
getServer().getMessenger().unregisterIncomingPluginChannel(this, "BungeeCord");
|
||||
}
|
||||
}
|
@ -0,0 +1,122 @@
|
||||
package os.arcadiadevs.playerservers.hubcore;
|
||||
|
||||
import com.samjakob.spigui.SpiGUI;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
import lombok.Getter;
|
||||
import lombok.SneakyThrows;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.hibernate.SessionFactory;
|
||||
import os.arcadiadevs.playerservers.hubcore.commands.CommandManager;
|
||||
import os.arcadiadevs.playerservers.hubcore.controllers.NodesController;
|
||||
import os.arcadiadevs.playerservers.hubcore.controllers.ServersController;
|
||||
import os.arcadiadevs.playerservers.hubcore.events.ClickEvent;
|
||||
import os.arcadiadevs.playerservers.hubcore.events.HubEvents;
|
||||
import os.arcadiadevs.playerservers.hubcore.events.JoinEvent;
|
||||
import os.arcadiadevs.playerservers.hubcore.models.Node;
|
||||
import os.arcadiadevs.playerservers.hubcore.models.Server;
|
||||
import os.arcadiadevs.playerservers.hubcore.placeholders.PlayerCount;
|
||||
|
||||
public class PsHubCore extends JavaPlugin {
|
||||
|
||||
@Getter
|
||||
private static PsHubCore instance;
|
||||
|
||||
@Getter
|
||||
private SpiGUI spiGui;
|
||||
|
||||
@Getter
|
||||
private SessionFactory sessionFactory;
|
||||
|
||||
@Getter
|
||||
private ServersController serversController;
|
||||
|
||||
@Getter
|
||||
private NodesController nodesController;
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
getConfig().options().copyDefaults(true);
|
||||
saveConfig();
|
||||
|
||||
extractFile("hibernate.cfg.xml");
|
||||
|
||||
sessionFactory =
|
||||
new org.hibernate.cfg.Configuration()
|
||||
.configure(new File(this.getDataFolder().getAbsolutePath() + "/" + "hibernate.cfg.xml"))
|
||||
.addAnnotatedClass(Server.class)
|
||||
.addAnnotatedClass(Node.class)
|
||||
.buildSessionFactory();
|
||||
|
||||
// Initialize the controllers
|
||||
serversController = new ServersController(sessionFactory);
|
||||
nodesController = new NodesController(sessionFactory);
|
||||
|
||||
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
||||
/*
|
||||
* We register the EventListeneres here, when PlaceholderAPI is installed.
|
||||
* Since all events are in the main class (this class), we simply use "this"
|
||||
*/
|
||||
new PlayerCount(serversController).register();
|
||||
}
|
||||
|
||||
Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
|
||||
Bukkit.getPluginManager().registerEvents(new ClickEvent(this), this);
|
||||
Bukkit.getPluginManager().registerEvents(new JoinEvent(this), this);
|
||||
Bukkit.getPluginManager().registerEvents(new HubEvents(getConfig()), this);
|
||||
|
||||
Objects.requireNonNull(getCommand("servers")).setExecutor(new CommandManager());
|
||||
|
||||
// Initialize SpiGUI
|
||||
spiGui = new SpiGUI(this);
|
||||
|
||||
// Initialize ServerCache
|
||||
//serverCache = new ServerCache();
|
||||
|
||||
// Create ServerCache refreshing task
|
||||
//ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
|
||||
//executor.scheduleAtFixedRate(serverCache, 1, getConfig().getInt("cache-time"), TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts a file from the jar to the data folder.
|
||||
*
|
||||
* @param name The name of the file.
|
||||
* @return The file
|
||||
* @throws IOException If the file cannot be extracted.
|
||||
*/
|
||||
private File extractFile(String name) throws IOException {
|
||||
var configFile = new File(this.getDataFolder(), name);
|
||||
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
getDataFolder().mkdirs();
|
||||
if (configFile.createNewFile()) {
|
||||
try (
|
||||
var fis = getClass().getResourceAsStream("/" + name);
|
||||
var fos = new FileOutputStream(configFile)
|
||||
) {
|
||||
var buf = new byte[1024];
|
||||
int i;
|
||||
while ((i = Objects.requireNonNull(fis).read(buf)) != -1) {
|
||||
fos.write(buf, 0, i);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Bukkit.getLogger()
|
||||
.warning(String.format("Error extracting %s: %s", name, e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
return configFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
super.onDisable();
|
||||
getServer().getMessenger().unregisterIncomingPluginChannel(this, "BungeeCord");
|
||||
}
|
||||
}
|
@ -4,27 +4,33 @@ import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.PsHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.guis.SelectorGui;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.ChatUtil;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.GUIUtils;
|
||||
import os.arcadiadevs.playerservers.hubcore.guis.PlayerMenuGui;
|
||||
|
||||
public class CommandManager implements CommandExecutor {
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@Override
|
||||
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) {
|
||||
if (commandSender instanceof Player) {
|
||||
if (!PSHubCore.getInstance().getConfig().getBoolean("gui.selector.item.enabled")) {
|
||||
commandSender.sendMessage(ChatUtil.translate("&9PlayerServers> &7Oops, gui isn't enabled in config file!"));
|
||||
return true;
|
||||
}
|
||||
if (PSHubCore.getInstance().getConfig().getBoolean("gui.selector.item.enabled")) {
|
||||
if (command.getName().equalsIgnoreCase("servers") || command.getName().equalsIgnoreCase("menu") || command.getName().equalsIgnoreCase("opengui")) {
|
||||
Player player = (Player) commandSender;
|
||||
GUIUtils.openSelector(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@Override
|
||||
public boolean onCommand(CommandSender commandSender, Command command, String s,
|
||||
String[] strings) {
|
||||
if (!(commandSender instanceof Player player)) {
|
||||
ChatUtil.sendMessage(commandSender,
|
||||
"&9Error> &cYou must be a player to execute this command.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!PsHubCore.getInstance().getConfig().getBoolean("gui.selector.enabled")) {
|
||||
ChatUtil.sendMessage(player, "&9PlayerServers> &7Oops, this feature is disabled.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (command.getName().equalsIgnoreCase("servers") ||
|
||||
command.getName().equalsIgnoreCase("menu") ||
|
||||
command.getName().equalsIgnoreCase("opengui")) {
|
||||
SelectorGui.openGui(player);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,67 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.controllers;
|
||||
|
||||
import java.util.List;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.SessionFactory;
|
||||
import os.arcadiadevs.playerservers.hubcore.models.Node;
|
||||
|
||||
/**
|
||||
* A class that handles all the database operations for node object.
|
||||
*
|
||||
* @author ArcadiaDevs
|
||||
*/
|
||||
public class NodesController {
|
||||
|
||||
private final SessionFactory sessionFactory;
|
||||
|
||||
public NodesController(SessionFactory sessionFactory) {
|
||||
this.sessionFactory = sessionFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new node in the database.
|
||||
*
|
||||
* @param node The node to create
|
||||
*/
|
||||
public void createNode(Node node) {
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
session.beginTransaction();
|
||||
session.persist(node);
|
||||
session.getTransaction().commit();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all the nodes from the database.
|
||||
*
|
||||
* @return A list of all the nodes
|
||||
*/
|
||||
public List<Node> getNodes() {
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
return session.createQuery("from Node", Node.class).list();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the next available node.
|
||||
*
|
||||
* @return The next available node
|
||||
*/
|
||||
public Node getNextNode() {
|
||||
List<Node> nodes = getNodes();
|
||||
|
||||
if (nodes.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Node emptiestNode = nodes.get(0);
|
||||
|
||||
for (Node node : nodes) {
|
||||
if (node.getServers().size() < emptiestNode.getServers().size()) {
|
||||
emptiestNode = node;
|
||||
}
|
||||
}
|
||||
|
||||
return emptiestNode;
|
||||
}
|
||||
}
|
@ -0,0 +1,152 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.controllers;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.SessionFactory;
|
||||
import os.arcadiadevs.playerservers.hubcore.models.Server;
|
||||
|
||||
/**
|
||||
* A class that handles all the database operations for the servers object.
|
||||
*
|
||||
* @author ArcadiaDevs
|
||||
*/
|
||||
public class ServersController {
|
||||
|
||||
private final SessionFactory sessionFactory;
|
||||
|
||||
/**
|
||||
* Creates a new instance of the servers controller.
|
||||
*
|
||||
* @param sessionFactory The session factory
|
||||
*/
|
||||
public ServersController(SessionFactory sessionFactory) {
|
||||
this.sessionFactory = sessionFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new server in the database.
|
||||
*
|
||||
* @param server The server to create
|
||||
*/
|
||||
public void createServer(Server server) {
|
||||
Session session = this.sessionFactory.getCurrentSession();
|
||||
session.beginTransaction();
|
||||
session.persist(server);
|
||||
session.getTransaction().commit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all the servers from the database.
|
||||
*
|
||||
* @return A list of all the servers
|
||||
*/
|
||||
public List<Server> getServers() {
|
||||
Session session = this.sessionFactory.getCurrentSession();
|
||||
session.beginTransaction();
|
||||
List<Server> servers = session.createQuery("from Server", Server.class).list();
|
||||
session.getTransaction().commit();
|
||||
return servers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the server by the server id.
|
||||
*
|
||||
* @param ownerId The owner id
|
||||
* @return The server
|
||||
*/
|
||||
public Server getServer(UUID ownerId) {
|
||||
Session session = this.sessionFactory.getCurrentSession();
|
||||
session.beginTransaction();
|
||||
Server server = session
|
||||
.createQuery("from Server where owner = :owner", Server.class)
|
||||
.setParameter("owner", ownerId)
|
||||
.uniqueResult();
|
||||
session.getTransaction().commit();
|
||||
return server;
|
||||
}
|
||||
|
||||
public Server getServer(Player player) {
|
||||
return getServer(player.getUniqueId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the player has a server.
|
||||
*
|
||||
* @param owner The player to check
|
||||
* @return True if the player has a server, false otherwise
|
||||
*/
|
||||
public boolean hasServer(UUID owner) {
|
||||
Session session = this.sessionFactory.getCurrentSession();
|
||||
session.beginTransaction();
|
||||
Server server = session
|
||||
.createQuery("from Server where owner = :owner", Server.class)
|
||||
.setParameter("owner", owner)
|
||||
.uniqueResult();
|
||||
session.getTransaction().commit();
|
||||
return server != null;
|
||||
}
|
||||
|
||||
public boolean hasServer(Player player) {
|
||||
return hasServer(player.getUniqueId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a server exists by the server id.
|
||||
*
|
||||
* @param id The server id
|
||||
* @return True if the server exists, false otherwise
|
||||
*/
|
||||
public boolean serverExists(String id) {
|
||||
Session session = this.sessionFactory.getCurrentSession();
|
||||
session.beginTransaction();
|
||||
Server server = session
|
||||
.createQuery("from Server where id = :id", Server.class)
|
||||
.setParameter("id", id)
|
||||
.uniqueResult();
|
||||
session.getTransaction().commit();
|
||||
return server != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renames the server.
|
||||
*
|
||||
* @param owner The owner of the server
|
||||
* @param id The new id (name)
|
||||
*/
|
||||
public void renameServer(UUID owner, String id) {
|
||||
Session session = this.sessionFactory.getCurrentSession();
|
||||
session.beginTransaction();
|
||||
Server server = session
|
||||
.createQuery("from Server where owner = :owner", Server.class)
|
||||
.setParameter("owner", owner)
|
||||
.uniqueResult();
|
||||
server.setId(id);
|
||||
session.getTransaction().commit();
|
||||
}
|
||||
|
||||
public void renameServer(Player player, String id) {
|
||||
renameServer(player.getUniqueId(), id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the server.
|
||||
*
|
||||
* @param owner The owner of the server
|
||||
*/
|
||||
public void removePlayer(UUID owner) {
|
||||
Session session = this.sessionFactory.getCurrentSession();
|
||||
session.beginTransaction();
|
||||
Server server = session
|
||||
.createQuery("from Server where owner = :owner", Server.class)
|
||||
.setParameter("owner", owner)
|
||||
.uniqueResult();
|
||||
session.remove(server);
|
||||
session.getTransaction().commit();
|
||||
}
|
||||
|
||||
public void removePlayer(Player player) {
|
||||
removePlayer(player.getUniqueId());
|
||||
}
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.database;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import os.arcadiadevs.playerservers.hubcore.objects.Server;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public class DataBase {
|
||||
|
||||
private static final ExecutorService executor = Executors.newFixedThreadPool(10);
|
||||
|
||||
public static boolean containsPort(String port) {
|
||||
try (Connection connection = DataSource.getConnection()) {
|
||||
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM PlayerServers");
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
while(rs.next()) {
|
||||
if (rs.getString("Port").equals(port))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static Future<Server> getServer(Player player) {
|
||||
return executor.submit(() -> {
|
||||
try (Connection connection = DataSource.getConnection()) {
|
||||
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM PlayerServers WHERE UUID = ?");
|
||||
stmt.setString(1, player.getUniqueId().toString());
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
if (rs.next()) {
|
||||
return new Server()
|
||||
.setServerId(rs.getString("ServerID"))
|
||||
.setPort(rs.getInt("Port"))
|
||||
.setPlayerName(rs.getString("PlayerName"))
|
||||
.setNode(rs.getString("Node"));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static Future<List<Server>> getServersInfo() {
|
||||
return executor.submit(() -> {
|
||||
try (Connection connection = DataSource.getConnection()) {
|
||||
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM PlayerServers");
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
List<Server> servers = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
servers.add(new Server()
|
||||
.setServerId(rs.getString("ServerID"))
|
||||
.setPort(rs.getInt("Port"))
|
||||
.setPlayerName(rs.getString("PlayerName"))
|
||||
.setNode(rs.getString("Node")));
|
||||
}
|
||||
return servers;
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static String getPortByUUID(String UUID) {
|
||||
try (Connection connection = DataSource.getConnection()) {
|
||||
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM PlayerServers WHERE UUID='" + UUID + "'");
|
||||
ResultSet rs = stmt.executeQuery(); rs.next();
|
||||
return rs.getString("Port");
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean containsServer(String UUID) {
|
||||
try (Connection connection = DataSource.getConnection()) {
|
||||
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM PlayerServers");
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
while(rs.next()) {
|
||||
if (rs.getString("UUID").equals(UUID))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.database;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public class DataSource
|
||||
{
|
||||
|
||||
public static HikariDataSource hikari;
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
public void registerDataSource() throws SQLException {
|
||||
|
||||
final var pl = PSHubCore.getInstance();
|
||||
|
||||
final var address = pl.getConfig().getString("mysql.hostname");
|
||||
final var name = pl.getConfig().getString("mysql.database");
|
||||
final var username = pl.getConfig().getString("mysql.username");
|
||||
final var password = pl.getConfig().getString("mysql.password");
|
||||
final var useSSL = pl.getConfig().getBoolean("mysql.useSSL");
|
||||
|
||||
hikari = new HikariDataSource();
|
||||
hikari.setPoolName("PSHubCore");
|
||||
hikari.setMaximumPoolSize(10);
|
||||
hikari.setLoginTimeout(10);
|
||||
hikari.setConnectionTimeout(10000);
|
||||
hikari.setDataSourceClassName("com.mysql.cj.jdbc.MysqlDataSource");
|
||||
hikari.addDataSourceProperty("serverName", address);
|
||||
hikari.addDataSourceProperty("port", "3306");
|
||||
hikari.addDataSourceProperty("databaseName", name);
|
||||
hikari.addDataSourceProperty("user", username);
|
||||
hikari.addDataSourceProperty("password", password);
|
||||
hikari.addDataSourceProperty("useSSL", useSSL);
|
||||
}
|
||||
|
||||
public static Connection getConnection() throws SQLException {
|
||||
return hikari.getConnection();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.enums;
|
||||
|
||||
public enum PowerAction {
|
||||
START,
|
||||
STOP,
|
||||
}
|
@ -9,69 +9,102 @@ import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.PsHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.guis.SelectorGui;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.ChatUtil;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.GUIUtils;
|
||||
import os.arcadiadevs.playerservers.hubcore.guis.PlayerMenuGui;
|
||||
|
||||
public class ClickEvent implements Listener {
|
||||
public class ClickEvent implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onClick(PlayerInteractEvent event) {
|
||||
final PSHubCore PSH = PSHubCore.getInstance();
|
||||
final var player = event.getPlayer();
|
||||
private final PsHubCore instance;
|
||||
|
||||
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) {
|
||||
return;
|
||||
}
|
||||
public ClickEvent(PsHubCore instance) {
|
||||
this.instance = instance;
|
||||
}
|
||||
|
||||
if (PSH.getConfig().getBoolean("gui.selector.item.enabled") && player.getInventory().getHeldItemSlot() == PSHubCore.getInstance().getConfig().getInt("gui.selector.item.location")) {
|
||||
if (!player.hasPermission("hubcore.selector")) {
|
||||
player.sendMessage(ChatUtil.translate(PSH.getConfig().getString("messages.no-permission")));
|
||||
return;
|
||||
}
|
||||
GUIUtils.openSelector(player);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
/**
|
||||
* Executes action on player interact event.
|
||||
*
|
||||
* @param event the event
|
||||
*/
|
||||
@EventHandler
|
||||
public void onClick(PlayerInteractEvent event) {
|
||||
final var player = event.getPlayer();
|
||||
|
||||
if (PSH.getConfig().getBoolean("gui.player-menu.item.enabled") && player.getInventory().getHeldItemSlot() == PSHubCore.getInstance().getConfig().getInt("gui.player-menu.item.location")) {
|
||||
if (!player.hasPermission("hubcore.player-menu")) {
|
||||
player.sendMessage(ChatUtil.translate(PSH.getConfig().getString("messages.no-permission")));
|
||||
return;
|
||||
}
|
||||
GUIUtils.openMenu(player);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (event.getAction() != Action.RIGHT_CLICK_AIR
|
||||
&& event.getAction() != Action.RIGHT_CLICK_BLOCK) {
|
||||
return;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void inventory(InventoryClickEvent event) {
|
||||
if (!(event.getWhoClicked() instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final var player = (Player) event.getWhoClicked();
|
||||
final var inventoryType = event.getInventory().getType();
|
||||
final var selectorItemSlot = PSHubCore.getInstance().getConfig().getInt("gui.selector.item.location");
|
||||
final var menuItemSlot = PSHubCore.getInstance().getConfig().getInt("gui.player-menu.item.location");
|
||||
|
||||
if (event.getSlot() == selectorItemSlot && (inventoryType == InventoryType.PLAYER || inventoryType == InventoryType.CRAFTING)
|
||||
|| event.getSlot() == menuItemSlot && (inventoryType == InventoryType.PLAYER || inventoryType == InventoryType.CRAFTING)) {
|
||||
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (instance.getConfig().getBoolean("gui.selector.item.enabled")
|
||||
&& player.getInventory().getHeldItemSlot()
|
||||
== PsHubCore.getInstance().getConfig().getInt("gui.selector.item.location")) {
|
||||
if (!player.hasPermission("hubcore.selector")) {
|
||||
ChatUtil.sendMessage(player, instance.getConfig().getString("messages.no-permission"));
|
||||
return;
|
||||
}
|
||||
SelectorGui.openGui(player);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void drop(PlayerDropItemEvent event) {
|
||||
final var player = event.getPlayer();
|
||||
if (instance.getConfig().getBoolean("gui.player-menu.item.enabled")
|
||||
&& player.getInventory().getHeldItemSlot()
|
||||
== PsHubCore.getInstance().getConfig().getInt("gui.player-menu.item.location")) {
|
||||
if (!player.hasPermission("hubcore.player-menu")) {
|
||||
ChatUtil.sendMessage(player, instance.getConfig().getString("messages.no-permission"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (player.getInventory().getHeldItemSlot() == PSHubCore.getInstance().getConfig().getInt("gui.selector.item.location") ||
|
||||
player.getInventory().getHeldItemSlot() == PSHubCore.getInstance().getConfig().getInt("gui.player-menu.item.location")) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
PlayerMenuGui.openGui(player);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevents player from moving items in their inventory.
|
||||
*
|
||||
* @param event The event.
|
||||
*/
|
||||
@EventHandler
|
||||
public void inventory(InventoryClickEvent event) {
|
||||
if (!(event.getWhoClicked() instanceof final Player player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final var inventoryType = event.getInventory().getType();
|
||||
final var selectorItemSlot =
|
||||
PsHubCore.getInstance().getConfig().getInt("gui.selector.item.location");
|
||||
final var menuItemSlot =
|
||||
PsHubCore.getInstance().getConfig().getInt("gui.player-menu.item.location");
|
||||
|
||||
if (event.getSlot() == selectorItemSlot
|
||||
&& (inventoryType == InventoryType.PLAYER || inventoryType == InventoryType.CRAFTING)
|
||||
|| event.getSlot() == menuItemSlot
|
||||
&& (inventoryType == InventoryType.PLAYER || inventoryType == InventoryType.CRAFTING)) {
|
||||
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevents players from dropping the selector item.
|
||||
*
|
||||
* @param event The event.
|
||||
*/
|
||||
@EventHandler
|
||||
public void drop(PlayerDropItemEvent event) {
|
||||
final var player = event.getPlayer();
|
||||
|
||||
if (player.getInventory().getHeldItemSlot()
|
||||
== PsHubCore.getInstance().getConfig().getInt("gui.selector.item.location")
|
||||
|| player.getInventory().getHeldItemSlot()
|
||||
== PsHubCore.getInstance().getConfig().getInt("gui.player-menu.item.location")
|
||||
) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,25 +1,34 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.events;
|
||||
|
||||
import org.bukkit.configuration.Configuration;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.weather.WeatherChangeEvent;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.PsHubCore;
|
||||
|
||||
public class HubEvents implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void weatherChange(WeatherChangeEvent e) {
|
||||
if (PSHubCore.getInstance().getConfig().getBoolean("miscellaneous.disable-weather")) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
private final Configuration config;
|
||||
|
||||
@EventHandler
|
||||
public void entityDamage(EntityDamageEvent e) {
|
||||
if (e.getEntity() instanceof Player && PSHubCore.getInstance().getConfig().getBoolean("miscellaneous.disable-damage"))
|
||||
e.setCancelled(true);
|
||||
public HubEvents(FileConfiguration config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void weatherChange(WeatherChangeEvent e) {
|
||||
if (config.getBoolean("miscellaneous.disable-weather")) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void entityDamage(EntityDamageEvent e) {
|
||||
if (e.getEntity() instanceof Player && config.getBoolean("miscellaneous.disable-damage")) {
|
||||
e.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6,73 +6,83 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.ChatUtil;
|
||||
import os.arcadiadevs.playerservers.hubcore.PsHubCore;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.ChatUtil;
|
||||
|
||||
public class JoinEvent implements Listener {
|
||||
|
||||
final PSHubCore PSH = PSHubCore.getInstance();
|
||||
private final PsHubCore instance;
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent e) {
|
||||
public JoinEvent(PsHubCore instance) {
|
||||
this.instance = instance;
|
||||
}
|
||||
|
||||
final var selectorConfigMaterial = PSH.getConfig().getString("gui.selector.item.material");
|
||||
final var menuConfigMaterial = PSH.getConfig().getString("gui.player-menu.item.material");
|
||||
final var selectorMaterial = XMaterial.matchXMaterial(selectorConfigMaterial).orElse(XMaterial.COMPASS).parseMaterial();
|
||||
final var menuMaterial = XMaterial.matchXMaterial(menuConfigMaterial).orElse(XMaterial.EMERALD).parseMaterial();
|
||||
final var player = e.getPlayer();
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent e) {
|
||||
|
||||
if (!PSH.getConfig().getBoolean("gui.selector.item.enabled")) {
|
||||
player.getInventory().forEach(item -> {
|
||||
if (item != null && item.getType() == selectorMaterial) {
|
||||
player.getInventory().remove(item);
|
||||
}
|
||||
});
|
||||
final var selectorConfigMaterial = instance.getConfig().getString("gui.selector.item.material");
|
||||
final var menuConfigMaterial = instance.getConfig().getString("gui.player-menu.item.material");
|
||||
final var selectorMaterial =
|
||||
XMaterial.matchXMaterial(selectorConfigMaterial).orElse(XMaterial.COMPASS).parseMaterial();
|
||||
final var menuMaterial =
|
||||
XMaterial.matchXMaterial(menuConfigMaterial).orElse(XMaterial.EMERALD).parseMaterial();
|
||||
final var player = e.getPlayer();
|
||||
|
||||
if (!instance.getConfig().getBoolean("gui.selector.item.enabled")) {
|
||||
player.getInventory().forEach(item -> {
|
||||
if (item != null && item.getType() == selectorMaterial) {
|
||||
player.getInventory().remove(item);
|
||||
}
|
||||
|
||||
if (!PSH.getConfig().getBoolean("gui.player-menu.item.enabled")) {
|
||||
player.getInventory().forEach(item -> {
|
||||
if (item != null && item.getType() == menuMaterial) {
|
||||
player.getInventory().remove(item);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
new Thread(() -> {
|
||||
final var selectorItemStack = new ItemStack(selectorMaterial);
|
||||
final var menuItemStack = new ItemStack(menuMaterial);
|
||||
final var selectorItemMeta = selectorItemStack.getItemMeta();
|
||||
final var menuItemMeta = menuItemStack.getItemMeta();
|
||||
|
||||
selectorItemMeta.setDisplayName(ChatUtil.translate(PSH.getConfig().getString("gui.selector.item.name")));
|
||||
menuItemMeta.setDisplayName(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.item.name")));
|
||||
|
||||
final List<String> lore = PSH.getConfig().getStringList("gui.selector.item.description")
|
||||
.stream()
|
||||
.map(ChatUtil::translate)
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
final List<String> lore1 = PSH.getConfig().getStringList("gui.player-menu.item.description")
|
||||
.stream()
|
||||
.map(ChatUtil::translate)
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
selectorItemMeta.setLore(lore);
|
||||
menuItemMeta.setLore(lore1);
|
||||
selectorItemStack.setItemMeta(selectorItemMeta);
|
||||
menuItemStack.setItemMeta(menuItemMeta);
|
||||
|
||||
if (PSH.getConfig().getBoolean("gui.selector.item.enabled")) {
|
||||
Bukkit.getScheduler().runTask(PSH, () -> player.getInventory().setItem(PSH.getConfig().getInt("gui.selector.item.location"), selectorItemStack));
|
||||
}
|
||||
|
||||
if (PSH.getConfig().getBoolean("gui.player-menu.item.enabled")) {
|
||||
Bukkit.getScheduler().runTask(PSH, () -> player.getInventory().setItem(PSH.getConfig().getInt("gui.player-menu.item.location"), menuItemStack));
|
||||
}
|
||||
}).start();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
if (!instance.getConfig().getBoolean("gui.player-menu.item.enabled")) {
|
||||
player.getInventory().forEach(item -> {
|
||||
if (item != null && item.getType() == menuMaterial) {
|
||||
player.getInventory().remove(item);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
new Thread(() -> {
|
||||
final var selectorItemStack = new ItemStack(selectorMaterial);
|
||||
final var menuItemStack = new ItemStack(menuMaterial);
|
||||
final var selectorItemMeta = selectorItemStack.getItemMeta();
|
||||
final var menuItemMeta = menuItemStack.getItemMeta();
|
||||
|
||||
selectorItemMeta.setDisplayName(
|
||||
ChatUtil.translate(instance.getConfig().getString("gui.selector.item.name")));
|
||||
menuItemMeta.setDisplayName(
|
||||
ChatUtil.translate(instance.getConfig().getString("gui.player-menu.item.name")));
|
||||
|
||||
final List<String> lore = instance.getConfig().getStringList("gui.selector.item.description")
|
||||
.stream()
|
||||
.map(ChatUtil::translate)
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
final List<String> lore1 = instance.getConfig().getStringList("gui.player-menu.item.description")
|
||||
.stream()
|
||||
.map(ChatUtil::translate)
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
selectorItemMeta.setLore(lore);
|
||||
menuItemMeta.setLore(lore1);
|
||||
selectorItemStack.setItemMeta(selectorItemMeta);
|
||||
menuItemStack.setItemMeta(menuItemMeta);
|
||||
|
||||
if (instance.getConfig().getBoolean("gui.selector.item.enabled")) {
|
||||
Bukkit.getScheduler().runTask(instance, () -> player.getInventory()
|
||||
.setItem(instance.getConfig().getInt("gui.selector.item.location"), selectorItemStack));
|
||||
}
|
||||
|
||||
if (instance.getConfig().getBoolean("gui.player-menu.item.enabled")) {
|
||||
Bukkit.getScheduler().runTask(instance, () -> player.getInventory()
|
||||
.setItem(instance.getConfig().getInt("gui.player-menu.item.location"), menuItemStack));
|
||||
}
|
||||
}).start();
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,227 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.guis;
|
||||
|
||||
import com.cryptomorin.xseries.XMaterial;
|
||||
import com.cryptomorin.xseries.XSound;
|
||||
import com.samjakob.spigui.buttons.SGButton;
|
||||
import com.samjakob.spigui.item.ItemBuilder;
|
||||
import java.util.ArrayList;
|
||||
import org.bukkit.entity.Player;
|
||||
import os.arcadiadevs.playerservers.hubcore.PsHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.PowerAction;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
import os.arcadiadevs.playerservers.hubcore.models.Server;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.BungeeUtil;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.ChatUtil;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.GuiUtils;
|
||||
|
||||
public class PlayerMenuGui {
|
||||
|
||||
public static void openGui(Player player) {
|
||||
final var instance = PsHubCore.getInstance();
|
||||
final var serversController = instance.getServersController();
|
||||
|
||||
if (!serversController.hasServer(player)) {
|
||||
final var menu = instance.getSpiGui().create(
|
||||
ChatUtil.translate(instance.getConfig().getString("gui.player-menu.menu.name")), 3);
|
||||
|
||||
menu.setAutomaticPaginationEnabled(false);
|
||||
menu.setBlockDefaultInteractions(true);
|
||||
|
||||
for (int i = 0; i < 9 * 4; i++) {
|
||||
menu.setButton(
|
||||
i,
|
||||
new SGButton(new ItemBuilder(XMaterial.GRAY_STAINED_GLASS_PANE.parseItem()).build())
|
||||
);
|
||||
}
|
||||
|
||||
var itemCreate = new ItemBuilder(XMaterial.DIAMOND_BLOCK.parseMaterial())
|
||||
.name(instance.getConfig().getString("gui.player-menu.menu.create.name"))
|
||||
.lore(instance.getConfig().getStringList("gui.player-menu.menu.create.lore"))
|
||||
.build();
|
||||
|
||||
menu.setButton(0, 13, new SGButton(itemCreate).withListener(
|
||||
listener -> {
|
||||
BungeeUtil.createServer(player);
|
||||
XSound.ENTITY_EXPERIENCE_ORB_PICKUP.play(player);
|
||||
}));
|
||||
|
||||
player.openInventory(menu.getInventory());
|
||||
return;
|
||||
}
|
||||
|
||||
final var rows = 5;
|
||||
final var menu = instance.getSpiGui()
|
||||
.create(ChatUtil.translate(instance.getConfig().getString("gui.player-menu.menu.name")),
|
||||
rows);
|
||||
menu.setAutomaticPaginationEnabled(false);
|
||||
menu.setBlockDefaultInteractions(true);
|
||||
|
||||
GuiUtils.addBorder(menu, rows);
|
||||
|
||||
final var server = serversController.getServer(player);
|
||||
|
||||
if (server == null) {
|
||||
player.sendMessage(ChatUtil.translate("&9Error> &cCould not find your server!"));
|
||||
return;
|
||||
}
|
||||
|
||||
final var online = server.getStatus() == ServerStatus.ONLINE;
|
||||
|
||||
var lore = instance.getConfig().getStringList(online
|
||||
? "gui.player-menu.menu.info.online.lore"
|
||||
: "gui.player-menu.menu.info.offline.lore"
|
||||
);
|
||||
|
||||
lore = lore.stream()
|
||||
.map(s -> s.replaceAll("%server%", server.getId()))
|
||||
.map(s -> s.replaceAll("%status%", online ? "&aOnline" : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%players%", online ? server.getInfo().players() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%maxplayers%", online ? server.getInfo().maxPlayers() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%port%", server.getPort() + ""))
|
||||
.map(s -> s.replaceAll("%motd%", online ? server.getInfo().motd() : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%node%", server.getNode().getName()))
|
||||
.map(s -> s.replaceAll("%owner%", server.getOfflinePlayer().getName()))
|
||||
.map(s -> s.replaceAll("%ip%", server.getNode().getIp()))
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
final var itemPlayer = new SGButton(
|
||||
new ItemBuilder(XMaterial.PLAYER_HEAD.parseMaterial())
|
||||
.name(ChatUtil.translate(instance.getConfig().getString(online
|
||||
? "gui.player-menu.menu.info.online.name"
|
||||
: "gui.player-menu.menu.info.offline.name")
|
||||
.replaceAll("%server%", server.getId())))
|
||||
.skullOwner(player.getName())
|
||||
.lore(lore)
|
||||
.build()
|
||||
);
|
||||
|
||||
final var itemDelete = new SGButton(new ItemBuilder(XMaterial.BARRIER.parseMaterial())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig().getString("gui.player-menu.menu.delete.name")))
|
||||
.lore(instance.getConfig().getStringList("gui.player-menu.menu.delete.lore"))
|
||||
.build())
|
||||
.withListener(listener -> openDeleteConfirmation(player, server));
|
||||
|
||||
if (online) {
|
||||
final var itemJoin = new SGButton(new ItemBuilder(XMaterial.DARK_OAK_DOOR.parseItem())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig().getString("gui.player-menu.menu.join.name")))
|
||||
.lore(instance.getConfig().getStringList("gui.player-menu.menu.join.lore"))
|
||||
.build())
|
||||
.withListener(listener -> server.connect());
|
||||
|
||||
final var itemStop = new SGButton(new ItemBuilder(XMaterial.RED_TERRACOTTA.parseItem())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig().getString("gui.player-menu.menu.stop.name")))
|
||||
.lore(instance.getConfig().getStringList("gui.player-menu.menu.stop.lore"))
|
||||
.build())
|
||||
.withListener(listener -> openStopConfirmation(player, server));
|
||||
|
||||
menu.setButton(22, itemJoin);
|
||||
menu.setButton(20, itemStop);
|
||||
}
|
||||
|
||||
if (!online) {
|
||||
final var itemStart = new SGButton(new ItemBuilder(XMaterial.GREEN_TERRACOTTA.parseItem())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig().getString("gui.player-menu.menu.start.name")))
|
||||
.lore(instance.getConfig().getStringList("gui.player-menu.menu.start.lore"))
|
||||
.build())
|
||||
.withListener(listener -> server.executePowerAction(PowerAction.START));
|
||||
|
||||
menu.setButton(20, itemStart);
|
||||
}
|
||||
|
||||
menu.setButton(0, 24, itemDelete);
|
||||
|
||||
menu.setButton(0, 4, itemPlayer);
|
||||
|
||||
XSound.BLOCK_NOTE_BLOCK_BASS.play(player);
|
||||
player.openInventory(menu.getInventory());
|
||||
}
|
||||
|
||||
public static void openDeleteConfirmation(Player player, Server server) {
|
||||
XSound.BLOCK_NOTE_BLOCK_BASS.play(player);
|
||||
final var instance = PsHubCore.getInstance();
|
||||
|
||||
final var deleteConfirmationMenu = instance.getSpiGui().create(ChatUtil.translate(
|
||||
instance.getConfig().getString("gui.player-menu.menu.delete.confirmation.name")), 3);
|
||||
|
||||
deleteConfirmationMenu.setAutomaticPaginationEnabled(false);
|
||||
deleteConfirmationMenu.setBlockDefaultInteractions(true);
|
||||
|
||||
final var yesButton = new SGButton(new ItemBuilder(XMaterial.GREEN_TERRACOTTA.parseItem())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig()
|
||||
.getString("gui.player-menu.menu.delete.confirmation.accept.name")))
|
||||
.lore(
|
||||
instance.getConfig()
|
||||
.getStringList("gui.player-menu.menu.delete.confirmation.accept.lore"))
|
||||
.build())
|
||||
.withListener(listener2 -> {
|
||||
XSound.ENTITY_EXPERIENCE_ORB_PICKUP.play(player);
|
||||
server.delete();
|
||||
player.closeInventory();
|
||||
});
|
||||
|
||||
final var noButton = new SGButton(new ItemBuilder(XMaterial.RED_TERRACOTTA.parseItem())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig()
|
||||
.getString("gui.player-menu.menu.delete.confirmation.decline.name")))
|
||||
.lore(instance.getConfig()
|
||||
.getStringList("gui.player-menu.menu.delete.confirmation.decline.lore"))
|
||||
.build())
|
||||
.withListener(listener -> {
|
||||
player.closeInventory();
|
||||
XSound.BLOCK_NOTE_BLOCK_BASS.play(player);
|
||||
});
|
||||
|
||||
deleteConfirmationMenu.setButton(0, 11, yesButton);
|
||||
|
||||
deleteConfirmationMenu.setButton(0, 15, noButton);
|
||||
|
||||
player.openInventory(deleteConfirmationMenu.getInventory());
|
||||
}
|
||||
|
||||
public static void openStopConfirmation(Player player, Server server) {
|
||||
final var instance = PsHubCore.getInstance();
|
||||
|
||||
final var stopConfirmationMenu = instance.getSpiGui().create(ChatUtil.translate(
|
||||
instance.getConfig().getString("gui.player-menu.menu.stop.confirmation.name")), 3);
|
||||
|
||||
stopConfirmationMenu.setAutomaticPaginationEnabled(false);
|
||||
stopConfirmationMenu.setBlockDefaultInteractions(true);
|
||||
|
||||
final var yesButton = new SGButton(new ItemBuilder(XMaterial.GREEN_TERRACOTTA.parseItem())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig().getString("gui.player-menu.menu.stop.confirmation.accept.name")))
|
||||
.lore(instance.getConfig()
|
||||
.getStringList("gui.player-menu.menu.stop.confirmation.accept.lore"))
|
||||
.build())
|
||||
.withListener(listener2 -> {
|
||||
XSound.ENTITY_EXPERIENCE_ORB_PICKUP.play(player);
|
||||
server.executePowerAction(PowerAction.STOP);
|
||||
player.closeInventory();
|
||||
});
|
||||
|
||||
final var noButton = new SGButton(new ItemBuilder(XMaterial.RED_TERRACOTTA.parseItem())
|
||||
.name(ChatUtil.translate(
|
||||
instance.getConfig()
|
||||
.getString("gui.player-menu.menu.stop.confirmation.decline.name")))
|
||||
.lore(
|
||||
instance.getConfig()
|
||||
.getStringList("gui.player-menu.menu.stop.confirmation.decline.lore"))
|
||||
.build())
|
||||
.withListener(listener -> {
|
||||
XSound.BLOCK_NOTE_BLOCK_BASS.play(player);
|
||||
player.closeInventory();
|
||||
});
|
||||
|
||||
stopConfirmationMenu.setButton(0, 11, yesButton);
|
||||
|
||||
stopConfirmationMenu.setButton(0, 15, noButton);
|
||||
|
||||
player.openInventory(stopConfirmationMenu.getInventory());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.guis;
|
||||
|
||||
import com.cryptomorin.xseries.XMaterial;
|
||||
import com.samjakob.spigui.buttons.SGButton;
|
||||
import com.samjakob.spigui.item.ItemBuilder;
|
||||
import java.util.ArrayList;
|
||||
import org.bukkit.entity.Player;
|
||||
import os.arcadiadevs.playerservers.hubcore.PsHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.BungeeUtil;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.ChatUtil;
|
||||
|
||||
public class SelectorGui {
|
||||
|
||||
public static void openGui(Player player) {
|
||||
|
||||
final var instance = PsHubCore.getInstance();
|
||||
final var menu = instance.getSpiGui()
|
||||
.create(ChatUtil.translate(instance.getConfig().getString("gui.selector.menu.name")), 5);
|
||||
|
||||
menu.setAutomaticPaginationEnabled(true);
|
||||
menu.setBlockDefaultInteractions(true);
|
||||
|
||||
final var onlinexMaterial =
|
||||
XMaterial.matchXMaterial(instance.getConfig().getString("gui.selector.menu.online.block"))
|
||||
.orElse(XMaterial.PLAYER_HEAD).parseMaterial();
|
||||
final var offlinexMaterial =
|
||||
XMaterial.matchXMaterial(instance.getConfig().getString("gui.selector.menu.offline.block"))
|
||||
.orElse(XMaterial.RED_TERRACOTTA).parseMaterial();
|
||||
|
||||
final var servers = PsHubCore.getInstance()
|
||||
.getServersController()
|
||||
.getServers();
|
||||
|
||||
servers.forEach(server -> {
|
||||
final var itemBuilder = new ItemBuilder(
|
||||
server.getStatus() == ServerStatus.ONLINE ? onlinexMaterial : offlinexMaterial);
|
||||
final var online = server.getStatus() == ServerStatus.ONLINE;
|
||||
|
||||
var lore = instance.getConfig().getStringList(
|
||||
server.getStatus() == ServerStatus.ONLINE ? "gui.selector.menu.online.lore" :
|
||||
"gui.selector.menu.offline.lore");
|
||||
|
||||
lore = lore.stream()
|
||||
.map(s -> s.replaceAll("%server%", server.getId()))
|
||||
.map(s -> s.replaceAll("%status%", online ? "&aOnline" : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%players%", online ? server.getInfo().players() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%maxplayers%", online ? server.getInfo().maxPlayers() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%port%", server.getPort() + ""))
|
||||
.map(s -> s.replaceAll("%motd%", online ? server.getInfo().motd() : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%node%", server.getNode().getName()))
|
||||
.map(s -> s.replaceAll("%owner%", server.getOfflinePlayer().getName()))
|
||||
.map(s -> s.replaceAll("%ip%", server.getNode().getIp()))
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
var item = itemBuilder
|
||||
.name(ChatUtil.translate(instance.getConfig().getString(
|
||||
online ? "gui.selector.menu.online.name" : "gui.selector.menu.offline.name")
|
||||
.replaceAll("%server%", server.getId())
|
||||
.replaceAll("%status%", online ? "&aOnline" : "&cOffline")
|
||||
.replaceAll("%players%", online ? server.getInfo().players() + "" : "0")
|
||||
.replaceAll("%maxplayers%", online ? server.getInfo().maxPlayers() + "" : "0")
|
||||
.replaceAll("%port%", server.getPort() + "")
|
||||
.replaceAll("%motd%", online ? server.getInfo().motd() : "&cOffline")
|
||||
.replaceAll("%node%", server.getNode().getName())
|
||||
.replaceAll("%owner%", server.getOfflinePlayer().getName())
|
||||
.replaceAll("%ip%", server.getNode().getIp())
|
||||
))
|
||||
.lore(lore)
|
||||
.build();
|
||||
|
||||
menu.setButton(0, menu.getInventory().firstEmpty(), new SGButton(item).withListener(
|
||||
listener -> BungeeUtil.connectPlayer(player)));
|
||||
});
|
||||
|
||||
player.openInventory(menu.getInventory());
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,79 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.models;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.GenerationType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.OneToMany;
|
||||
import jakarta.persistence.Table;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.List;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
/**
|
||||
* The node object.
|
||||
*
|
||||
* @author ArcadiaDevs
|
||||
*/
|
||||
@Entity
|
||||
@Table(name = "nodes")
|
||||
@Getter
|
||||
@Setter
|
||||
public class Node {
|
||||
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private int id;
|
||||
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
@Column(name = "ip")
|
||||
private String ip;
|
||||
|
||||
@Column(name = "port")
|
||||
private int port;
|
||||
|
||||
@Column(name = "min_port")
|
||||
private int minPort;
|
||||
|
||||
@Column(name = "max_port")
|
||||
private int maxPort;
|
||||
|
||||
@Column(name = "max_servers")
|
||||
private short maxServers;
|
||||
|
||||
@Column(name = "token")
|
||||
private String token;
|
||||
|
||||
@Column(name = "servers")
|
||||
@OneToMany(mappedBy = "node", fetch = FetchType.EAGER)
|
||||
private List<Server> servers;
|
||||
|
||||
/**
|
||||
* Get the full address of the server as ip:port.
|
||||
*
|
||||
* @return The full address
|
||||
*/
|
||||
public String getFullAddress() {
|
||||
return this.ip + ":" + this.port;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the address of the node as InetSocketAddress.
|
||||
*
|
||||
* @return The address
|
||||
*/
|
||||
public InetSocketAddress getInetAddress() {
|
||||
return new InetSocketAddress(this.ip, this.port);
|
||||
}
|
||||
|
||||
public String getNumericAddress() {
|
||||
return getIp().replaceAll("localhost", "127.0.0.1");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,140 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.models;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.Table;
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.PowerAction;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.BungeeUtil;
|
||||
import os.arcadiadevs.playerservers.hubcore.utils.ServerPinger;
|
||||
|
||||
/**
|
||||
* The model of a server.
|
||||
*
|
||||
* @author ArcadiaDevs
|
||||
*/
|
||||
@Entity
|
||||
@Table(name = "servers")
|
||||
@Getter
|
||||
@Setter
|
||||
public class Server {
|
||||
|
||||
@Id
|
||||
@Column(name = "id")
|
||||
private String id;
|
||||
|
||||
@Column(name = "owner")
|
||||
private UUID owner;
|
||||
|
||||
@Column(name = "port")
|
||||
private Integer port;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "node", nullable = false)
|
||||
private Node node;
|
||||
|
||||
public String getFullAddress() {
|
||||
return (this.node.getIp() + ":" + this.port)
|
||||
.replaceAll("localhost", "127.0.0.1");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the owner of the server as a OfflinePlayer.
|
||||
*
|
||||
* @return The owner of the server
|
||||
*/
|
||||
public OfflinePlayer getOfflinePlayer() {
|
||||
return Bukkit.getOfflinePlayer(owner);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the owner of the server as a player.
|
||||
*
|
||||
* @return The owner of the server
|
||||
*/
|
||||
public Player getPlayer() {
|
||||
return Bukkit.getPlayer(owner);
|
||||
}
|
||||
|
||||
public void connect() {
|
||||
BungeeUtil.connectPlayer(getPlayer());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the InetSocketAddress of the server.
|
||||
*
|
||||
* @return The InetSocketAddress
|
||||
*/
|
||||
public InetSocketAddress getInetAddress() {
|
||||
return new InetSocketAddress(this.node.getIp(), this.port);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the status of the server.
|
||||
*
|
||||
* @return The status of the server
|
||||
*/
|
||||
public ServerStatus getStatus() {
|
||||
final var address = node.getNumericAddress();
|
||||
|
||||
var status = ServerStatus.UNKNOWN;
|
||||
try {
|
||||
Socket s = new Socket(address, port);
|
||||
if (s.isConnected()) {
|
||||
status = ServerStatus.ONLINE;
|
||||
}
|
||||
s.close();
|
||||
} catch (IOException ignored) {
|
||||
status = ServerStatus.OFFLINE;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the MOTD and player count of the server.
|
||||
*
|
||||
* @return The status of the server
|
||||
*/
|
||||
public ServerPinger.PingResult getInfo() {
|
||||
try {
|
||||
return ServerPinger.ping(this.getInetAddress(), 1000).get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a power action on the server.
|
||||
*
|
||||
* @param action The action to execute
|
||||
*/
|
||||
public void executePowerAction(PowerAction action) {
|
||||
switch (action) {
|
||||
case START -> BungeeUtil.startServer(getPlayer());
|
||||
case STOP -> BungeeUtil.stopServer(getPlayer());
|
||||
default -> throw new IllegalStateException("Unexpected value: " + action);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the server.
|
||||
*/
|
||||
public void delete() {
|
||||
BungeeUtil.deleteServer(getPlayer());
|
||||
}
|
||||
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.objects;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class Node {
|
||||
|
||||
private String name;
|
||||
private String hostname;
|
||||
private String token;
|
||||
private int port;
|
||||
|
||||
public String getFullAddress() {
|
||||
return hostname + ":" + port;
|
||||
}
|
||||
|
||||
public Node setName(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Node setHostname(String hostname) {
|
||||
this.hostname = hostname;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Node setToken(String token) {
|
||||
this.token = token;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Node setPort(int port) {
|
||||
this.port = port;
|
||||
return this;
|
||||
}
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.objects;
|
||||
|
||||
public class PingInfoStructure {
|
||||
|
||||
private final int online;
|
||||
private final int max;
|
||||
private final String MOTD;
|
||||
|
||||
public PingInfoStructure(int online, int max, String MOTD) {
|
||||
this.online = online;
|
||||
this.max = max;
|
||||
this.MOTD = MOTD;
|
||||
}
|
||||
|
||||
public int getMax() {
|
||||
return max;
|
||||
}
|
||||
|
||||
public int getOnline() {
|
||||
return online;
|
||||
}
|
||||
|
||||
public String getMOTD() {
|
||||
return MOTD;
|
||||
}
|
||||
}
|
@ -1,137 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.objects;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.SneakyThrows;
|
||||
import org.bukkit.entity.Player;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.database.DataBase;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@Getter
|
||||
public class Server {
|
||||
|
||||
private String serverId;
|
||||
private String playerName;
|
||||
private String node;
|
||||
private Integer port;
|
||||
|
||||
@Setter private PingInfoStructure cachedData;
|
||||
@Setter private ServerStatus cachedStatus;
|
||||
|
||||
public String getShortId() {
|
||||
return serverId.split("-")[0];
|
||||
}
|
||||
|
||||
public Server() {}
|
||||
|
||||
@SneakyThrows
|
||||
public Server(Player player) {
|
||||
final var server = DataBase.getServer(player).get();
|
||||
this.serverId = server.getServerId();
|
||||
this.playerName = server.getPlayerName();
|
||||
this.node = server.getNode();
|
||||
this.port = server.getPort();
|
||||
}
|
||||
|
||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||
public ServerStatus getServerStatus() {
|
||||
AtomicBoolean isOnline = new AtomicBoolean(false);
|
||||
|
||||
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
|
||||
|
||||
executor.execute(() -> {
|
||||
try {
|
||||
Socket socket = new Socket(getHostname(), port);
|
||||
isOnline.set(true);
|
||||
socket.close();
|
||||
} catch (IOException e) {
|
||||
isOnline.set(false);
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
Thread.sleep(200);
|
||||
executor.shutdown();
|
||||
executor.awaitTermination(1, java.util.concurrent.TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
return isOnline.get() ? ServerStatus.ONLINE : ServerStatus.OFFLINE;
|
||||
|
||||
}
|
||||
|
||||
public Node getNodeObject() {
|
||||
final var config = PSHubCore
|
||||
.getInstance()
|
||||
.getMultinode()
|
||||
.getConfigurationSection("nodes." + this.node);
|
||||
|
||||
return new Node()
|
||||
.setName(this.node)
|
||||
.setHostname(config.getString("host"))
|
||||
.setToken(config.getString("token"))
|
||||
.setPort(config.getInt("port"));
|
||||
}
|
||||
|
||||
public PingInfoStructure getData() {
|
||||
try (Socket sock = new Socket(getHostname(), port)) {
|
||||
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
|
||||
DataInputStream in = new DataInputStream(sock.getInputStream());
|
||||
|
||||
out.write(0xFE);
|
||||
|
||||
int b;
|
||||
StringBuilder str = new StringBuilder();
|
||||
while ((b = in.read()) != -1) {
|
||||
if (b > 16 && b != 255 && b != 23 && b != 24) {
|
||||
str.append((char) b);
|
||||
}
|
||||
}
|
||||
|
||||
String[] data = str.toString().split("§");
|
||||
String serverMotd = data[0];
|
||||
int onlinePlayers = Integer.parseInt(data[1]);
|
||||
int maxPlayers = Integer.parseInt(data[2]);
|
||||
|
||||
return new PingInfoStructure(onlinePlayers, maxPlayers, serverMotd);
|
||||
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public String getHostname() {
|
||||
return node.equalsIgnoreCase("local") ? "localhost" : getNodeObject().getHostname();
|
||||
}
|
||||
|
||||
public Server setServerId(String serverId) {
|
||||
this.serverId = serverId;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Server setPlayerName(String playerName) {
|
||||
this.playerName = playerName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Server setNode(String node) {
|
||||
this.node = node;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Server setPort(int port) {
|
||||
this.port = port;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.objects;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import os.arcadiadevs.playerservers.hubcore.database.DataBase;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class ServerCache implements Runnable {
|
||||
|
||||
@Getter @Setter
|
||||
private List<Server> servers;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
final List<Server> servers;
|
||||
|
||||
try {
|
||||
servers = DataBase.getServersInfo().get();
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
servers.forEach(server -> {
|
||||
server.setCachedData(server.getData());
|
||||
server.setCachedStatus(server.getServerStatus());
|
||||
});
|
||||
|
||||
servers.sort((s1, s2) -> {
|
||||
final var p1 = s1.getServerStatus() == ServerStatus.ONLINE;
|
||||
final var p2 = s2.getServerStatus() == ServerStatus.ONLINE;
|
||||
|
||||
if (p1 && !p2) {
|
||||
return -1;
|
||||
} else if (!p1 && p2) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
|
||||
setServers(servers);
|
||||
}
|
||||
|
||||
}
|
@ -3,62 +3,59 @@ package os.arcadiadevs.playerservers.hubcore.placeholders;
|
||||
import lombok.SneakyThrows;
|
||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import os.arcadiadevs.playerservers.hubcore.database.DataBase;
|
||||
import os.arcadiadevs.playerservers.hubcore.controllers.ServersController;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
import os.arcadiadevs.playerservers.hubcore.objects.Server;
|
||||
|
||||
public class PlayerCount extends PlaceholderExpansion {
|
||||
|
||||
Plugin plugin;
|
||||
private final ServersController controller;
|
||||
|
||||
public PlayerCount(Plugin plugin){
|
||||
this.plugin = plugin;
|
||||
}
|
||||
public PlayerCount(ServersController controller) {
|
||||
this.controller = controller;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canRegister() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public boolean canRegister() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdentifier() {
|
||||
return "playerservers";
|
||||
}
|
||||
@Override
|
||||
public String getIdentifier() {
|
||||
return "playerservers";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "placeholders";
|
||||
}
|
||||
@Override
|
||||
public String getName() {
|
||||
return "placeholders";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAuthor() {
|
||||
return "OpenSource/Cuftica";
|
||||
}
|
||||
@Override
|
||||
public String getAuthor() {
|
||||
return "OpenSource/Cuftica";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getVersion() {
|
||||
return "1.0.0";
|
||||
}
|
||||
@Override
|
||||
public String getVersion() {
|
||||
return "1.0.0";
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public String onRequest(OfflinePlayer p, String params) {
|
||||
switch (params) {
|
||||
case "online":
|
||||
final var server = new Server(p.getPlayer());
|
||||
return server.getServerStatus() == ServerStatus.ONLINE ? "Online" : "Offline";
|
||||
case "serveronline":
|
||||
final var online = (int) DataBase
|
||||
.getServersInfo()
|
||||
.get()
|
||||
.stream()
|
||||
.filter(_server -> _server.getServerStatus() == ServerStatus.ONLINE)
|
||||
.count();
|
||||
@SneakyThrows
|
||||
@Override
|
||||
public String onRequest(OfflinePlayer player, String params) {
|
||||
return switch (params) {
|
||||
case "online" -> {
|
||||
final var server = controller.getServer(player.getUniqueId());
|
||||
yield server.getStatus() == ServerStatus.ONLINE ? "Online" : "Offline";
|
||||
}
|
||||
case "serveronline" -> {
|
||||
final var online = (int) controller.getServers()
|
||||
.stream()
|
||||
.filter(server -> server.getStatus() == ServerStatus.ONLINE)
|
||||
.count();
|
||||
|
||||
return String.valueOf(online);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
yield String.valueOf(online);
|
||||
}
|
||||
default -> throw new IllegalArgumentException("Invalid placeholder: " + params);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -5,82 +5,70 @@ import com.google.common.io.ByteArrayDataOutput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.PsHubCore;
|
||||
|
||||
@SuppressWarnings("UnstableApiUsage")
|
||||
public class BungeeUtil {
|
||||
|
||||
public static void connectPlayer(InventoryClickEvent event, Player player, String server) {
|
||||
if (event.getCurrentItem().getType() == XMaterial.REDSTONE_BLOCK.parseMaterial()) {
|
||||
player.sendMessage(ChatUtil.translate("&9PlayerServers> &7Oops, the server you tried to connect to is offline."));
|
||||
return;
|
||||
}
|
||||
public static void connectPlayer(Player player) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
|
||||
try {
|
||||
out.writeUTF("Connect");
|
||||
out.writeUTF(server);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
player.sendPluginMessage(PSHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
event.getWhoClicked().closeInventory();
|
||||
try {
|
||||
out.writeUTF("Connect");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
public static void stopServer(InventoryClickEvent event, Player player, String server) {
|
||||
player.sendPluginMessage(PsHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
public static void stopServer(Player player) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
|
||||
try {
|
||||
out.writeUTF("stop");
|
||||
out.writeUTF(server);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PSHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
event.getWhoClicked().closeInventory();
|
||||
try {
|
||||
out.writeUTF("stop");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PsHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
public static void deleteServer(InventoryClickEvent event, Player player, String server) {
|
||||
public static void deleteServer(Player player) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
|
||||
try {
|
||||
out.writeUTF("delete");
|
||||
out.writeUTF(server);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PSHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
event.getWhoClicked().closeInventory();
|
||||
try {
|
||||
out.writeUTF("delete");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PsHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
public static void createServer(InventoryClickEvent event, Player player, String server) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
public static void createServer(Player player) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
|
||||
try {
|
||||
out.writeUTF("create");
|
||||
out.writeUTF(server);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PSHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
event.getWhoClicked().closeInventory();
|
||||
try {
|
||||
out.writeUTF("create");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PsHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
public static void startServer(InventoryClickEvent event, Player player, String server) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
public static void startServer(Player player) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
|
||||
try {
|
||||
out.writeUTF("start");
|
||||
out.writeUTF(server);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PSHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
event.getWhoClicked().closeInventory();
|
||||
try {
|
||||
out.writeUTF("start");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
player.sendPluginMessage(PsHubCore.getInstance(), "BungeeCord", out.toByteArray());
|
||||
player.closeInventory();
|
||||
}
|
||||
|
||||
}
|
@ -1,11 +1,22 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.utils;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class ChatUtil {
|
||||
|
||||
public static String translate(String text) {
|
||||
return ChatColor.translateAlternateColorCodes('&', text);
|
||||
public static String translate(String s) {
|
||||
return ChatColor.translateAlternateColorCodes('&', s);
|
||||
}
|
||||
|
||||
public static void sendMessage(CommandSender sender, String message) {
|
||||
sender.sendMessage(translate(message));
|
||||
}
|
||||
|
||||
public static void sendMessage(CommandSender sender, String... message) {
|
||||
for (String s : message) {
|
||||
sender.sendMessage(translate(s));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,238 +0,0 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.utils;
|
||||
|
||||
import com.cryptomorin.xseries.XMaterial;
|
||||
import com.samjakob.spigui.buttons.SGButton;
|
||||
import com.samjakob.spigui.item.ItemBuilder;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import os.arcadiadevs.playerservers.hubcore.PSHubCore;
|
||||
import os.arcadiadevs.playerservers.hubcore.database.DataBase;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class GUIUtils {
|
||||
|
||||
public static void openSelector(Player player) {
|
||||
|
||||
final var PSH = PSHubCore.getInstance();
|
||||
final var menu = PSH.getSpiGUI().create(ChatUtil.translate(PSH.getConfig().getString("gui.selector.menu.name")), 5);
|
||||
|
||||
menu.setAutomaticPaginationEnabled(true);
|
||||
menu.setBlockDefaultInteractions(true);
|
||||
|
||||
final var onlineXMaterialOptional = XMaterial.matchXMaterial(PSH.getConfig().getString("gui.selector.menu.online.block"));
|
||||
final var offlineXMaterialOptional = XMaterial.matchXMaterial(PSH.getConfig().getString("gui.selector.menu.offline.block"));
|
||||
|
||||
final var onlineXMaterial = onlineXMaterialOptional.orElse(XMaterial.EMERALD_BLOCK).parseMaterial();
|
||||
final var offlineXMaterial = offlineXMaterialOptional.orElse(XMaterial.REDSTONE_BLOCK).parseMaterial();
|
||||
|
||||
new Thread(() -> {
|
||||
final var servers = PSHubCore.getInstance().getServerCache().getServers();
|
||||
|
||||
servers.forEach(server -> {
|
||||
final var itemBuilder = new ItemBuilder(server.getCachedStatus() == ServerStatus.ONLINE ? onlineXMaterial : offlineXMaterial);
|
||||
|
||||
var lore = PSH.getConfig().getStringList(server.getCachedStatus() == ServerStatus.ONLINE ? "gui.selector.menu.online.lore" : "gui.selector.menu.offline.lore");
|
||||
|
||||
lore = lore.stream()
|
||||
.map(s -> s.replaceAll("%server%", server.getPlayerName()))
|
||||
.map(s -> s.replaceAll("%status%", server.getCachedStatus() == ServerStatus.ONLINE ? "&aOnline" : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%players%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getOnline() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%maxplayers%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getMax() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%port%", server.getPort() + ""))
|
||||
.map(s -> s.replaceAll("%motd%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getMOTD() : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%node%", server.getNode()))
|
||||
.map(s -> s.replaceAll("%owner%", server.getPlayerName()))
|
||||
.map(s -> s.replaceAll("%ip%", server.getHostname()))
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
var item = itemBuilder
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString(server.getCachedStatus() == ServerStatus.ONLINE ? "gui.selector.menu.online.name" : "gui.selector.menu.offline.name")
|
||||
.replaceAll("%server%", server.getPlayerName())
|
||||
.replaceAll("%status%", server.getCachedStatus() == ServerStatus.ONLINE ? "&aOnline" : "&cOffline"))
|
||||
.replaceAll("%players%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getOnline() + "" : "0")
|
||||
.replaceAll("%maxplayers%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getMax() + "" : "0")
|
||||
.replaceAll("%port%", server.getPort() + "")
|
||||
.replaceAll("%motd%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getMOTD() : "&cOffline")
|
||||
.replaceAll("%node%", server.getNode())
|
||||
.replaceAll("%owner%", server.getPlayerName())
|
||||
.replaceAll("%ip%", server.getHostname())
|
||||
)
|
||||
.lore(lore)
|
||||
.build();
|
||||
|
||||
menu.setButton(0, menu.getInventory().firstEmpty(), new SGButton(item).withListener(listener -> BungeeUtil.connectPlayer(listener, player, server.getPlayerName())));
|
||||
});
|
||||
|
||||
Bukkit.getScheduler().runTask(PSHubCore.getInstance(), () -> player.openInventory(menu.getInventory()));
|
||||
}).start();
|
||||
}
|
||||
|
||||
public static void openMenu(Player player) {
|
||||
|
||||
final var PSH = PSHubCore.getInstance();
|
||||
|
||||
new Thread(() -> {
|
||||
if (!DataBase.containsServer(player.getUniqueId().toString())) {
|
||||
final var menu = PSH.getSpiGUI().create(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.name")), 3);
|
||||
menu.setAutomaticPaginationEnabled(false);
|
||||
menu.setBlockDefaultInteractions(true);
|
||||
|
||||
var itemCreate = new ItemBuilder(XMaterial.DIAMOND_BLOCK.parseMaterial())
|
||||
.name(PSH.getConfig().getString("gui.player-menu.menu.create.name"))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.create.lore"))
|
||||
.build();
|
||||
|
||||
menu.setButton(0, 13, new SGButton(itemCreate).withListener(listener -> BungeeUtil.createServer(listener, player, player.getDisplayName())));
|
||||
|
||||
for (int i = 0; i < 9 * 4; i++) {
|
||||
if (menu.getButton(i) == null) {
|
||||
menu.setButton(i, new SGButton(new ItemBuilder(XMaterial.GRAY_STAINED_GLASS_PANE.parseItem()).name(" ").build()));
|
||||
}
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().runTask(PSHubCore.getInstance(), () -> player.openInventory(menu.getInventory()));
|
||||
return;
|
||||
}
|
||||
|
||||
final var menu = PSH.getSpiGUI().create(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.name")), 4);
|
||||
menu.setAutomaticPaginationEnabled(false);
|
||||
menu.setBlockDefaultInteractions(true);
|
||||
|
||||
final var deleteConfirmationMenu = PSH.getSpiGUI().create(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.delete.confirmation.name")), 3);
|
||||
deleteConfirmationMenu.setAutomaticPaginationEnabled(false);
|
||||
deleteConfirmationMenu.setBlockDefaultInteractions(true);
|
||||
|
||||
final var stopConfirmationMenu = PSH.getSpiGUI().create(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.stop.confirmation.name")), 3);
|
||||
stopConfirmationMenu.setAutomaticPaginationEnabled(false);
|
||||
stopConfirmationMenu.setBlockDefaultInteractions(true);
|
||||
|
||||
final var server = PSH
|
||||
.getServerCache()
|
||||
.getServers()
|
||||
.stream()
|
||||
.filter(_server -> _server.getPlayerName().equals(player.getName()))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
if (server == null) {
|
||||
player.sendMessage(ChatUtil.translate("&9Error> &cCould not find your server!"));
|
||||
return;
|
||||
}
|
||||
|
||||
var lore = PSH.getConfig().getStringList(server.getCachedStatus() == ServerStatus.ONLINE ? "gui.player-menu.menu.info.online.lore" : "gui.player-menu.menu.info.offline.lore");
|
||||
|
||||
lore = lore.stream()
|
||||
.map(s -> s.replaceAll("%server%", server.getPlayerName()))
|
||||
.map(s -> s.replaceAll("%status%", server.getCachedStatus() == ServerStatus.ONLINE ? "&aOnline" : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%players%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getOnline() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%maxplayers%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getMax() + "" : "0"))
|
||||
.map(s -> s.replaceAll("%port%", server.getPort() + ""))
|
||||
.map(s -> s.replaceAll("%motd%", server.getCachedStatus() == ServerStatus.ONLINE ? server.getCachedData().getMOTD() : "&cOffline"))
|
||||
.map(s -> s.replaceAll("%node%", server.getNode()))
|
||||
.map(s -> s.replaceAll("%owner%", server.getPlayerName()))
|
||||
.map(s -> s.replaceAll("%ip%", server.getHostname()))
|
||||
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
|
||||
|
||||
final var itemPlayer = new ItemBuilder(XMaterial.OAK_SIGN.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString(server.getCachedStatus() == ServerStatus.ONLINE ? "gui.player-menu.menu.info.online.name" : "gui.player-menu.menu.info.offline.name")
|
||||
.replaceAll("%server%", server.getPlayerName())))
|
||||
.lore(lore)
|
||||
.build();
|
||||
|
||||
final var itemDelete = new ItemBuilder(XMaterial.BARRIER.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.delete.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.delete.lore"))
|
||||
.build();
|
||||
|
||||
final var itemDeleteQuestionYes = new ItemBuilder(XMaterial.EMERALD_BLOCK.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.delete.confirmation.accept.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.delete.confirmation.accept.lore"))
|
||||
.build();
|
||||
|
||||
final var itemDeleteQuestionNo = new ItemBuilder(XMaterial.REDSTONE_BLOCK.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.delete.confirmation.decline.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.delete.confirmation.decline.lore"))
|
||||
.build();
|
||||
|
||||
final var itemStopQuestionYes = new ItemBuilder(XMaterial.EMERALD_BLOCK.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.stop.confirmation.accept.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.stop.confirmation.accept.lore"))
|
||||
.build();
|
||||
|
||||
final var itemStopQuestionNo = new ItemBuilder(XMaterial.REDSTONE_BLOCK.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.stop.confirmation.decline.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.stop.confirmation.decline.lore"))
|
||||
.build();
|
||||
|
||||
if (server.getCachedStatus() == ServerStatus.ONLINE) {
|
||||
final var itemJoin = new ItemBuilder(XMaterial.OAK_DOOR.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.join.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.join.lore"))
|
||||
.build();
|
||||
final var itemStop = new ItemBuilder(XMaterial.REDSTONE_BLOCK.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.stop.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.stop.lore"))
|
||||
.build();
|
||||
|
||||
menu.setButton(0, 22, new SGButton(itemJoin).withListener(listener -> BungeeUtil.connectPlayer(listener, player, player.getDisplayName())));
|
||||
menu.setButton(0, 20, new SGButton(itemStop).withListener(listener -> {
|
||||
stopConfirmationMenu.setButton(0, 11, new SGButton(itemStopQuestionYes).withListener(listener2 -> {
|
||||
BungeeUtil.stopServer(listener2, player, player.getDisplayName());
|
||||
player.closeInventory();
|
||||
}));
|
||||
stopConfirmationMenu.setButton(0, 15, new SGButton(itemStopQuestionNo).withListener(listener2 -> {
|
||||
player.closeInventory();
|
||||
}));
|
||||
|
||||
for (int i = 0; i < 9 * 4; i++) {
|
||||
if (stopConfirmationMenu.getButton(i) == null) {
|
||||
stopConfirmationMenu.setButton(i, new SGButton(new ItemBuilder(XMaterial.GRAY_STAINED_GLASS_PANE.parseItem()).name(" ").build()));
|
||||
}
|
||||
}
|
||||
|
||||
player.openInventory(stopConfirmationMenu.getInventory());
|
||||
}));
|
||||
}
|
||||
|
||||
if (server.getCachedStatus() == ServerStatus.OFFLINE) {
|
||||
final var itemStart = new ItemBuilder(XMaterial.EMERALD_BLOCK.parseMaterial())
|
||||
.name(ChatUtil.translate(PSH.getConfig().getString("gui.player-menu.menu.start.name")))
|
||||
.lore(PSH.getConfig().getStringList("gui.player-menu.menu.start.lore"))
|
||||
.build();
|
||||
|
||||
menu.setButton(0, 20, new SGButton(itemStart).withListener(listener -> BungeeUtil.startServer(listener, player, player.getDisplayName())));
|
||||
}
|
||||
|
||||
menu.setButton(0, 24, new SGButton(itemDelete).withListener(listener -> {
|
||||
deleteConfirmationMenu.setButton(0, 11, new SGButton(itemDeleteQuestionYes).withListener(listener2 -> {
|
||||
BungeeUtil.deleteServer(listener2, player, player.getDisplayName());
|
||||
player.closeInventory();
|
||||
}));
|
||||
deleteConfirmationMenu.setButton(0, 15, new SGButton(itemDeleteQuestionNo).withListener(listener2 -> {
|
||||
player.closeInventory();
|
||||
}));
|
||||
|
||||
for (int i = 0; i < 9 * 4; i++) {
|
||||
if (deleteConfirmationMenu.getButton(i) == null) {
|
||||
deleteConfirmationMenu.setButton(i, new SGButton(new ItemBuilder(XMaterial.GRAY_STAINED_GLASS_PANE.parseItem()).name(" ").build()));
|
||||
}
|
||||
}
|
||||
|
||||
player.openInventory(deleteConfirmationMenu.getInventory());
|
||||
}));
|
||||
|
||||
menu.setButton(0, 4, new SGButton(itemPlayer));
|
||||
|
||||
// Fill all empty slots with glass pane
|
||||
for (int i = 0; i < 9 * 4; i++) {
|
||||
if (menu.getButton(i) == null) {
|
||||
menu.setButton(i, new SGButton(new ItemBuilder(XMaterial.GRAY_STAINED_GLASS_PANE.parseItem()).name(" ").build()));
|
||||
}
|
||||
}
|
||||
|
||||
Bukkit.getScheduler().runTask(PSHubCore.getInstance(), () -> player.openInventory(menu.getInventory()));
|
||||
}).start();
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package os.arcadiadevs.playerservers.hubcore.utils;
|
||||
|
||||
import com.cryptomorin.xseries.XMaterial;
|
||||
import com.samjakob.spigui.SGMenu;
|
||||
import com.samjakob.spigui.buttons.SGButton;
|
||||
import com.samjakob.spigui.item.ItemBuilder;
|
||||
|
||||
public class GuiUtils {
|
||||
|
||||
public static void addBorder(SGMenu menu, int rows) {
|
||||
for (int i = 0; i < 9; i++) {
|
||||
menu.setButton(
|
||||
i,
|
||||
new SGButton(new ItemBuilder(XMaterial.WHITE_STAINED_GLASS_PANE.parseItem()).build())
|
||||
);
|
||||
}
|
||||
|
||||
for (int i = 0; i < rows; i++) {
|
||||
menu.setButton(
|
||||
i * 9,
|
||||
new SGButton(new ItemBuilder(XMaterial.WHITE_STAINED_GLASS_PANE.parseItem()).build())
|
||||
);
|
||||
}
|
||||
|
||||
for (int i = 0; i < rows; i++) {
|
||||
menu.setButton(
|
||||
i * 9 + 8,
|
||||
new SGButton(new ItemBuilder(XMaterial.WHITE_STAINED_GLASS_PANE.parseItem()).build())
|
||||
);
|
||||
}
|
||||
|
||||
for (int i = (rows - 1) * 9; i < ((rows - 1) * 9) + 9; i++) {
|
||||
menu.setButton(
|
||||
i,
|
||||
new SGButton(new ItemBuilder(XMaterial.WHITE_STAINED_GLASS_PANE.parseItem()).build())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* MIT License.
|
||||
*
|
||||
* Copyright (c) 2021 MrMicky
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package os.arcadiadevs.playerservers.hubcore.utils;
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import os.arcadiadevs.playerservers.hubcore.enums.ServerStatus;
|
||||
|
||||
/**
|
||||
* Simple tool to ping a Minecraft server to get MOTD, online players and max players.
|
||||
*
|
||||
* @author MrMicky
|
||||
*/
|
||||
public class ServerPinger {
|
||||
|
||||
public static CompletableFuture<PingResult> ping(InetSocketAddress address, int timeout) {
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
try (Socket socket = new Socket()) {
|
||||
|
||||
socket.setSoTimeout(timeout);
|
||||
socket.connect(address, timeout);
|
||||
|
||||
try (DataOutputStream out = new DataOutputStream(socket.getOutputStream());
|
||||
InputStream in = socket.getInputStream();
|
||||
InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_16BE)) {
|
||||
|
||||
out.write(new byte[] {(byte) 0xFE, 0x01});
|
||||
|
||||
int packetId = in.read();
|
||||
int length = reader.read();
|
||||
|
||||
if (packetId != 0xFF) {
|
||||
return new PingResult(ServerStatus.UNKNOWN, null, null, null);
|
||||
}
|
||||
|
||||
if (length <= 0) {
|
||||
return new PingResult(ServerStatus.UNKNOWN, null, null, null);
|
||||
}
|
||||
|
||||
char[] chars = new char[length];
|
||||
|
||||
if (reader.read(chars, 0, length) != length) {
|
||||
return new PingResult(ServerStatus.UNKNOWN, null, null, null);
|
||||
}
|
||||
|
||||
String string = new String(chars);
|
||||
|
||||
if (!string.startsWith("§")) {
|
||||
return new PingResult(ServerStatus.UNKNOWN, null, null, null);
|
||||
}
|
||||
|
||||
String[] data = string.split("\000");
|
||||
|
||||
int players = Integer.parseInt(data[4]);
|
||||
int maxPlayers = Integer.parseInt(data[5]);
|
||||
|
||||
return new PingResult(ServerStatus.ONLINE, players, maxPlayers, data[3]);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
return new PingResult(ServerStatus.OFFLINE, null, null, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public record PingResult(ServerStatus status, Integer players, Integer maxPlayers, String motd) {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PingResult{players=" + this.players + ", maxPlayers=" + this.maxPlayers + '}';
|
||||
}
|
||||
}
|
||||
}
|
@ -13,6 +13,8 @@ messages:
|
||||
|
||||
gui:
|
||||
selector:
|
||||
enabled: true
|
||||
|
||||
item:
|
||||
enabled: true
|
||||
name: "&aQuick Compass"
|
||||
@ -44,6 +46,8 @@ gui:
|
||||
- '&7Ip: &c%ip%&8:&c%port%'
|
||||
|
||||
player-menu:
|
||||
enabled: true
|
||||
|
||||
item:
|
||||
enabled: true
|
||||
name: "&eMy Server"
|
||||
|
35
src/main/resources/hibernate.cfg.xml
Normal file
35
src/main/resources/hibernate.cfg.xml
Normal file
@ -0,0 +1,35 @@
|
||||
<!DOCTYPE hibernate-configuration PUBLIC
|
||||
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
|
||||
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
|
||||
|
||||
<hibernate-configuration>
|
||||
|
||||
<session-factory>
|
||||
|
||||
<!-- JDBC Database connection settings -->
|
||||
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
|
||||
<property name="connection.url">jdbc:mysql://localhost:3306/my_prod_db?useSSL=false&serverTimezone=UTC</property>
|
||||
<property name="connection.username">prod</property>
|
||||
<property name="connection.password">prod</property>
|
||||
|
||||
<!-- JDBC connection pool settings -->
|
||||
<property name="connection.pool_size">1</property>
|
||||
|
||||
<!-- Select our SQL dialect -->
|
||||
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
|
||||
|
||||
<!-- Echo the SQL to stdout -->
|
||||
<property name="show_sql">false</property>
|
||||
|
||||
<!-- Format the SQL -->
|
||||
<property name="format_sql">false</property>
|
||||
|
||||
<!-- Set the current session context -->
|
||||
<property name="current_session_context_class">thread</property>
|
||||
|
||||
<!-- Handles the entity table changes -->
|
||||
<property name="hibernate.hbm2ddl.auto">update</property>
|
||||
|
||||
</session-factory>
|
||||
|
||||
</hibernate-configuration>
|
@ -1,5 +1,5 @@
|
||||
name: PSHubCore
|
||||
main: os.arcadiadevs.playerservers.hubcore.PSHubCore
|
||||
main: os.arcadiadevs.playerservers.hubcore.PsHubCore
|
||||
version: 3-dev
|
||||
author: OpenSource
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user