Skip to content

Commit afd9e25

Browse files
committed
Added auto refresh of servers
1 parent ed6dc85 commit afd9e25

File tree

5 files changed

+125
-21
lines changed

5 files changed

+125
-21
lines changed

src/main/java/com/jaimemartz/playerbalancer/section/SectionManager.java

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import net.md_5.bungee.api.config.ServerInfo;
88
import net.md_5.bungee.api.connection.ProxiedPlayer;
99
import net.md_5.bungee.api.connection.Server;
10+
import net.md_5.bungee.api.scheduler.ScheduledTask;
1011

1112
import java.util.*;
13+
import java.util.concurrent.TimeUnit;
1214
import java.util.concurrent.atomic.AtomicBoolean;
1315
import java.util.regex.Matcher;
1416
import java.util.regex.Pattern;
@@ -18,6 +20,7 @@ public class SectionManager {
1820
private final PlayerBalancer plugin;
1921
private final BalancerProps props;
2022
private ServerSection principal;
23+
private ScheduledTask refreshTask;
2124

2225
private final Map<String, ServerSection> sections = Collections.synchronizedMap(new HashMap<>());
2326
private final Map<ServerInfo, ServerSection> servers = Collections.synchronizedMap(new HashMap<>());
@@ -36,6 +39,19 @@ public void load() throws RuntimeException {
3639
stage.execute();
3740
}
3841

42+
if (plugin.getSettings().getServerRefreshProps().isEnabled()) {
43+
refreshTask = plugin.getProxy().getScheduler().schedule(plugin, () -> {
44+
props.getSectionProps().forEach((name, props) -> {
45+
ServerSection section = sections.get(name);
46+
calculateServers(section);
47+
});
48+
},
49+
plugin.getSettings().getServerRefreshProps().getDelay(),
50+
plugin.getSettings().getServerRefreshProps().getInterval(),
51+
TimeUnit.MILLISECONDS
52+
);
53+
}
54+
3955
long ending = System.currentTimeMillis() - starting;
4056
plugin.getLogger().info(String.format("A total of %s section(s) have been loaded in %sms", sections.size(), ending));
4157
}
@@ -56,6 +72,11 @@ public void flush() {
5672
}
5773
});
5874

