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:
co-authored by
Claude Sonnet 5
parent
520ca1c80b
commit
a47376db3a
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user