Skip to content
This repository was archived by the owner on Apr 9, 2024. It is now read-only.

Commit 61aceb3

Browse files
authored
Merge pull request #112 from Andre601/feature/new-placeholder-features
Allow multiple servers/worlds for playersOnline, add whitelistEnabled for spigot/paper and config backup on migration.
2 parents fbd8d9f + 2ccb2a4 commit 61aceb3

File tree

6 files changed

+94
-25
lines changed

6 files changed

+94
-25
lines changed

bukkit/src/main/java/ch/andre601/advancedserverlist/bukkit/objects/placeholders/BukkitServerPlaceholders.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import ch.andre601.advancedserverlist.api.PlaceholderProvider;
3030
import ch.andre601.advancedserverlist.api.objects.GenericPlayer;
3131
import ch.andre601.advancedserverlist.api.objects.GenericServer;
32+
import org.bukkit.Bukkit;
3233
import org.bukkit.World;
3334

3435
public class BukkitServerPlaceholders extends PlaceholderProvider{
@@ -50,28 +51,39 @@ public String parsePlaceholder(String placeholders, GenericPlayer player, Generi
5051

5152
return switch(args[0]){
5253
case "playersOnline" -> {
53-
if(args.length == 2){
54-
World world = bukkitServer.getWorlds().get(args[1]);
55-
if(world == null)
56-
yield null;
54+
if(args.length >= 2){
55+
int players = 0;
56+
for(int i = 1; i < args.length; i++){
57+
World world = bukkitServer.getWorlds().get(args[i]);
58+
if(world == null)
59+
continue;
60+
61+
players += world.getPlayers().size();
62+
}
5763

58-
yield String.valueOf(world.getPlayers().size());
64+
yield String.valueOf(players);
5965
}
6066

6167
yield String.valueOf(bukkitServer.getPlayersOnline());
6268
}
6369
case "playersMax" -> {
64-
if(args.length == 2)
70+
if(args.length >= 2)
6571
yield null;
6672

6773
yield String.valueOf(bukkitServer.getPlayersMax());
6874
}
6975
case "host" -> {
70-
if(args.length == 2)
76+
if(args.length >= 2)
7177
yield null;
7278

7379
yield bukkitServer.getHost();
7480
}
81+
case "whitelistEnabled" -> {
82+
if(args.length >= 2)
83+
yield null;
84+
85+
yield String.valueOf(Bukkit.hasWhitelist());
86+
}
7587
default -> null;
7688
};
7789
}

bungeecord/src/main/java/ch/andre601/advancedserverlist/bungeecord/objects/BungeeServerPlaceholders.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,33 @@ public String parsePlaceholder(String placeholder, GenericPlayer player, Generic
5252

5353
return switch(args[0]){
5454
case "playersOnline" -> {
55-
if(args.length == 2){
56-
ServerInfo info = proxy.getServers().get(args[1]);
55+
if(args.length >= 2){
56+
int players = 0;
57+
58+
for(int i = 1; i < args.length; i++){
59+
ServerInfo info = proxy.getServers().get(args[i]);
60+
if(info == null)
61+
continue;
62+
63+
players += info.getPlayers().size();
64+
}
5765

58-
yield String.valueOf(info.getPlayers().size());
66+
yield String.valueOf(players);
5967
}
6068

6169
yield String.valueOf(proxy.getPlayersOnline());
6270
}
6371
case "playersMax" -> {
6472
// ServerInfo doesn't provide the max players that could join, so we won't allow an extra argument
65-
if(args.length == 2)
73+
if(args.length >= 2)
6674
yield null;
6775

6876
yield String.valueOf(proxy.getPlayersMax());
6977
}
7078
case "host" -> {
79+
if(args.length > 2)
80+
yield null;
81+
7182
if(args.length == 2){
7283
ServerInfo info = proxy.getServers().get(args[1]);
7384

core/src/main/java/ch/andre601/advancedserverlist/core/file/FileHandler.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
import java.io.InputStream;
4141
import java.nio.file.Files;
4242
import java.nio.file.Path;
43+
import java.nio.file.StandardCopyOption;
44+
import java.time.LocalDateTime;
45+
import java.time.format.DateTimeFormatter;
4346
import java.util.ArrayList;
4447
import java.util.Comparator;
4548
import java.util.List;
@@ -70,7 +73,7 @@ public List<ServerListProfile> getProfiles(){
7073

7174
public boolean loadConfig(){
7275
logger.info("Loading config.yml...");
73-
File folder = config.toFile().getParentFile();
76+
File folder = plugin.getPlugin().getFolderPath().toFile();
7477
if(!folder.exists() && !folder.mkdirs()){
7578
logger.warn("Couldn't create folder for plugin. Is it missing Write permissions?");
7679
return false;
@@ -121,6 +124,9 @@ public boolean migrateConfig(){
121124
.nodeStyle(NodeStyle.BLOCK)
122125
.build();
123126

127+
if(!makeBackup())
128+
return false;
129+
124130
try{
125131
node = ConfigMigrator.updateNode(loader.load(), logger);
126132
loader.save(node);
@@ -188,4 +194,32 @@ public boolean getBoolean(Object... path){
188194
public boolean isOldConfig(){
189195
return node.node("configVersion").virtual() || node.node("configVersion").getInt(0) < ConfigMigrator.LATEST;
190196
}
197+
198+
private boolean makeBackup(){
199+
logger.info("Making backup of old config.yml...");
200+
201+
File backups = plugin.getPlugin().getFolderPath().resolve("backups").toFile();
202+
if(!backups.exists() && !backups.mkdirs()){
203+
logger.warn("Cannot create backups folder for migration!");
204+
return false;
205+
}
206+
207+
String date = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.now());
208+
209+
File configBackup = new File(backups, "config_" + date.replace(":", "_") + ".yml");
210+
try{
211+
if(!configBackup.exists() && !configBackup.createNewFile()){
212+
logger.warn("Cannot create backup file for config.yml!");
213+
return false;
214+
}
215+
216+
Files.copy(config, configBackup.toPath(), StandardCopyOption.REPLACE_EXISTING);
217+
logger.info("Saved backup as '" + configBackup.getName() + "'!");
218+
219+
return true;
220+
}catch(IOException ex){
221+
logger.warn("Encountered IOException while trying to create a backup.", ex);
222+
return false;
223+
}
224+
}
191225
}

docs/profiles/placeholders.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ These placeholders use the player who pinged the server, to return values. They
2121
| `${player isBanned}` | Boolean for whether the player has been banned from the server. | Spigot/Paper | Yes |
2222
| `${player isWhitelisted}` | Boolean for whether the player is whitelisted on the server. | Spigot/Paper | Yes |
2323

24-
[^1]: Whether this placeholder requires the player to have joined before while AdvancedServerList was running. When `disableCache` is enabled will these placeholders not work.
24+
[^1]:
25+
Whether this placeholder requires the player to have joined before while AdvancedServerList was running.
26+
When `disableCache` is enabled will these placeholders not work.
2527
[^2]: Will default to whatever name has been provided in the `unknownPlayer -> name` option of the config.yml, when the player isn't cached yet.
2628
[^3]: Will default to whatever name has been provided in the `unknownPlayer -> uuid` option of the config.yml, when the player isn't cached yet.
2729

@@ -36,12 +38,14 @@ These placeholders use values given by the server/proxy AdvancedServerList runs
3638
| `${server host}` | The domain/IP the player pinged.[^6] |
3739

3840
[^4]:
39-
An optional World (For Spigot/Paper) or Server (For BungeeCord/Velocity) can be provided to display the number of players online on said world/server.
40-
Full format is `${server playersOnline [world/server]}` (Replace `[world/server]` with a valid world or server name).
41-
[^5]: This placeholder is affected by the [`Amount` option](../#amount) in a server list profile, with the exception being when used in [`Conditions`](../#conditions).
41+
An space-separated list of worlds (Spigot/Paper) or Servers (BungeeCord/Velocity) can be provided to display the number of players in these worlds/servers.
42+
Example: `${server playersOnline lobby1 lobby2}` will display the numbers of players online on the servers `lobby1` and `lobby2`.
43+
[^5]:
44+
When the [`amount` option](../#amount) is used will this placeholder display the modified max players count.
45+
The only exception is [`conditions`](../#conditions) where it uses the actual max players of the server/proxy.
4246
[^6]:
4347
An optional server name can be provided to display the IP/Domain associated with that server. Only works on BungeeCord/Velocity.
44-
Full format is `${server host [server]}` (Replace `[server]` with a valid server name).
48+
Example: `${server host survival}` would display the IP/Domain associated with the `survival` server.
4549

4650
## PlaceholderAPI
4751

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3939
<project.build.commit/>
4040

41-
<plugin.version>3.1.0</plugin.version>
41+
<plugin.version>3.2.0</plugin.version>
4242
<plugin.description>Create multiple Server lists based on conditions.</plugin.description>
4343

4444
<api.version>v3.0.0</api.version>

velocity/src/main/java/ch/andre601/advancedserverlist/velocity/objects/VelocityServerPlaceholders.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,24 +50,32 @@ public String parsePlaceholder(String placeholder, GenericPlayer player, Generic
5050

5151
return switch(args[0]){
5252
case "playersOnline" -> {
53-
if(args.length == 2){
54-
RegisteredServer info = proxy.getServers().get(args[1]);
55-
if(info == null)
56-
yield null;
53+
if(args.length >= 2){
54+
int players = 0;
55+
56+
for(int i = 1; i < args.length; i++){
57+
RegisteredServer registeredServer = proxy.getServers().get(args[i]);
58+
if(registeredServer == null)
59+
continue;
60+
61+
players += registeredServer.getPlayersConnected().size();
62+
}
5763

58-
yield String.valueOf(info.getPlayersConnected().size());
64+
yield String.valueOf(players);
5965
}
6066

6167
yield String.valueOf(proxy.getPlayersOnline());
6268
}
6369
case "playersMax" -> {
64-
if(args.length == 2){
70+
if(args.length >= 2)
6571
yield null;
66-
}
6772

6873
yield String.valueOf(proxy.getPlayersMax());
6974
}
7075
case "host" -> {
76+
if(args.length > 2)
77+
yield null;
78+
7179
if(args.length == 2){
7280
RegisteredServer info = proxy.getServers().get(args[1]);
7381
if(info == null)

0 commit comments

Comments
 (0)