Skip to content

Commit

Permalink
Add config file with customizable server list entry
Browse files Browse the repository at this point in the history
  • Loading branch information
voruti committed Jul 13, 2023
1 parent e2d96b2 commit 5f2b086
Show file tree
Hide file tree
Showing 4 changed files with 145 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,18 @@
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.event.proxy.ProxyPingEvent;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.server.ServerPing;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import org.slf4j.Logger;
import voruti.velocityplayerlistquery.model.Config;
import voruti.velocityplayerlistquery.service.PersistenceService;
import voruti.velocityplayerlistquery.util.ServerListEntryBuilder;

import java.nio.file.Path;
import java.util.Collection;

@Plugin(
Expand All @@ -32,23 +37,37 @@ public class VelocityPlayerListQuery {
@Inject
ProxyServer server;

@Inject
@DataDirectory
Path dataDirectory;

ServerListEntryBuilder serverListEntryBuilder;


@Subscribe
public void onProxyInitialization(ProxyInitializeEvent event) {
logger.info("Enabled");
final Config config = new PersistenceService(logger, dataDirectory)
.loadConfig();
this.serverListEntryBuilder = new ServerListEntryBuilder(logger, config);

this.logger.info("Enabled");
}

@Subscribe
public EventTask onServerPing(ProxyPingEvent event) {
public EventTask onServerPing(final ProxyPingEvent event) {
this.logger.trace("Server ping event received, adding players to server list entry...");

return EventTask.async(() -> {
Collection<Player> players = server.getAllPlayers();
Collection<Player> players = this.server.getAllPlayers();

if (!players.isEmpty()) {
event.setPing(event.getPing().asBuilder()
.samplePlayers(
players.stream()
.map(player -> new ServerPing.SamplePlayer(player.getGameProfile().getName(),
player.getUniqueId()))
.map(player -> new ServerPing.SamplePlayer(
this.serverListEntryBuilder.buildForPlayer(player),
player.getGameProfile().getId()
))
.toArray(ServerPing.SamplePlayer[]::new))
.build());
}
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/voruti/velocityplayerlistquery/model/Config.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package voruti.velocityplayerlistquery.model;

import lombok.Value;
import lombok.experimental.Accessors;

@Value
@Accessors(fluent = true)
public class Config {

public static final String FILE_NAME = "config.json";

public static final Config DEFAULT_CONFIG = new Config(
"%1$s"
);


/**
* Configure how players are shown in the server list.
* <ul>
* <li>{@code %1$s}: placeholder for the player name</li>
* <li>{@code %2$s}: placeholder for the server name, on which that player is currently playing on</li>
* </ul>
*/
String serverListEntryFormat;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package voruti.velocityplayerlistquery.service;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.AccessLevel;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import org.slf4j.Logger;
import voruti.velocityplayerlistquery.model.Config;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class PersistenceService {

@NonNull
Logger logger;
@NonNull
Path dataDirectory;

@NonNull
final Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();


public Config loadConfig() {
logger.trace("Loading config...");

try {
// checks:
if (!Files.exists(dataDirectory)) {
Files.createDirectories(dataDirectory);
}

final Path configPath = dataDirectory.resolve(Config.FILE_NAME);
if (!Files.exists(configPath)) {
this.writeFile(configPath, Config.DEFAULT_CONFIG);
return Config.DEFAULT_CONFIG;
}
if (!Files.isRegularFile(configPath) || !Files.isReadable(configPath)) {
throw new IllegalStateException("Config file is invalid");
}

// load:
return gson.fromJson(
Files.readString(configPath),
Config.class
);
} catch (IOException | IllegalStateException e) {
logger.error("Error while loading config", e);
return Config.DEFAULT_CONFIG;
}
}

private <T> void writeFile(Path path, T content) throws IOException {
logger.trace("Writing file: {}", path);

Files.write(path, gson.toJson(content).getBytes());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package voruti.velocityplayerlistquery.util;

import com.velocitypowered.api.proxy.Player;
import lombok.AccessLevel;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import org.slf4j.Logger;
import voruti.velocityplayerlistquery.model.Config;

@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class ServerListEntryBuilder {

@NonNull
Logger logger;
@NonNull
Config config;


public String buildForPlayer(Player player) {
logger.trace("Building server list entry for player {}...", player.getUsername());
return String.format(
this.config.serverListEntryFormat(),
player.getGameProfile().getName(),
player.getCurrentServer()
.map(serverConnection -> serverConnection.getServerInfo().getName())
.orElse("unknown")
);
}
}

0 comments on commit 5f2b086

Please sign in to comment.