Fix : vote perdu si le joueur est sur un serveur sans le plugin Spigot

Velocity envoyait le paquet direct des qu'un joueur etait en ligne,
sans verifier que le serveur courant (ex: un lobby) avait bien
VoteNetwork-Spigot installe. Message silencieusement perdu dans ce cas.

Ajoute direct-vote.servers (config.properties) : liste blanche des
serveurs equipes du plugin. Hors de cette liste, le vote est traite
comme "joueur hors ligne" et stocke en base au lieu d'etre envoye en
direct.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
SarTron-NorthBlue
2026-07-12 13:47:22 +04:00
co-authored by Claude Sonnet 5
parent 520ca1c80b
commit a47376db3a
5 changed files with 46 additions and 7 deletions
@@ -17,12 +17,14 @@ import java.util.Optional;
public class VoteCommand implements SimpleCommand {
private final ProxyServer proxy;
private final VoteConfig config;
private final PendingVoteStore pendingVoteStore;
private final Logger logger;
private final MojangUuidResolver uuidResolver;
public VoteCommand(ProxyServer proxy, PendingVoteStore pendingVoteStore, Logger logger) {
public VoteCommand(ProxyServer proxy, VoteConfig config, PendingVoteStore pendingVoteStore, Logger logger) {
this.proxy = proxy;
this.config = config;
this.pendingVoteStore = pendingVoteStore;
this.logger = logger;
this.uuidResolver = new MojangUuidResolver(logger);
@@ -51,9 +53,15 @@ public class VoteCommand implements SimpleCommand {
Optional<ServerConnection> serverConnection = player.getCurrentServer();
if (serverConnection.isPresent()) {
sendVoteSignal(serverConnection.get(), player);
logger.info("Vote direct envoye a {} pour le joueur {}", serverConnection.get().getServerInfo().getName(), player.getUsername());
return;
String serverName = serverConnection.get().getServerInfo().getName();
if (config.isDirectVoteServer(serverName)) {
sendVoteSignal(serverConnection.get(), player);
logger.info("Vote direct envoye a {} pour le joueur {}", serverName, player.getUsername());
return;
}
logger.info("{} est sur {} (pas dans direct-vote.servers) : vote stocke en base au lieu d'un envoi direct.", player.getUsername(), serverName);
}
}
@@ -6,7 +6,11 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Locale;
import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;
public class VoteConfig {
@@ -21,6 +25,7 @@ public class VoteConfig {
private String user;
private String password;
private int poolSize;
private Set<String> directVoteServers;
public VoteConfig(Path dataDirectory, Logger logger) {
this.dataDirectory = dataDirectory;
@@ -51,6 +56,13 @@ public class VoteConfig {
this.user = properties.getProperty("mysql.user", "root");
this.password = properties.getProperty("mysql.password", "");
this.poolSize = Integer.parseInt(properties.getProperty("mysql.pool-size", "5"));
String serversRaw = properties.getProperty("direct-vote.servers", "");
this.directVoteServers = Arrays.stream(serversRaw.split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(s -> s.toLowerCase(Locale.ROOT))
.collect(Collectors.toSet());
} catch (IOException e) {
logger.error("Impossible de charger la configuration Velocity", e);
}
@@ -60,6 +72,15 @@ public class VoteConfig {
return !"yaml".equalsIgnoreCase(storageType);
}
/**
* true si le plugin VoteNetwork-Spigot est declare installe sur ce serveur (liste
* direct-vote.servers). Si la liste est vide, tous les serveurs sont consideres eligibles
* (comportement historique, a eviter des qu'un serveur type lobby n'a pas le plugin).
*/
public boolean isDirectVoteServer(String serverName) {
return directVoteServers.isEmpty() || directVoteServers.contains(serverName.toLowerCase(Locale.ROOT));
}
public String getJdbcUrl() {
return "jdbc:mysql://" + host + ":" + port + "/" + database
+ "?useSSL=false&autoReconnect=true&characterEncoding=utf8";
@@ -56,7 +56,7 @@ public class VoteNetworkVelocity {
proxy.getCommandManager().register(
proxy.getCommandManager().metaBuilder("votenetwork").build(),
new VoteCommand(proxy, pendingVoteStore, logger)
new VoteCommand(proxy, config, pendingVoteStore, logger)
);
logger.info("VoteNetwork (Velocity) demarre.");
@@ -12,3 +12,11 @@ mysql.database=votenetwork
mysql.user=root
mysql.password=changeme
mysql.pool-size=5
# Liste (separee par des virgules) des noms de serveurs Velocity (tels que declares dans
# velocity.toml) ou le plugin VoteNetwork-Spigot est installe. Si le joueur qui vote est
# actuellement sur un serveur absent de cette liste (ex: un lobby sans le plugin), le vote
# est stocke en base au lieu d'etre envoye en direct (qui serait silencieusement perdu).
# Laisser vide = tous les serveurs sont consideres comme ayant le plugin (deconseille des
# qu'un lobby/hub sans VoteNetwork-Spigot existe sur le reseau).
direct-vote.servers=gen1,gen2