75+
if (refreshTask != null) {
76+
refreshTask.cancel();
77+
refreshTask = null;
78+
}
79+
5980
principal = null;
6081
sections.clear();
6182
servers.clear();
@@ -195,7 +216,7 @@ public void execute(String sectionName, SectionProps sectionProps, ServerSection
195216
new SectionStage("Resolving servers") {
196217
@Override
197218
public void execute(String sectionName, SectionProps sectionProps, ServerSection section) throws RuntimeException {
198-
section.getServers().addAll(calculateServers(section));
219+
calculateServers(section);
199220
}
200221
},
201222
new SectionStage("Section server processing") {
@@ -228,34 +249,43 @@ public void execute(String sectionName, SectionProps sectionProps, ServerSection
228249
},
229250
};
230251

231-
public Set<ServerInfo> calculateServers(ServerSection section) {
252+
public void calculateServers(ServerSection section) {
232253
Set<ServerInfo> results = new HashSet<>();
233254

234255
section.getProps().getServerEntries().forEach(entry -> {
235256
Pattern pattern = Pattern.compile(entry);
236-
AtomicBoolean matches = new AtomicBoolean(false);
237257
plugin.getProxy().getServers().forEach((name, server) -> {
238258
Matcher matcher = pattern.matcher(name);
239259
if (matcher.matches()) {
240-
plugin.getLogger().info(String.format("Found a match with \"%s\" for entry \"%s\"", name, entry));
241260
results.add(server);
242-
register(server, section);
243-
matches.set(true);
244261
}
245262
});
263+
});
246264

247-
if (!matches.get()) {
248-
plugin.getLogger().warning(String.format("Could not match any servers with the entry \"%s\"", entry));
265+
section.getServers().forEach(server -> {
266+
if (!results.contains(server)) {
267+
servers.remove(server);
268+
plugin.getLogger().info(String.format("Removed the server %s from %s as it does no longer exist",
269+
server.getName(), section.getName()
270+
));
249271
}
250272
});
251273

252-
plugin.getLogger().info(String.format("Recognized %s server(s) out of %s in the section \"%s\"",
274+
results.forEach(server -> {
275+
if (!section.getServers().contains(server)) {
276+
section.getServers().add(server);
277+
register(server, section);
278+
plugin.getLogger().info(String.format("Added the server %s to %s",
279+
server.getName(), section.getName()
280+
));
281+
}
282+
});
283+
284+
plugin.getLogger().info(String.format("Recognized %s server%s in the section \"%s\"",
253285
results.size(),
254-
section.getProps().getServerEntries(),
286+
results.size() != 1 ? "s" : "",
255287
section.getName()
256288
));
257-
258-
return results;
259289
}
260290

261291
public int calculatePosition(ServerSection section) {

src/main/java/com/jaimemartz/playerbalancer/settings/SettingsHolder.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import com.jaimemartz.playerbalancer.settings.props.FeaturesProps;
44
import com.jaimemartz.playerbalancer.settings.props.GeneralProps;
55
import com.jaimemartz.playerbalancer.settings.props.MessagesProps;
6-
import com.jaimemartz.playerbalancer.settings.props.features.BalancerProps;
7-
import com.jaimemartz.playerbalancer.settings.props.features.FallbackCommandProps;
8-
import com.jaimemartz.playerbalancer.settings.props.features.KickHandlerProps;
9-
import com.jaimemartz.playerbalancer.settings.props.features.ServerCheckerProps;
6+
import com.jaimemartz.playerbalancer.settings.props.features.*;
107
import ninja.leaping.configurate.objectmapping.Setting;
118
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
129

@@ -77,6 +74,14 @@ public void setKickHandlerProps(KickHandlerProps kickHandlerProps) {
7774
featuresProps.setKickHandlerProps(kickHandlerProps);
7875
}
7976

77+
public ServerRefreshProps getServerRefreshProps() {
78+
return featuresProps.getServerRefreshProps();
79+
}
80+
81+
public void setKickHandlerProps(ServerRefreshProps serverRefreshProps) {
82+
featuresProps.setServerRefreshProps(serverRefreshProps);
83+
}
84+
8085
@Override
8186
public String toString() {
8287
return "SettingsHolder{" +

src/main/java/com/jaimemartz/playerbalancer/settings/props/FeaturesProps.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.jaimemartz.playerbalancer.settings.props;
22

3-
import com.jaimemartz.playerbalancer.settings.props.features.BalancerProps;
4-
import com.jaimemartz.playerbalancer.settings.props.features.FallbackCommandProps;
5-
import com.jaimemartz.playerbalancer.settings.props.features.KickHandlerProps;
6-
import com.jaimemartz.playerbalancer.settings.props.features.ServerCheckerProps;
3+
import com.jaimemartz.playerbalancer.settings.props.features.*;
74
import ninja.leaping.configurate.objectmapping.Setting;
85
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
96

@@ -21,6 +18,9 @@ public class FeaturesProps {
2118
@Setting(value = "kick-handler")
2219
private KickHandlerProps kickHandlerProps;
2320

21+
@Setting(value = "server-refresh")
22+
private ServerRefreshProps serverRefreshProps;
23+
2424
public BalancerProps getBalancerProps() {
2525
return balancerProps;
2626
}
@@ -53,13 +53,22 @@ public void setKickHandlerProps(KickHandlerProps kickHandlerProps) {
5353
this.kickHandlerProps = kickHandlerProps;
5454
}
5555

56+
public ServerRefreshProps getServerRefreshProps() {
57+
return serverRefreshProps;
58+
}
59+
60+
public void setServerRefreshProps(ServerRefreshProps serverRefreshProps) {
61+
this.serverRefreshProps = serverRefreshProps;
62+
}
63+
5664
@Override
5765
public String toString() {
5866
return "FeaturesProps{" +
5967
"balancerProps=" + balancerProps +
6068
", fallbackCommandProps=" + fallbackCommandProps +
6169
", serverCheckerProps=" + serverCheckerProps +
6270
", kickHandlerProps=" + kickHandlerProps +
71+
", serverRefreshProps=" + serverRefreshProps +
6372
'}';
6473
}
6574
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.jaimemartz.playerbalancer.settings.props.features;
2+
3+
import ninja.leaping.configurate.objectmapping.Setting;
4+
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
5+
6+
@ConfigSerializable
7+
public class ServerRefreshProps {
8+
@Setting
9+
private boolean enabled;
10+
11+
@Setting
12+
private int delay;
13+
14+
@Setting
15+
private int interval;
16+
17+
public boolean isEnabled() {
18+
return enabled;
19+
}
20+
21+
public void setEnabled(boolean enabled) {
22+
this.enabled = enabled;
23+
}
24+
25+
public int getDelay() {
26+
return interval;
27+
}
28+
29+
public void setDelay(int interval) {
30+
this.interval = interval;
31+
}
32+
33+
public int getInterval() {
34+
return interval;
35+
}
36+
37+
public void setInterval(int interval) {
38+
this.interval = interval;
39+
}
40+
41+
@Override
42+
public String toString() {
43+
return "ServerRefreshProps{" +
44+
"enabled=" + enabled +
45+
", delay=" + delay +
46+
", interval=" + interval +
47+
'}';
48+
}
49+
}

src/main/resources/default.conf

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ features {
128128
# The attempts before giving up on getting a server for a player
129129
attempts=5
130130

131-
# The interval between every round of checks
131+
# The interval between every round of checks (in milliseconds)
132132
interval=10000
133133

134134
# When true, the plugin will print useful info when a server gets checked
@@ -199,4 +199,15 @@ features {
199199
section-from=section-to
200200
}
201201
}
202+
203+
# Periodically adds servers that weren't there before the plugin loaded
204+
server-refresh {
205+
enabled=true
206+
207+
# The delay to the first refresh (in milliseconds)
208+
delay=2000
209+
210+
# The interval between every refresh (in milliseconds)
211+
interval=5000
212+
}
202213
}

0 commit comments

Comments
 (0)