Compare commits
1 Commits
0.2-pre
...
1714297ee6
| Author | SHA1 | Date | |
|---|---|---|---|
| 1714297ee6 |
48
.gitignore
vendored
48
.gitignore
vendored
@@ -1,24 +1,24 @@
|
|||||||
# Compiled class file
|
# Compiled class file
|
||||||
*.class
|
*.class
|
||||||
|
|
||||||
# Log file
|
# Log file
|
||||||
*.log
|
*.log
|
||||||
|
|
||||||
# BlueJ files
|
# BlueJ files
|
||||||
*.ctxt
|
*.ctxt
|
||||||
|
|
||||||
# Mobile Tools for Java (J2ME)
|
# Mobile Tools for Java (J2ME)
|
||||||
.mtj.tmp/
|
.mtj.tmp/
|
||||||
|
|
||||||
# Package Files #
|
# Package Files #
|
||||||
*.jar
|
*.jar
|
||||||
*.war
|
*.war
|
||||||
*.nar
|
*.nar
|
||||||
*.ear
|
*.ear
|
||||||
*.zip
|
*.zip
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
*.rar
|
*.rar
|
||||||
|
|
||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
replay_pid*
|
replay_pid*
|
||||||
|
|||||||
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"java.configuration.updateBuildConfiguration": "automatic",
|
"java.configuration.updateBuildConfiguration": "automatic",
|
||||||
"java.compile.nullAnalysis.mode": "automatic"
|
"java.compile.nullAnalysis.mode": "automatic"
|
||||||
}
|
}
|
||||||
62
README.md
62
README.md
@@ -1,30 +1,32 @@
|
|||||||
## VelocityBroadcast Reborn
|
## VelocityBroadcast Reborn
|
||||||
The new and improved version of my old popular plugin called "Velocity Broadcast". The best known and lightweight broadcasting plugin for any network to use.
|
The new and improved version of my old popular plugin called "Velocity Broadcast". The best known and lightweight broadcasting plugin for any network to use.
|
||||||
|
|
||||||
# Introduction
|
# Introduction
|
||||||
Welcome to the GitHub repo and source code for the plugin VelocityBroadcast Reborn. This is a complete rewrite of my previous VelocityBroadcast plugin. I reworked and rebuilt the plugin from scratch. Due to the fact a ton of promised features sadly did not work out correctly. The biggest complaint being permissions. Well, I did it. I was able to fix a few old grievances and even add some new features. So without further ado, the information regarding VelocityBroadcast Reborn!
|
Welcome to the GitHub repo and source code for the plugin VelocityBroadcast Reborn. This is a complete rewrite of my previous VelocityBroadcast plugin. I reworked and rebuilt the plugin from scratch. Due to the fact a ton of promised features sadly did not work out correctly. The biggest complaint being permissions. Well, I did it. I was able to fix a few old grievances and even add some new features. So without further ado, the information regarding VelocityBroadcast Reborn!
|
||||||
|
|
||||||
VelocityBroadcast Reborn is a unique and lightweight plugin that allows people with specific permission nodes/groups with permission nodes assigned to LuckPerms for Velocity to broadcast a message across the entire network. This is useful for events, maintenance announcements, and more. I do plan to add more features one day, but for now this is what we have. Light, simple, and easy to use. Please use the Issue Tracker above to report any issues or feedback about the plugin.
|
VelocityBroadcast Reborn is a unique and lightweight plugin that allows people with specific permission nodes/groups with permission nodes assigned to LuckPerms for Velocity to broadcast a message across the entire network. This is useful for events, maintenance announcements, and more. I do plan to add more features one day, but for now this is what we have. Light, simple, and easy to use. Please use the Issue Tracker above to report any issues or feedback about the plugin.
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
- The latest stable build of Velocity
|
- The latest stable build of Velocity
|
||||||
- A main hub/lobby server (Preferably running Paper, but it should work on any type of server. Including modded)
|
- The latest stable build of LuckPerms
|
||||||
- A secondary/multiple servers on the network to receive full compatibility
|
- A main hub/lobby server (Preferably running Paper, but it should work on any type of server. Including modded)
|
||||||
|
- A secondary/multiple servers on the network to receive full compatibility
|
||||||
# Setup
|
|
||||||
1. Download the latest version from Spigot or the Releases page on the right
|
# Setup
|
||||||
2. Upload the plugin file to your ***Proxy's*** plugin folder (Do not upload it to the hub server's plugin folder)
|
1. Download the latest version from Spigot or the Releases page on the right
|
||||||
3. Restart the proxy
|
2. Upload the plugin file to your ***Proxy's*** plugin folder (Do not upload it to the hub server's plugin folder)
|
||||||
4. In the console of your proxy server, run the following command(s) depending on your preferred usage. (4a for users specifically, 4b for groups)
|
3. Restart the proxy
|
||||||
4a. lpv user {username} permission set {permission node} true {context (optional)}
|
4. In the console of your proxy server, run the following command(s) depending on your preferred usage. (4a for users specifically, 4b for groups)
|
||||||
4b. lpv group {group} permission set {permission node} true {context (optional)}
|
4a. lpv user {username} permission set {permission node} true {context (optional)}
|
||||||
4c. Or you can do it in GUI mode with the command "lpv editor"
|
4b. lpv group {group} permission set {permission node} true {context (optional)}
|
||||||
5. Restart your proxy again
|
4c. Or you can do it in GUI mode with the command "lpv editor"
|
||||||
6. Now the setup is complete, enjoy!
|
5. Restart your proxy again
|
||||||
|
6. Now the setup is complete, enjoy!
|
||||||
# Commands and Permissions
|
|
||||||
- /vb - When typed on its own will show the help page - No permission needed
|
# Commands and Permissions
|
||||||
- /vb {message} - When typed and paired with a message, it will send a message across all servers on a network (Legacy Color Codes and MiniMessage compatible) - vb.broadcast
|
- /vb - When typed on its own will show the help page - No permission needed
|
||||||
- /vp prefix {new prefix} - This allows whoever has the required permission to change the prefix in front of the message broadcasted - vb.admin
|
- /vb {message} - When typed and paired with a message, it will send a message across all servers on a network (Legacy Color Codes and MiniMessage compatible) - vb.broadcast
|
||||||
- /vb reload - Allows people with the correct permission node to reload the config if it was edited manually - vb.admin
|
- /vp prefix {new prefix} - This allows whoever has the required permission to change the prefix in front of the message broadcasted - vb.admin
|
||||||
***Currently due to the limitations of Velocity, you can not run the commands while being opped. You MUST have the correct permission nodes for it to work.***
|
- /vb reload - Allows people with the correct permission node to reload the config if it was edited manually - vb.admin
|
||||||
|
|
||||||
|
***Currently due to the limitations of Velocity, you can not run the commands while being opped. You MUST have the correct permission nodes for it to work.***
|
||||||
@@ -1,54 +1,64 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<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>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.adzel.velocitybroadcast</groupId>
|
<groupId>com.adzel.velocitybroadcast</groupId>
|
||||||
<artifactId>velocitybroadcast</artifactId>
|
<artifactId>velocitybroadcast</artifactId>
|
||||||
<name>VelocityBroadcast</name>
|
<name>VelocityBroadcast</name>
|
||||||
<version>0.2-pre</version>
|
<version>0.3.6</version>
|
||||||
<description>Broadcast plugin for Minecraft Velocity proxy.</description>
|
<description>Broadcast plugin for Minecraft Velocity proxy.</description>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.10.1</version>
|
<version>3.10.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<release>17</release>
|
<release>17</release>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
<version>3.4.1</version>
|
<version>3.4.1</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>package</phase>
|
<phase>package</phase>
|
||||||
<goals>
|
<goals>
|
||||||
<goal>shade</goal>
|
<goal>shade</goal>
|
||||||
</goals>
|
</goals>
|
||||||
<configuration>
|
<configuration>
|
||||||
<minimizeJar>true</minimizeJar>
|
<minimizeJar>false</minimizeJar>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
<id>velocitypowered-repo</id>
|
<id>velocitypowered-repo</id>
|
||||||
<url>https://repo.velocitypowered.com/releases/</url>
|
<url>https://repo.velocitypowered.com/releases/</url>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
<repository>
|
||||||
<dependencies>
|
<id>central</id>
|
||||||
<dependency>
|
<url>https://repo.maven.apache.org/maven2</url>
|
||||||
<groupId>com.velocitypowered</groupId>
|
</repository>
|
||||||
<artifactId>velocity-api</artifactId>
|
</repositories>
|
||||||
<version>3.1.1</version>
|
<dependencies>
|
||||||
<scope>provided</scope>
|
<dependency>
|
||||||
</dependency>
|
<groupId>com.velocitypowered</groupId>
|
||||||
</dependencies>
|
<artifactId>velocity-api</artifactId>
|
||||||
<properties>
|
<version>3.1.1</version>
|
||||||
<maven.compiler.target>17</maven.compiler.target>
|
<scope>provided</scope>
|
||||||
<maven.compiler.source>17</maven.compiler.source>
|
</dependency>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<dependency>
|
||||||
</properties>
|
<groupId>net.luckperms</groupId>
|
||||||
</project>
|
<artifactId>api</artifactId>
|
||||||
|
<version>5.4</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
</project>
|
||||||
|
|||||||
205
pom.xml
205
pom.xml
@@ -1,82 +1,123 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>com.adzel.velocitybroadcast</groupId>
|
<groupId>com.adzel.velocitybroadcast</groupId>
|
||||||
<artifactId>velocitybroadcast</artifactId>
|
<artifactId>velocitybroadcast</artifactId>
|
||||||
<version>0.2-pre</version>
|
<version>0.3.6</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>VelocityBroadcast</name>
|
<name>VelocityBroadcast</name>
|
||||||
<description>Broadcast plugin for Minecraft Velocity proxy.</description>
|
<description>Broadcast plugin for Minecraft Velocity proxy.</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<maven.compiler.source>17</maven.compiler.source>
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
<maven.compiler.target>17</maven.compiler.target>
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
<id>velocitypowered-repo</id>
|
<id>velocitypowered-repo</id>
|
||||||
<url>https://repo.velocitypowered.com/releases/</url>
|
<url>https://repo.velocitypowered.com/releases/</url>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
<repository>
|
||||||
|
<id>central</id>
|
||||||
<dependencies>
|
<url>https://repo.maven.apache.org/maven2</url>
|
||||||
<!-- Velocity API -->
|
</repository>
|
||||||
<dependency>
|
</repositories>
|
||||||
<groupId>com.velocitypowered</groupId>
|
|
||||||
<artifactId>velocity-api</artifactId>
|
<dependencies>
|
||||||
<version>3.1.1</version>
|
<!-- Velocity API -->
|
||||||
<scope>provided</scope>
|
<dependency>
|
||||||
</dependency>
|
<groupId>com.velocitypowered</groupId>
|
||||||
|
<artifactId>velocity-api</artifactId>
|
||||||
<!-- Adventure API -->
|
<version>3.1.1</version>
|
||||||
<dependency>
|
<scope>provided</scope>
|
||||||
<groupId>net.kyori</groupId>
|
</dependency>
|
||||||
<artifactId>adventure-api</artifactId>
|
|
||||||
<version>4.15.0</version>
|
<!-- Adventure API -->
|
||||||
</dependency>
|
<dependency>
|
||||||
|
<groupId>net.kyori</groupId>
|
||||||
<!-- Adventure MiniMessage -->
|
<artifactId>adventure-api</artifactId>
|
||||||
<dependency>
|
<version>4.15.0</version>
|
||||||
<groupId>net.kyori</groupId>
|
</dependency>
|
||||||
<artifactId>adventure-text-minimessage</artifactId>
|
|
||||||
<version>4.15.0</version>
|
<!-- Adventure MiniMessage -->
|
||||||
</dependency>
|
<dependency>
|
||||||
</dependencies>
|
<groupId>net.kyori</groupId>
|
||||||
|
<artifactId>adventure-text-minimessage</artifactId>
|
||||||
<build>
|
<version>4.15.0</version>
|
||||||
<plugins>
|
</dependency>
|
||||||
<!-- Java Compiler Plugin -->
|
|
||||||
<plugin>
|
<!-- JSON Wrapper -->
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<dependency>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<groupId>org.json</groupId>
|
||||||
<version>3.10.1</version>
|
<artifactId>json</artifactId>
|
||||||
<configuration>
|
<version>20240303</version>
|
||||||
<release>17</release>
|
</dependency>
|
||||||
</configuration>
|
|
||||||
</plugin>
|
<!-- SQLite -->
|
||||||
|
<dependency>
|
||||||
<!-- Shade Plugin -->
|
<groupId>org.xerial</groupId>
|
||||||
<plugin>
|
<artifactId>sqlite-jdbc</artifactId>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<version>3.43.2.2</version>
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
</dependency>
|
||||||
<version>3.4.1</version>
|
|
||||||
<executions>
|
<!-- MySQL Connector -->
|
||||||
<execution>
|
<dependency>
|
||||||
<phase>package</phase>
|
<groupId>com.mysql</groupId>
|
||||||
<goals>
|
<artifactId>mysql-connector-j</artifactId>
|
||||||
<goal>shade</goal>
|
<version>8.4.0</version>
|
||||||
</goals>
|
</dependency>
|
||||||
<configuration>
|
|
||||||
<minimizeJar>true</minimizeJar>
|
<!-- Snake YAML -->
|
||||||
<!-- No relocations anymore -->
|
<dependency>
|
||||||
</configuration>
|
<groupId>org.yaml</groupId>
|
||||||
</execution>
|
<artifactId>snakeyaml</artifactId>
|
||||||
</executions>
|
<version>2.2</version>
|
||||||
</plugin>
|
</dependency>
|
||||||
</plugins>
|
|
||||||
</build>
|
<!-- LuckPerms API (Velocity-compatible) -->
|
||||||
</project>
|
<dependency>
|
||||||
|
<groupId>net.luckperms</groupId>
|
||||||
|
<artifactId>api</artifactId>
|
||||||
|
<version>5.4</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<!-- Java Compiler Plugin -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.10.1</version>
|
||||||
|
<configuration>
|
||||||
|
<release>17</release>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Shade Plugin -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.4.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<minimizeJar>false</minimizeJar>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
|
<!-- This is a Maven POM file for the VelocityBroadcast plugin.
|
||||||
|
It defines the project structure, dependencies, and build configuration. -->
|
||||||
@@ -1,46 +1,58 @@
|
|||||||
package com.adzel.velocitybroadcast;
|
package com.adzel.velocitybroadcast;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.velocitypowered.api.command.CommandSource;
|
import com.adzel.velocitybroadcast.util.DatabaseManager;
|
||||||
import com.velocitypowered.api.command.SimpleCommand;
|
import com.velocitypowered.api.command.CommandSource;
|
||||||
|
import com.velocitypowered.api.command.SimpleCommand;
|
||||||
import net.kyori.adventure.text.Component;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
public class BroadcastCommand implements SimpleCommand {
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
|
||||||
private final VelocityBroadcast plugin;
|
public class BroadcastCommand implements SimpleCommand {
|
||||||
|
|
||||||
public BroadcastCommand(VelocityBroadcast plugin) {
|
private final VelocityBroadcast plugin;
|
||||||
this.plugin = plugin;
|
private final DatabaseManager databaseManager;
|
||||||
}
|
private final MiniMessage mm = MiniMessage.miniMessage();
|
||||||
|
|
||||||
@Override
|
public BroadcastCommand(VelocityBroadcast plugin) {
|
||||||
public void execute(Invocation invocation) {
|
this.plugin = plugin;
|
||||||
CommandSource source = invocation.source();
|
this.databaseManager = plugin.getDatabaseManager();
|
||||||
List<String> args = List.of(invocation.arguments());
|
}
|
||||||
|
|
||||||
if (!source.hasPermission("vb.broadcast")) {
|
@Override
|
||||||
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>You don't have permission to use this command.</red>"));
|
public void execute(Invocation invocation) {
|
||||||
return;
|
CommandSource source = invocation.source();
|
||||||
}
|
List<String> args = List.of(invocation.arguments());
|
||||||
|
|
||||||
if (args.isEmpty()) {
|
if (!source.hasPermission("vb.broadcast")) {
|
||||||
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>Usage: /vb <message></red>"));
|
source.sendMessage(mm.deserialize("<red>You don't have permission to use this command.</red>"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String messageRaw = String.join(" ", args);
|
if (args.isEmpty()) {
|
||||||
String prefix = plugin.getConfigHandler().getPrefix();
|
source.sendMessage(mm.deserialize("<red>Usage: /vb <message></red>"));
|
||||||
String fullMessage = prefix + messageRaw;
|
return;
|
||||||
|
}
|
||||||
Component broadcast = MiniMessage.miniMessage().deserialize(fullMessage);
|
|
||||||
|
String messageRaw = String.join(" ", args);
|
||||||
plugin.getServer().getAllPlayers().forEach(player -> player.sendMessage(broadcast));
|
String prefix = plugin.getConfigHandler().getPrefix();
|
||||||
|
String fullMessage = prefix + messageRaw;
|
||||||
if (plugin.getConfigHandler().isDebugEnabled()) {
|
|
||||||
plugin.getLogger().info("[Broadcast] Sent: " + fullMessage);
|
Component broadcast = mm.deserialize(fullMessage);
|
||||||
}
|
plugin.getServer().getAllPlayers().forEach(player -> player.sendMessage(broadcast));
|
||||||
}
|
|
||||||
}
|
if (plugin.getConfigHandler().isDebugEnabled()) {
|
||||||
|
plugin.getLogger().info("[Broadcast] Sent: " + fullMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ Log to the database with proper sender
|
||||||
|
String sender = (source instanceof Player player) ? player.getUsername() : "Console";
|
||||||
|
String sourceServer = plugin.getServer().getBoundAddress().toString();
|
||||||
|
databaseManager.logBroadcast(sender, messageRaw, sourceServer);
|
||||||
|
|
||||||
|
// Optional feedback to source
|
||||||
|
source.sendMessage(mm.deserialize("<green>Broadcast sent.</green>"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,130 +1,172 @@
|
|||||||
package com.adzel.velocitybroadcast;
|
package com.adzel.velocitybroadcast;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedWriter;
|
||||||
import java.io.BufferedWriter;
|
import java.io.IOException;
|
||||||
import java.io.IOException;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Path;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.Map;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import org.slf4j.Logger;
|
||||||
import java.util.stream.Collectors;
|
import org.yaml.snakeyaml.DumperOptions;
|
||||||
|
import org.yaml.snakeyaml.Yaml;
|
||||||
import org.slf4j.Logger;
|
import org.yaml.snakeyaml.representer.Representer;
|
||||||
|
|
||||||
public class ConfigHandler {
|
public class ConfigHandler {
|
||||||
private final Path configPath;
|
private final Path configPath;
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
|
|
||||||
private boolean debugEnabled = false;
|
private boolean debugEnabled = false;
|
||||||
private boolean versionCheckEnabled = true;
|
private boolean versionCheckEnabled = true;
|
||||||
private String prefix = "&9&l[&3&lServer&9&l]&r ";
|
private String prefix = "&9&l[&3&lServer&9&l]&r ";
|
||||||
|
|
||||||
private static final String CURRENT_VERSION = VelocityBroadcast.PLUGIN_VERSION;
|
private String dbType = "sqlite";
|
||||||
private static final String VERSION_LINE = "# DO NOT EDIT\nPlugin Version: '" + CURRENT_VERSION + "' # Do not edit this value, as it will mess up version checking and break the plugin";
|
private String dbHost = "localhost";
|
||||||
|
private int dbPort = 3306;
|
||||||
public ConfigHandler(Path configPath, Logger logger) {
|
private String dbName = "velocitybroadcast";
|
||||||
this.configPath = configPath;
|
private String dbUser = "vb_user";
|
||||||
this.logger = logger;
|
private String dbPassword = "securepassword";
|
||||||
}
|
|
||||||
|
private static final String CURRENT_VERSION = VelocityBroadcast.PLUGIN_VERSION;
|
||||||
public void load() {
|
private static final String VERSION_LINE = "# DO NOT EDIT\nPlugin Version: '" + CURRENT_VERSION + "' # Do not edit this value, as it will mess up version checking and break the plugin";
|
||||||
try {
|
|
||||||
Files.createDirectories(configPath.getParent());
|
private final Yaml yaml;
|
||||||
|
|
||||||
boolean shouldSave = false;
|
public ConfigHandler(Path configPath, Logger logger) {
|
||||||
|
this.configPath = configPath;
|
||||||
if (!Files.exists(configPath)) {
|
this.logger = logger;
|
||||||
save();
|
|
||||||
return;
|
DumperOptions options = new DumperOptions();
|
||||||
}
|
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||||
|
options.setIndent(2);
|
||||||
List<String> lines = Files.readAllLines(configPath);
|
options.setPrettyFlow(true);
|
||||||
String fileVersion = null;
|
|
||||||
|
Representer representer = new Representer(options);
|
||||||
for (String line : lines) {
|
representer.getPropertyUtils().setSkipMissingProperties(true);
|
||||||
if (line.trim().startsWith("Plugin Version:")) {
|
|
||||||
fileVersion = line.replaceAll(".*'(.*?)'.*", "$1").trim();
|
yaml = new Yaml(representer, options);
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
}
|
@SuppressWarnings("unchecked")
|
||||||
|
public void load() {
|
||||||
if (fileVersion == null || !fileVersion.equals(CURRENT_VERSION)) {
|
try {
|
||||||
shouldSave = true;
|
Files.createDirectories(configPath.getParent());
|
||||||
}
|
|
||||||
|
boolean shouldSave = false;
|
||||||
try (BufferedReader reader = Files.newBufferedReader(configPath)) {
|
|
||||||
Map<String, String> configMap = reader.lines()
|
if (!Files.exists(configPath)) {
|
||||||
.filter(line -> line.contains(":") && !line.trim().startsWith("#"))
|
save();
|
||||||
.map(line -> line.replaceAll("#.*", "").split(":", 2))
|
return;
|
||||||
.collect(Collectors.toMap(
|
}
|
||||||
a -> a[0].trim(),
|
|
||||||
a -> a[1].trim().replaceAll("^['\"]|['\"]$", ""),
|
String fileVersion = Files.readAllLines(configPath).stream()
|
||||||
(a, b) -> b,
|
.filter(line -> line.startsWith("Plugin Version:"))
|
||||||
LinkedHashMap::new
|
.map(line -> line.replaceAll(".*'(.*?)'.*", "$1").trim())
|
||||||
));
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
debugEnabled = Boolean.parseBoolean(configMap.getOrDefault("debug-messages-enabled", "false"));
|
|
||||||
versionCheckEnabled = Boolean.parseBoolean(configMap.getOrDefault("version-check-enabled", "true"));
|
if (fileVersion == null || !fileVersion.equals(CURRENT_VERSION)) {
|
||||||
prefix = configMap.getOrDefault("prefix", "&9&l[&3&lServer&9&l]&r ");
|
shouldSave = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldSave) {
|
Map<String, Object> root = yaml.load(Files.newBufferedReader(configPath));
|
||||||
save(); // Update config with new version and preserve user values
|
if (root == null) root = new LinkedHashMap<>();
|
||||||
}
|
|
||||||
|
Map<String, Object> general = (Map<String, Object>) root.getOrDefault("general", new LinkedHashMap<>());
|
||||||
} catch (IOException e) {
|
debugEnabled = Boolean.parseBoolean(String.valueOf(general.getOrDefault("debug-messages-enabled", "false")));
|
||||||
logger.error("Failed to load VelocityBroadcast config!", e);
|
versionCheckEnabled = Boolean.parseBoolean(String.valueOf(general.getOrDefault("version-check-enabled", "true")));
|
||||||
}
|
prefix = String.valueOf(general.getOrDefault("prefix", "&9&l[&3&lServer&9&l]&r "));
|
||||||
}
|
|
||||||
|
Map<String, Object> database = (Map<String, Object>) root.getOrDefault("database", new LinkedHashMap<>());
|
||||||
public void save() {
|
dbType = String.valueOf(database.getOrDefault("type", "sqlite"));
|
||||||
try {
|
dbHost = String.valueOf(database.getOrDefault("host", "localhost"));
|
||||||
Files.createDirectories(configPath.getParent());
|
dbPort = Integer.parseInt(String.valueOf(database.getOrDefault("port", "3306")));
|
||||||
|
dbName = String.valueOf(database.getOrDefault("name", "velocitybroadcast"));
|
||||||
String editableSection = "";
|
dbUser = String.valueOf(database.getOrDefault("user", "vb_user"));
|
||||||
if (Files.exists(configPath)) {
|
dbPassword = String.valueOf(database.getOrDefault("password", "securepassword"));
|
||||||
editableSection = Files.readAllLines(configPath).stream()
|
|
||||||
.dropWhile(line -> !line.trim().equalsIgnoreCase("# ONLY EDIT BELOW THIS LINE"))
|
if (shouldSave) {
|
||||||
.skip(1)
|
save();
|
||||||
.collect(Collectors.joining("\n"));
|
}
|
||||||
}
|
|
||||||
|
} catch (IOException e) {
|
||||||
try (BufferedWriter writer = Files.newBufferedWriter(configPath)) {
|
logger.error("Failed to load VelocityBroadcast config!", e);
|
||||||
writer.write(VERSION_LINE + "\n\n");
|
}
|
||||||
writer.write("# ONLY EDIT BELOW THIS LINE\n");
|
}
|
||||||
|
|
||||||
if (!editableSection.isEmpty()) {
|
public void save() {
|
||||||
writer.write(editableSection + "\n");
|
try {
|
||||||
} else {
|
Files.createDirectories(configPath.getParent());
|
||||||
writer.write("debug-messages-enabled: false # Enables/disables debug messages (Default: false)\n");
|
|
||||||
writer.write("version-check-enabled: true # Toggles version update messages for admins (Default: true)\n");
|
Map<String, Object> general = new LinkedHashMap<>();
|
||||||
writer.write("prefix: '&9&l[&3&lServer&9&l]&r ' # The prefix for broadcasts and messages\n");
|
general.put("debug-messages-enabled", debugEnabled);
|
||||||
}
|
general.put("version-check-enabled", versionCheckEnabled);
|
||||||
}
|
general.put("prefix", prefix);
|
||||||
} catch (IOException e) {
|
|
||||||
logger.error("Failed to save VelocityBroadcast config!", e);
|
Map<String, Object> database = new LinkedHashMap<>();
|
||||||
}
|
database.put("type", dbType);
|
||||||
}
|
database.put("host", dbHost);
|
||||||
|
database.put("port", dbPort);
|
||||||
public void reload() {
|
database.put("name", dbName);
|
||||||
load();
|
database.put("user", dbUser);
|
||||||
}
|
database.put("password", dbPassword);
|
||||||
|
|
||||||
public boolean isDebugEnabled() {
|
Map<String, Object> root = new LinkedHashMap<>();
|
||||||
return debugEnabled;
|
root.put("general", general);
|
||||||
}
|
root.put("database", database);
|
||||||
|
|
||||||
public boolean isVersionCheckEnabled() {
|
try (BufferedWriter writer = Files.newBufferedWriter(configPath)) {
|
||||||
return versionCheckEnabled;
|
writer.write(VERSION_LINE + "\n\n");
|
||||||
}
|
yaml.dump(root, writer);
|
||||||
|
}
|
||||||
public String getPrefix() {
|
|
||||||
return prefix;
|
} catch (IOException e) {
|
||||||
}
|
logger.error("Failed to save VelocityBroadcast config!", e);
|
||||||
|
}
|
||||||
public void setPrefix(String newPrefix) {
|
}
|
||||||
this.prefix = newPrefix;
|
|
||||||
save();
|
public void reload() {
|
||||||
}
|
load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDebugEnabled() {
|
||||||
|
return debugEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isVersionCheckEnabled() {
|
||||||
|
return versionCheckEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrefix() {
|
||||||
|
return prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrefix(String newPrefix) {
|
||||||
|
this.prefix = newPrefix;
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDbType() {
|
||||||
|
return dbType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDbHost() {
|
||||||
|
return dbHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDbPort() {
|
||||||
|
return dbPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDbName() {
|
||||||
|
return dbName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDbUser() {
|
||||||
|
return dbUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDbPassword() {
|
||||||
|
return dbPassword;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
50
src/main/java/com/adzel/velocitybroadcast/LoginListener.java
Normal file
50
src/main/java/com/adzel/velocitybroadcast/LoginListener.java
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
package com.adzel.velocitybroadcast;
|
||||||
|
|
||||||
|
import com.adzel.velocitybroadcast.util.DatabaseManager;
|
||||||
|
import com.adzel.velocitybroadcast.util.UpdateChecker;
|
||||||
|
import com.velocitypowered.api.event.Subscribe;
|
||||||
|
import com.velocitypowered.api.event.connection.PostLoginEvent;
|
||||||
|
import com.velocitypowered.api.proxy.Player;
|
||||||
|
import com.velocitypowered.api.proxy.ProxyServer;
|
||||||
|
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
|
||||||
|
public class LoginListener {
|
||||||
|
private final ProxyServer server;
|
||||||
|
private final String currentVersion;
|
||||||
|
private final UpdateChecker updateChecker;
|
||||||
|
private final DatabaseManager databaseManager;
|
||||||
|
|
||||||
|
private static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage();
|
||||||
|
|
||||||
|
public LoginListener(ProxyServer server, String currentVersion, UpdateChecker updateChecker, DatabaseManager databaseManager) {
|
||||||
|
this.server = server;
|
||||||
|
this.currentVersion = currentVersion;
|
||||||
|
this.updateChecker = updateChecker;
|
||||||
|
this.databaseManager = databaseManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onPlayerJoin(PostLoginEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
if (player.hasPermission("vb.admin")) {
|
||||||
|
// ✅ Log admin join to DB
|
||||||
|
String serverName = server.getBoundAddress().toString(); // Optional
|
||||||
|
databaseManager.logAdminJoin(player.getUsername(), serverName);
|
||||||
|
|
||||||
|
// ✅ Notify if update is available
|
||||||
|
updateChecker.checkForUpdate().thenAccept(latest -> {
|
||||||
|
if (latest != null && !latest.equalsIgnoreCase(currentVersion)) {
|
||||||
|
Component message = MINI_MESSAGE.deserialize(
|
||||||
|
"<bold><gold>[VelocityBroadcast]</gold></bold> " +
|
||||||
|
"<gradient:yellow:red>A new version is available: </gradient:yellow:red>" +
|
||||||
|
"<bold><green>" + latest + "</green></bold> " +
|
||||||
|
"<gray>(You are on <red>" + currentVersion + "</red>)</gray>"
|
||||||
|
);
|
||||||
|
player.sendMessage(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,44 +1,44 @@
|
|||||||
package com.adzel.velocitybroadcast;
|
package com.adzel.velocitybroadcast;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.velocitypowered.api.command.CommandSource;
|
import com.velocitypowered.api.command.CommandSource;
|
||||||
import com.velocitypowered.api.command.SimpleCommand;
|
import com.velocitypowered.api.command.SimpleCommand;
|
||||||
|
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
|
||||||
public class PrefixCommand implements SimpleCommand {
|
public class PrefixCommand implements SimpleCommand {
|
||||||
|
|
||||||
private final VelocityBroadcast plugin;
|
private final VelocityBroadcast plugin;
|
||||||
|
|
||||||
public PrefixCommand(VelocityBroadcast plugin) {
|
public PrefixCommand(VelocityBroadcast plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Invocation invocation) {
|
public void execute(Invocation invocation) {
|
||||||
CommandSource source = invocation.source();
|
CommandSource source = invocation.source();
|
||||||
List<String> args = List.of(invocation.arguments());
|
List<String> args = List.of(invocation.arguments());
|
||||||
|
|
||||||
if (!source.hasPermission("vb.admin")) {
|
if (!source.hasPermission("vb.admin")) {
|
||||||
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>You don't have permission to change the broadcast prefix.</red>"));
|
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>You don't have permission to change the broadcast prefix.</red>"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.isEmpty()) {
|
if (args.isEmpty()) {
|
||||||
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>Usage: /vb prefix <newPrefix></red>"));
|
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>Usage: /vb prefix <newPrefix></red>"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String newPrefix = String.join(" ", args);
|
String newPrefix = String.join(" ", args);
|
||||||
plugin.getConfigHandler().setPrefix(newPrefix);
|
plugin.getConfigHandler().setPrefix(newPrefix);
|
||||||
|
|
||||||
source.sendMessage(MiniMessage.miniMessage().deserialize(
|
source.sendMessage(MiniMessage.miniMessage().deserialize(
|
||||||
"<green>Broadcast prefix updated to:</green> <gray>" + newPrefix + "</gray>"
|
"<green>Broadcast prefix updated to:</green> <gray>" + newPrefix + "</gray>"
|
||||||
));
|
));
|
||||||
|
|
||||||
if (plugin.getConfigHandler().isDebugEnabled()) {
|
if (plugin.getConfigHandler().isDebugEnabled()) {
|
||||||
plugin.getLogger().info("[Prefix] Updated prefix to: " + newPrefix);
|
plugin.getLogger().info("[Prefix] Updated prefix to: " + newPrefix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,33 @@
|
|||||||
package com.adzel.velocitybroadcast;
|
package com.adzel.velocitybroadcast;
|
||||||
|
|
||||||
import com.velocitypowered.api.command.CommandSource;
|
import com.velocitypowered.api.command.CommandSource;
|
||||||
import com.velocitypowered.api.command.SimpleCommand;
|
import com.velocitypowered.api.command.SimpleCommand;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ReloadCommand implements SimpleCommand {
|
public class ReloadCommand implements SimpleCommand {
|
||||||
|
|
||||||
private final VelocityBroadcast plugin;
|
private final VelocityBroadcast plugin;
|
||||||
|
|
||||||
public ReloadCommand(VelocityBroadcast plugin) {
|
public ReloadCommand(VelocityBroadcast plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Invocation invocation) {
|
public void execute(Invocation invocation) {
|
||||||
CommandSource source = invocation.source();
|
CommandSource source = invocation.source();
|
||||||
|
|
||||||
if (!source.hasPermission("vb.admin")) {
|
if (!source.hasPermission("vb.admin")) {
|
||||||
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>You don't have permission to reload the config.</red>"));
|
source.sendMessage(MiniMessage.miniMessage().deserialize("<red>You don't have permission to reload the config.</red>"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.getConfigHandler().reload();
|
plugin.getConfigHandler().reload();
|
||||||
source.sendMessage(MiniMessage.miniMessage().deserialize("<green>VelocityBroadcast config reloaded.</green>"));
|
source.sendMessage(MiniMessage.miniMessage().deserialize("<green>VelocityBroadcast config reloaded.</green>"));
|
||||||
|
|
||||||
if (plugin.getConfigHandler().isDebugEnabled()) {
|
if (plugin.getConfigHandler().isDebugEnabled()) {
|
||||||
plugin.getLogger().info("[Reload] Config reloaded by " + source.toString());
|
plugin.getLogger().info("[Reload] Config reloaded by " + source.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
63
src/main/java/com/adzel/velocitybroadcast/UpdateChecker.java
Normal file
63
src/main/java/com/adzel/velocitybroadcast/UpdateChecker.java
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
package com.adzel.velocitybroadcast.util;
|
||||||
|
|
||||||
|
import com.velocitypowered.api.proxy.ProxyServer;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import com.velocitypowered.api.proxy.Player;
|
||||||
|
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.json.JSONTokener;
|
||||||
|
|
||||||
|
public class UpdateChecker {
|
||||||
|
private static final String ENDPOINT = "https://git.adzeldevelops.site/api/v1/repos/Adzel/VelocityBroadcast-Reborn/releases/latest";
|
||||||
|
private final String currentVersion;
|
||||||
|
private final Logger logger;
|
||||||
|
|
||||||
|
public UpdateChecker(String currentVersion, Logger logger) {
|
||||||
|
this.currentVersion = currentVersion;
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<String> checkForUpdate() {
|
||||||
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
|
try {
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) new URL(ENDPOINT).openConnection();
|
||||||
|
connection.setRequestProperty("Accept", "application/json");
|
||||||
|
connection.setConnectTimeout(3000);
|
||||||
|
connection.setReadTimeout(3000);
|
||||||
|
|
||||||
|
try (InputStreamReader reader = new InputStreamReader(connection.getInputStream())) {
|
||||||
|
JSONObject json = new JSONObject(new JSONTokener(reader));
|
||||||
|
String latestVersion = json.getString("tag_name").trim();
|
||||||
|
|
||||||
|
if (!latestVersion.equalsIgnoreCase(currentVersion)) {
|
||||||
|
logger.info("[VelocityBroadcast] Update available: " + latestVersion + " (you are on " + currentVersion + ")");
|
||||||
|
return latestVersion;
|
||||||
|
} else {
|
||||||
|
logger.info("[VelocityBroadcast] You are running the latest version (" + currentVersion + ").");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.warning("[VelocityBroadcast] Failed to check for updates: " + e.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyPlayerIfOutdated(ProxyServer server, String latestVersion) {
|
||||||
|
if (latestVersion != null && !latestVersion.equalsIgnoreCase(currentVersion)) {
|
||||||
|
String message = String.format("[VelocityBroadcast] A new version (%s) is available! You are running %s.", latestVersion, currentVersion);
|
||||||
|
Component component = Component.text(message);
|
||||||
|
for (Player player : server.getAllPlayers()) {
|
||||||
|
if (player.hasPermission("vb.admin")) {
|
||||||
|
player.sendMessage(component);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,116 +1,143 @@
|
|||||||
package com.adzel.velocitybroadcast;
|
package com.adzel.velocitybroadcast;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.velocitypowered.api.command.CommandSource;
|
import com.adzel.velocitybroadcast.util.DatabaseManager;
|
||||||
import com.velocitypowered.api.command.SimpleCommand;
|
import com.velocitypowered.api.command.CommandSource;
|
||||||
|
import com.velocitypowered.api.command.SimpleCommand;
|
||||||
import net.kyori.adventure.text.Component;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
public class VBCommand implements SimpleCommand {
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
|
|
||||||
private final VelocityBroadcast plugin;
|
public class VBCommand implements SimpleCommand {
|
||||||
private final MiniMessage mm = MiniMessage.miniMessage();
|
|
||||||
|
private final VelocityBroadcast plugin;
|
||||||
public VBCommand(VelocityBroadcast plugin) {
|
private final DatabaseManager databaseManager;
|
||||||
this.plugin = plugin;
|
private final MiniMessage mm = MiniMessage.miniMessage();
|
||||||
}
|
|
||||||
|
public VBCommand(VelocityBroadcast plugin) {
|
||||||
@Override
|
this.plugin = plugin;
|
||||||
public void execute(Invocation invocation) {
|
this.databaseManager = plugin.getDatabaseManager();
|
||||||
CommandSource source = invocation.source();
|
}
|
||||||
List<String> args = List.of(invocation.arguments());
|
|
||||||
|
@Override
|
||||||
if (args.isEmpty() || args.get(0).equalsIgnoreCase("help")) {
|
public void execute(Invocation invocation) {
|
||||||
source.sendMessage(parseFormatted("<gold><bold>VelocityBroadcast Commands:</bold></gold>"));
|
CommandSource source = invocation.source();
|
||||||
source.sendMessage(parseFormatted("<yellow>/vb <message></yellow> <gray>- Broadcast a message to all players</gray>"));
|
List<String> args = List.of(invocation.arguments());
|
||||||
|
|
||||||
if (source.hasPermission("vb.admin")) {
|
String fullCommand = "/vb" + (args.isEmpty() ? "" : " " + String.join(" ", args));
|
||||||
source.sendMessage(parseFormatted("<yellow>/vb prefix <newPrefix></yellow> <gray>- Change the broadcast prefix</gray>"));
|
String username = (source instanceof Player) ? ((Player) source).getUsername() : "Console";
|
||||||
source.sendMessage(parseFormatted("<yellow>/vb reload</yellow> <gray>- Reload the plugin config</gray>"));
|
|
||||||
}
|
boolean success = true;
|
||||||
return;
|
|
||||||
}
|
try {
|
||||||
|
if (args.isEmpty() || args.get(0).equalsIgnoreCase("help")) {
|
||||||
String sub = args.get(0).toLowerCase();
|
source.sendMessage(parseFormatted("<gold><bold>VelocityBroadcast Commands:</bold></gold>"));
|
||||||
List<String> subArgs = args.subList(1, args.size());
|
source.sendMessage(parseFormatted("<yellow>/vb <message></yellow> <gray>- Broadcast a message to all players</gray>"));
|
||||||
|
|
||||||
switch (sub) {
|
if (source.hasPermission("vb.admin")) {
|
||||||
case "prefix":
|
source.sendMessage(parseFormatted("<yellow>/vb prefix <newPrefix></yellow> <gray>- Change the broadcast prefix</gray>"));
|
||||||
if (!source.hasPermission("vb.admin")) {
|
source.sendMessage(parseFormatted("<yellow>/vb reload</yellow> <gray>- Reload the plugin config</gray>"));
|
||||||
source.sendMessage(parseFormatted("<red>You don't have permission to change the broadcast prefix.</red>"));
|
}
|
||||||
return;
|
|
||||||
}
|
success = false;
|
||||||
|
return;
|
||||||
if (subArgs.isEmpty()) {
|
}
|
||||||
source.sendMessage(parseFormatted("<red>Usage: /vb prefix <newPrefix></red>"));
|
|
||||||
return;
|
String sub = args.get(0).toLowerCase();
|
||||||
}
|
List<String> subArgs = args.subList(1, args.size());
|
||||||
|
|
||||||
String newPrefix = String.join(" ", subArgs);
|
switch (sub) {
|
||||||
plugin.getConfigHandler().setPrefix(newPrefix);
|
case "prefix" -> {
|
||||||
source.sendMessage(parseFormatted("<green>Prefix updated to:</green> <gray>" + newPrefix + "</gray>"));
|
if (!source.hasPermission("vb.admin")) {
|
||||||
if (plugin.getConfigHandler().isDebugEnabled()) {
|
source.sendMessage(parseFormatted("<red>You don't have permission to change the broadcast prefix.</red>"));
|
||||||
plugin.getLogger().info("[Prefix] Updated prefix to: " + newPrefix);
|
success = false;
|
||||||
}
|
return;
|
||||||
break;
|
}
|
||||||
|
|
||||||
case "reload":
|
if (subArgs.isEmpty()) {
|
||||||
if (!source.hasPermission("vb.admin")) {
|
source.sendMessage(parseFormatted("<red>Usage: /vb prefix <newPrefix></red>"));
|
||||||
source.sendMessage(parseFormatted("<red>You don't have permission to reload the config.</red>"));
|
success = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.getConfigHandler().reload();
|
String newPrefix = String.join(" ", subArgs);
|
||||||
source.sendMessage(parseFormatted("<green>VelocityBroadcast config reloaded.</green>"));
|
plugin.getConfigHandler().setPrefix(newPrefix);
|
||||||
if (plugin.getConfigHandler().isDebugEnabled()) {
|
source.sendMessage(parseFormatted("<green>Prefix updated to:</green> <gray>" + newPrefix + "</gray>"));
|
||||||
plugin.getLogger().info("[Reload] Config reloaded by " + source.toString());
|
|
||||||
}
|
if (plugin.getConfigHandler().isDebugEnabled()) {
|
||||||
break;
|
plugin.getLogger().info("[Prefix] Updated prefix to: " + newPrefix);
|
||||||
|
}
|
||||||
default:
|
}
|
||||||
// Treat as broadcast message
|
|
||||||
if (!source.hasPermission("vb.broadcast")) {
|
case "reload" -> {
|
||||||
source.sendMessage(parseFormatted("<red>You don't have permission to broadcast.</red>"));
|
if (!source.hasPermission("vb.admin")) {
|
||||||
return;
|
source.sendMessage(parseFormatted("<red>You don't have permission to reload the config.</red>"));
|
||||||
}
|
success = false;
|
||||||
|
return;
|
||||||
String fullMessage = plugin.getConfigHandler().getPrefix() + String.join(" ", args);
|
}
|
||||||
Component broadcast = parseFormatted(fullMessage);
|
|
||||||
plugin.getServer().getAllPlayers().forEach(p -> p.sendMessage(broadcast));
|
plugin.getConfigHandler().reload();
|
||||||
|
source.sendMessage(parseFormatted("<green>VelocityBroadcast config reloaded.</green>"));
|
||||||
if (plugin.getConfigHandler().isDebugEnabled()) {
|
|
||||||
plugin.getLogger().info("[Broadcast] Sent: " + fullMessage);
|
if (plugin.getConfigHandler().isDebugEnabled()) {
|
||||||
}
|
plugin.getLogger().info("[Reload] Config reloaded by " + source.toString());
|
||||||
break;
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
default -> {
|
||||||
private Component parseFormatted(String input) {
|
// Treat as broadcast message
|
||||||
String mini = input
|
if (!source.hasPermission("vb.broadcast")) {
|
||||||
.replace("&0", "<black>")
|
source.sendMessage(parseFormatted("<red>You don't have permission to broadcast.</red>"));
|
||||||
.replace("&1", "<dark_blue>")
|
success = false;
|
||||||
.replace("&2", "<dark_green>")
|
return;
|
||||||
.replace("&3", "<dark_aqua>")
|
}
|
||||||
.replace("&4", "<dark_red>")
|
|
||||||
.replace("&5", "<dark_purple>")
|
String fullMessage = plugin.getConfigHandler().getPrefix() + String.join(" ", args);
|
||||||
.replace("&6", "<gold>")
|
Component broadcast = parseFormatted(fullMessage);
|
||||||
.replace("&7", "<gray>")
|
|
||||||
.replace("&8", "<dark_gray>")
|
plugin.getServer().getAllPlayers().forEach(p -> p.sendMessage(broadcast));
|
||||||
.replace("&9", "<blue>")
|
|
||||||
.replace("&a", "<green>")
|
if (plugin.getConfigHandler().isDebugEnabled()) {
|
||||||
.replace("&b", "<aqua>")
|
plugin.getLogger().info("[Broadcast] Sent: " + fullMessage);
|
||||||
.replace("&c", "<red>")
|
}
|
||||||
.replace("&d", "<light_purple>")
|
}
|
||||||
.replace("&e", "<yellow>")
|
}
|
||||||
.replace("&f", "<white>")
|
} catch (Exception e) {
|
||||||
.replace("&l", "<bold>")
|
plugin.getLogger().error("Error executing /vb command", e);
|
||||||
.replace("&n", "<underlined>")
|
source.sendMessage(parseFormatted("<red>An error occurred while executing the command.</red>"));
|
||||||
.replace("&o", "<italic>")
|
success = false;
|
||||||
.replace("&m", "<strikethrough>")
|
} finally {
|
||||||
.replace("&r", "<reset>");
|
// ✅ Log the command usage
|
||||||
|
databaseManager.logCommand(username, fullCommand, success);
|
||||||
return mm.deserialize(mini);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private Component parseFormatted(String input) {
|
||||||
|
String mini = input
|
||||||
|
.replace("&0", "<black>")
|
||||||
|
.replace("&1", "<dark_blue>")
|
||||||
|
.replace("&2", "<dark_green>")
|
||||||
|
.replace("&3", "<dark_aqua>")
|
||||||
|
.replace("&4", "<dark_red>")
|
||||||
|
.replace("&5", "<dark_purple>")
|
||||||
|
.replace("&6", "<gold>")
|
||||||
|
.replace("&7", "<gray>")
|
||||||
|
.replace("&8", "<dark_gray>")
|
||||||
|
.replace("&9", "<blue>")
|
||||||
|
.replace("&a", "<green>")
|
||||||
|
.replace("&b", "<aqua>")
|
||||||
|
.replace("&c", "<red>")
|
||||||
|
.replace("&d", "<light_purple>")
|
||||||
|
.replace("&e", "<yellow>")
|
||||||
|
.replace("&f", "<white>")
|
||||||
|
.replace("&l", "<bold>")
|
||||||
|
.replace("&n", "<underlined>")
|
||||||
|
.replace("&o", "<italic>")
|
||||||
|
.replace("&m", "<strikethrough>")
|
||||||
|
.replace("&r", "<reset>");
|
||||||
|
|
||||||
|
return mm.deserialize(mini);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,81 +1,123 @@
|
|||||||
package com.adzel.velocitybroadcast;
|
package com.adzel.velocitybroadcast;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.adzel.velocitybroadcast.util.DatabaseManager;
|
||||||
import com.velocitypowered.api.event.PostOrder;
|
import com.adzel.velocitybroadcast.util.UpdateChecker;
|
||||||
import com.velocitypowered.api.event.Subscribe;
|
import com.google.inject.Inject;
|
||||||
import com.velocitypowered.api.event.connection.LoginEvent;
|
import com.velocitypowered.api.event.PostOrder;
|
||||||
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
import com.velocitypowered.api.event.Subscribe;
|
||||||
import com.velocitypowered.api.plugin.Plugin;
|
import com.velocitypowered.api.event.connection.LoginEvent;
|
||||||
import com.velocitypowered.api.plugin.annotation.DataDirectory;
|
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
||||||
import com.velocitypowered.api.proxy.ProxyServer;
|
import com.velocitypowered.api.plugin.Plugin;
|
||||||
|
import com.velocitypowered.api.plugin.annotation.DataDirectory;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import com.velocitypowered.api.proxy.ProxyServer;
|
||||||
|
|
||||||
@Plugin(
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
id = "velocitybroadcast",
|
import net.luckperms.api.LuckPerms;
|
||||||
name = "VelocityBroadcast",
|
import net.luckperms.api.LuckPermsProvider;
|
||||||
version = "0.2-pre",
|
|
||||||
description = "A proxy-wide broadcast plugin for Velocity.",
|
@Plugin(
|
||||||
authors = {"Adzel"}
|
id = "velocitybroadcast",
|
||||||
)
|
name = "VelocityBroadcast",
|
||||||
public class VelocityBroadcast {
|
version = "0.3.6",
|
||||||
|
description = "A proxy-wide broadcast plugin for Velocity.",
|
||||||
public static final String PLUGIN_VERSION = "0.2-pre";
|
authors = {"Adzel"}
|
||||||
public static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage();
|
)
|
||||||
|
public class VelocityBroadcast {
|
||||||
private final ProxyServer server;
|
|
||||||
private final Logger logger;
|
public static final String PLUGIN_VERSION = "0.3.6";
|
||||||
private final Path dataDirectory;
|
public static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage();
|
||||||
private ConfigHandler config;
|
|
||||||
|
private final ProxyServer server;
|
||||||
@Inject
|
private final Logger logger;
|
||||||
public VelocityBroadcast(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) {
|
private final Path dataDirectory;
|
||||||
this.server = server;
|
|
||||||
this.logger = logger;
|
private ConfigHandler config;
|
||||||
this.dataDirectory = dataDirectory;
|
private DatabaseManager databaseManager;
|
||||||
}
|
private LuckPerms luckPerms;
|
||||||
|
|
||||||
@Subscribe(order = PostOrder.EARLY)
|
@Inject
|
||||||
public void onProxyInitialization(ProxyInitializeEvent event) {
|
public VelocityBroadcast(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) {
|
||||||
// Load config
|
this.server = server;
|
||||||
this.config = new ConfigHandler(dataDirectory.resolve("config.yml"), logger);
|
this.logger = logger;
|
||||||
config.load();
|
this.dataDirectory = dataDirectory;
|
||||||
|
}
|
||||||
if (config.isDebugEnabled()) {
|
|
||||||
logger.info("[VelocityBroadcast] Debug mode is enabled.");
|
@Subscribe(order = PostOrder.EARLY)
|
||||||
}
|
public void onProxyInitialization(ProxyInitializeEvent event) {
|
||||||
|
// Load config
|
||||||
// Register the root /vb command handler
|
this.config = new ConfigHandler(dataDirectory.resolve("config.yml"), logger);
|
||||||
server.getCommandManager().register(
|
config.load();
|
||||||
server.getCommandManager().metaBuilder("vb").plugin(this).build(),
|
|
||||||
new VBCommand(this)
|
if (config.isDebugEnabled()) {
|
||||||
);
|
logger.info("[VelocityBroadcast] Debug mode is enabled.");
|
||||||
|
}
|
||||||
logger.info("[VelocityBroadcast] Loaded VelocityBroadcast v" + PLUGIN_VERSION);
|
|
||||||
}
|
// Initialize LuckPerms
|
||||||
|
try {
|
||||||
@Subscribe
|
this.luckPerms = LuckPermsProvider.get();
|
||||||
public void onLogin(LoginEvent event) {
|
logger.info("[VelocityBroadcast] Successfully hooked into LuckPerms.");
|
||||||
if (event.getPlayer().hasPermission("vb.admin") && config.isVersionCheckEnabled()) {
|
} catch (IllegalStateException e) {
|
||||||
event.getPlayer().sendMessage(
|
logger.error("[VelocityBroadcast] LuckPerms is not loaded! This plugin requires LuckPerms.");
|
||||||
MINI_MESSAGE.deserialize("<yellow>[VelocityBroadcast] You're running version " + PLUGIN_VERSION + ".</yellow>")
|
return; // Prevent plugin from loading if LP is not available
|
||||||
);
|
}
|
||||||
}
|
|
||||||
}
|
// Initialize database manager
|
||||||
|
java.util.logging.Logger jdkLogger = java.util.logging.Logger.getLogger("VelocityBroadcast");
|
||||||
public ProxyServer getServer() {
|
this.databaseManager = new DatabaseManager(config, jdkLogger, dataDirectory);
|
||||||
return server;
|
databaseManager.initialize();
|
||||||
}
|
|
||||||
|
// Check for updates (async)
|
||||||
public Logger getLogger() {
|
UpdateChecker updateChecker = new UpdateChecker(PLUGIN_VERSION, jdkLogger);
|
||||||
return logger;
|
updateChecker.checkForUpdate().thenAccept(latest -> {
|
||||||
}
|
if (latest != null) {
|
||||||
|
logger.warn("[VelocityBroadcast] A new version is available: " + latest + " (You are on " + PLUGIN_VERSION + ")");
|
||||||
public ConfigHandler getConfigHandler() {
|
} else {
|
||||||
return config;
|
logger.info("[VelocityBroadcast] You are running the latest version (" + PLUGIN_VERSION + ").");
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
// Register login listener
|
||||||
|
server.getEventManager().register(this, new LoginListener(server, PLUGIN_VERSION, updateChecker, databaseManager));
|
||||||
|
|
||||||
|
// Register command
|
||||||
|
server.getCommandManager().register(
|
||||||
|
server.getCommandManager().metaBuilder("vb").plugin(this).build(),
|
||||||
|
new VBCommand(this)
|
||||||
|
);
|
||||||
|
|
||||||
|
logger.info("[VelocityBroadcast] Loaded VelocityBroadcast v" + PLUGIN_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onLogin(LoginEvent event) {
|
||||||
|
if (event.getPlayer().hasPermission("vb.admin") && config.isVersionCheckEnabled()) {
|
||||||
|
event.getPlayer().sendMessage(
|
||||||
|
MINI_MESSAGE.deserialize("<yellow>[VelocityBroadcast] You're running version " + PLUGIN_VERSION + ".</yellow>")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProxyServer getServer() {
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Logger getLogger() {
|
||||||
|
return logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigHandler getConfigHandler() {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DatabaseManager getDatabaseManager() {
|
||||||
|
return databaseManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LuckPerms getLuckPerms() {
|
||||||
|
return luckPerms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,127 @@
|
|||||||
|
package com.adzel.velocitybroadcast.util;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import com.adzel.velocitybroadcast.ConfigHandler;
|
||||||
|
|
||||||
|
public class DatabaseManager {
|
||||||
|
private final Logger logger;
|
||||||
|
private final ConfigHandler config;
|
||||||
|
private final Path dataDirectory;
|
||||||
|
private Connection connection;
|
||||||
|
private final ExecutorService executor = Executors.newSingleThreadExecutor();
|
||||||
|
|
||||||
|
public DatabaseManager(ConfigHandler config, Logger logger, Path dataDirectory) {
|
||||||
|
this.config = config;
|
||||||
|
this.logger = logger;
|
||||||
|
this.dataDirectory = dataDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialize() {
|
||||||
|
try {
|
||||||
|
if (config.getDbType().equalsIgnoreCase("mysql")) {
|
||||||
|
Class.forName("com.mysql.cj.jdbc.Driver");
|
||||||
|
connection = DriverManager.getConnection(
|
||||||
|
"jdbc:mysql://" + config.getDbHost() + ":" + config.getDbPort() + "/" + config.getDbName() + "?useSSL=false&autoReconnect=true",
|
||||||
|
config.getDbUser(),
|
||||||
|
config.getDbPassword()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
Class.forName("org.sqlite.JDBC");
|
||||||
|
Path dbFile = dataDirectory.resolve(config.getDbName() + ".db");
|
||||||
|
connection = DriverManager.getConnection("jdbc:sqlite:" + dbFile.toAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("[VelocityBroadcast] Connected to " + config.getDbType().toUpperCase() + " database.");
|
||||||
|
initializeTables();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.warning("[VelocityBroadcast] Failed to connect to database: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeTables() {
|
||||||
|
boolean isMySQL = config.getDbType().equalsIgnoreCase("mysql");
|
||||||
|
String idSyntax = isMySQL ? "INT AUTO_INCREMENT PRIMARY KEY" : "INTEGER PRIMARY KEY AUTOINCREMENT";
|
||||||
|
|
||||||
|
String broadcastTable = "CREATE TABLE IF NOT EXISTS vb_broadcast_logs (" +
|
||||||
|
"id " + idSyntax + "," +
|
||||||
|
"timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
"sender VARCHAR(64) NOT NULL," +
|
||||||
|
"message TEXT NOT NULL," +
|
||||||
|
"source_server VARCHAR(64)" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
String commandTable = "CREATE TABLE IF NOT EXISTS vb_command_logs (" +
|
||||||
|
"id " + idSyntax + "," +
|
||||||
|
"timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
"user VARCHAR(64) NOT NULL," +
|
||||||
|
"command TEXT NOT NULL," +
|
||||||
|
"success BOOLEAN" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
String joinTable = "CREATE TABLE IF NOT EXISTS vb_admin_joins (" +
|
||||||
|
"id " + idSyntax + "," +
|
||||||
|
"timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
"username VARCHAR(64) NOT NULL," +
|
||||||
|
"server VARCHAR(64)" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
executeUpdate(broadcastTable);
|
||||||
|
executeUpdate(commandTable);
|
||||||
|
executeUpdate(joinTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logBroadcast(String sender, String message, String sourceServer) {
|
||||||
|
String sql = "INSERT INTO vb_broadcast_logs (sender, message, source_server) VALUES (?, ?, ?)";
|
||||||
|
executeAsync(sql, sender, message, sourceServer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logCommand(String user, String command, boolean success) {
|
||||||
|
String sql = "INSERT INTO vb_command_logs (user, command, success) VALUES (?, ?, ?)";
|
||||||
|
executeAsync(sql, user, command, success);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logAdminJoin(String username, String serverName) {
|
||||||
|
String sql = "INSERT INTO vb_admin_joins (username, server) VALUES (?, ?)";
|
||||||
|
executeAsync(sql, username, serverName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void executeAsync(String sql, Object... params) {
|
||||||
|
executor.submit(() -> {
|
||||||
|
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
|
||||||
|
for (int i = 0; i < params.length; i++) {
|
||||||
|
stmt.setObject(i + 1, params[i]);
|
||||||
|
}
|
||||||
|
stmt.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
logger.warning("[VelocityBroadcast] Database query failed: " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void executeUpdate(String sql) {
|
||||||
|
executor.submit(() -> {
|
||||||
|
try (Statement stmt = connection.createStatement()) {
|
||||||
|
stmt.executeUpdate(sql);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
logger.warning("[VelocityBroadcast] Failed to initialize table: " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
try {
|
||||||
|
if (connection != null && !connection.isClosed()) {
|
||||||
|
connection.close();
|
||||||
|
executor.shutdown();
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
logger.warning("[VelocityBroadcast] Failed to close database: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"id": "velocitybroadcast",
|
"id": "velocitybroadcast",
|
||||||
"name": "VelocityBroadcast",
|
"name": "VelocityBroadcast",
|
||||||
"version": "0.2-pre",
|
"version": "0.3.6",
|
||||||
"authors": ["Adzel"],
|
"authors": ["Adzel"],
|
||||||
"main": "com.adzel.velocitybroadcast.VelocityBroadcast",
|
"main": "com.adzel.velocitybroadcast.VelocityBroadcast",
|
||||||
"description": "A proxy-wide broadcast plugin for Velocity.",
|
"description": "A proxy-wide broadcast plugin for Velocity.",
|
||||||
"website": "https://github.com/AdzelFirestar/VelocityBroadcast"
|
"website": "https://github.com/AdzelFirestar/VelocityBroadcast"
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"id": "velocitybroadcast",
|
"id": "velocitybroadcast",
|
||||||
"name": "VelocityBroadcast",
|
"name": "VelocityBroadcast",
|
||||||
"version": "0.2-pre",
|
"version": "0.3.6",
|
||||||
"authors": ["Adzel"],
|
"authors": ["Adzel"],
|
||||||
"main": "com.adzel.velocitybroadcast.VelocityBroadcast",
|
"main": "com.adzel.velocitybroadcast.VelocityBroadcast",
|
||||||
"description": "A proxy-wide broadcast plugin for Velocity.",
|
"description": "A proxy-wide broadcast plugin for Velocity.",
|
||||||
"website": "https://github.com/AdzelFirestar/VelocityBroadcast"
|
"website": "https://github.com/AdzelFirestar/VelocityBroadcast"
|
||||||
}
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
{"id":"velocitybroadcast","name":"VelocityBroadcast","version":"0.2-pre","description":"A proxy-wide broadcast plugin for Velocity.","authors":["Adzel"],"dependencies":[],"main":"com.adzel.velocitybroadcast.VelocityBroadcast"}
|
{"id":"velocitybroadcast","name":"VelocityBroadcast","version":"0.3.6","description":"A proxy-wide broadcast plugin for Velocity.","authors":["Adzel"],"dependencies":[],"main":"com.adzel.velocitybroadcast.VelocityBroadcast"}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
artifactId=velocitybroadcast
|
artifactId=velocitybroadcast
|
||||||
groupId=com.adzel.velocitybroadcast
|
groupId=com.adzel.velocitybroadcast
|
||||||
version=0.2-pre
|
version=0.3.6
|
||||||
|
|||||||
@@ -4,4 +4,7 @@ com\adzel\velocitybroadcast\BroadcastCommand.class
|
|||||||
com\adzel\velocitybroadcast\ConfigHandler.class
|
com\adzel\velocitybroadcast\ConfigHandler.class
|
||||||
com\adzel\velocitybroadcast\ReloadCommand.class
|
com\adzel\velocitybroadcast\ReloadCommand.class
|
||||||
velocity-plugin.json
|
velocity-plugin.json
|
||||||
|
com\adzel\velocitybroadcast\util\DatabaseManager.class
|
||||||
com\adzel\velocitybroadcast\PrefixCommand.class
|
com\adzel\velocitybroadcast\PrefixCommand.class
|
||||||
|
com\adzel\velocitybroadcast\util\UpdateChecker.class
|
||||||
|
com\adzel\velocitybroadcast\LoginListener.class
|
||||||
|
|||||||
@@ -2,5 +2,8 @@ C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\veloci
|
|||||||
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\ReloadCommand.java
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\ReloadCommand.java
|
||||||
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\BroadcastCommand.java
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\BroadcastCommand.java
|
||||||
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\ConfigHandler.java
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\ConfigHandler.java
|
||||||
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\UpdateChecker.java
|
||||||
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\util\DatabaseManager.java
|
||||||
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\LoginListener.java
|
||||||
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\VelocityBroadcast.java
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\VelocityBroadcast.java
|
||||||
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\PrefixCommand.java
|
C:\Users\theon\OneDrive\Desktop\VelocityBroadcast\src\main\java\com\adzel\velocitybroadcast\PrefixCommand.java
|
||||||
|
|||||||
Reference in New Issue
Block a user