Skip to content

Commit 67382a9

Browse files
component logger and kick notification
1 parent bdb9fbf commit 67382a9

File tree

5 files changed

+68
-56
lines changed

5 files changed

+68
-56
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
plugin_version=3.0.3-INDEV
1+
plugin_version=3.0.4-INDEV
22
velocity_api_version=3.3.0-SNAPSHOT
33
minecraft_version=1.20.6

run/proxy/velocity.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ player-info-forwarding-mode = "MODERN"
4040
# The file is expected to be UTF-8 encoded and not empty.
4141
forwarding-secret-file = "forwarding.secret"
4242

43-
# Announce whether or not your server supports Forge. If you run a modded server, we
43+
# Announce whether your server supports Forge. If you run a modded server, we
4444
# suggest turning this on.
4545
#
4646
# If your network runs one modpack consistently, consider using ping-passthrough = "mods"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.zeroBzeroT.anarchyqueue;
2+
3+
import net.kyori.adventure.text.Component;
4+
import net.kyori.adventure.text.minimessage.MiniMessage;
5+
6+
/**
7+
* helper method because the MiniMessage syntax is too verbose
8+
*/
9+
public final class Components {
10+
public static Component mm(String miniMessageString) { // mm, short for MiniMessage
11+
return MiniMessage.miniMessage().deserialize(miniMessageString);
12+
}
13+
}

src/main/java/org/zeroBzeroT/anarchyqueue/Main.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,30 @@
77
import com.velocitypowered.api.plugin.Plugin;
88
import com.velocitypowered.api.plugin.annotation.DataDirectory;
99
import com.velocitypowered.api.proxy.ProxyServer;
10-
import org.slf4j.Logger;
10+
import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
1111

1212
import java.nio.file.Path;
1313

1414
@Plugin(
15-
id = "anarchyqueue",
16-
name = "AnarchyQueue",
17-
version = BuildConstants.VERSION,
18-
description = "velocity queue system for anarchy servers",
19-
url = "https://github.com/zeroBzeroT/AnarchyQueue",
20-
authors = {"bierdosenhalter", "nothub"}
15+
id = "anarchyqueue",
16+
name = "AnarchyQueue",
17+
version = BuildConstants.VERSION,
18+
description = "velocity queue system for anarchy servers",
19+
url = "https://github.com/zeroBzeroT/AnarchyQueue",
20+
authors = {"bierdosenhalter", "nothub"}
2121
)
2222

2323
public class Main {
2424
private static Main instance;
2525

26-
public final Logger log;
26+
public final ComponentLogger log;
2727

2828
private final ProxyServer server;
2929

3030
private final Path dataDir;
3131

3232
@Inject
33-
public Main(ProxyServer server, CommandManager commandManager, Logger logger, @DataDirectory final Path dataDir) {
33+
public Main(ProxyServer server, CommandManager commandManager, ComponentLogger logger, @DataDirectory final Path dataDir) {
3434
this.server = server;
3535
this.log = logger;
3636
this.dataDir = dataDir;

src/main/java/org/zeroBzeroT/anarchyqueue/Queue.java

Lines changed: 44 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,38 @@
11
package org.zeroBzeroT.anarchyqueue;
22

33
import com.velocitypowered.api.event.Subscribe;
4+
import com.velocitypowered.api.event.player.KickedFromServerEvent;
45
import com.velocitypowered.api.event.player.ServerConnectedEvent;
56
import com.velocitypowered.api.proxy.ProxyServer;
67
import com.velocitypowered.api.proxy.server.RegisteredServer;
7-
import net.kyori.adventure.identity.Identity;
88
import net.kyori.adventure.text.Component;
9-
import org.slf4j.Logger;
9+
import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
1010

1111
import java.time.Duration;
1212
import java.time.Instant;
13-
import java.util.List;
13+
import java.util.Deque;
14+
import java.util.LinkedList;
1415
import java.util.Optional;
1516
import java.util.UUID;
16-
import java.util.concurrent.CopyOnWriteArrayList;
1717
import java.util.concurrent.ExecutionException;
1818
import java.util.concurrent.Semaphore;
1919

20+
import static org.zeroBzeroT.anarchyqueue.Components.mm;
21+
2022
// velocity api event docs:
2123
// https://jd.papermc.io/velocity/3.3.0/com/velocitypowered/api/event/package-summary.html
2224

2325
public class Queue {
24-
private final Logger log;
26+
private final ComponentLogger log;
2527

2628
private final ProxyServer proxyServer;
2729

2830
private final Semaphore queueSemaphore = new Semaphore(1);
2931

30-
/**
31-
* We don't use ConcurrentLinkedQueue for this because we want index-based access to players.
32-
*/
33-
private final List<QueuedPlayer> queuedPlayers = new CopyOnWriteArrayList<>();
32+
private final Deque<QueuedPlayer> queuedPlayers = new LinkedList<>();
3433

3534
/**
36-
* Initializes a queue
35+
* Initializes the queue.
3736
*/
3837
public Queue(ProxyServer proxyServer) {
3938
this.log = Main.getInstance().log;
@@ -48,24 +47,23 @@ public Queue(ProxyServer proxyServer) {
4847
}
4948

5049
/**
51-
* This event is called once a connection to a server is fully operational.
52-
* Add a Player to the queue if they join the queue server.
50+
* This event is fired once the player has successfully connected to the
51+
* target server and the connection to the previous server has been de-established.
5352
*/
5453
@Subscribe
55-
public void onServerConnectedEvent(ServerConnectedEvent e) {
56-
if (!e.getServer().getServerInfo().getName().equals(Config.serverQueue))
54+
public void onServerConnected(ServerConnectedEvent event) {
55+
if (!event.getServer().getServerInfo().getName().equals(Config.serverQueue))
5756
return;
5857

59-
var queuedPlayer = new QueuedPlayer(e.getPlayer(), System.currentTimeMillis());
60-
61-
if (queuedPlayers.contains(queuedPlayer))
58+
// stop adding the player several times
59+
if (queuedPlayers.stream().anyMatch(p -> p.player() == event.getPlayer()))
6260
return;
6361

6462
// Add Player to queue
6563
try {
6664
queueSemaphore.acquire();
67-
queuedPlayers.add(queuedPlayer);
68-
log.info("\u00A7f" + e.getPlayer().getUsername() + "\u00A73 was added to the §dplayer queue\u00A73. Queue count is " + queuedPlayers.size() + ".");
65+
queuedPlayers.add(new QueuedPlayer(event.getPlayer(), System.currentTimeMillis()));
66+
log.info(mm("<white>" + event.getPlayer().getUsername() + "<dark_aqua> was added to the <light_purple>queue<dark_aqua>. Queue count is " + queuedPlayers.size() + "."));
6967
} catch (InterruptedException e1) {
7068
e1.printStackTrace();
7169
} finally {
@@ -74,9 +72,21 @@ public void onServerConnectedEvent(ServerConnectedEvent e) {
7472
}
7573

7674
/**
77-
* Try to connect one player to the server
75+
* Fired when a player is kicked from a server.
76+
*/
77+
@Subscribe
78+
public void onKickedFromServer(KickedFromServerEvent event) {
79+
log.info(mm("<white>" + event.getPlayer().getUsername() + "<dark_aqua> was kicked from <light_purple>" + event.getServer().getServerInfo().getName() + "<dark_aqua> for <light_purple>").append(event.getServerKickReason().isPresent() ? event.getServerKickReason().get() : mm("<empty>")).append(mm("<dark_aqua>.")));
80+
}
81+
82+
/**
83+
* Try to connect one player to the server.
7884
*/
7985
public void flushQueue() {
86+
// Ignore if queue is empty
87+
if (queuedPlayers.isEmpty())
88+
return;
89+
8090
// check queue server reachability
8191
final RegisteredServer serverQueue;
8292

@@ -87,22 +97,16 @@ public void flushQueue() {
8797
return;
8898
}
8999

90-
// Ignore if queue is empty
91-
if (queuedPlayers.isEmpty())
92-
return;
93-
94100
// check the main server reachability
95101
final RegisteredServer serverMain;
96102

97103
try {
98104
serverMain = getServer(Config.serverMain);
99105
} catch (ServerNotReachableException e) {
100106
if (Instant.now().getEpochSecond() % 10 == 0) {
101-
serverQueue.getPlayersConnected().forEach(queuedPlayer ->
102-
queuedPlayer.sendMessage(Identity.nil(), Component.text(
103-
Config.messageOffline
104-
)));
107+
serverQueue.getPlayersConnected().forEach(queuedPlayer -> queuedPlayer.sendMessage(Component.text(Config.messageOffline)));
105108
}
109+
106110
return;
107111
}
108112

@@ -145,21 +149,21 @@ public void flushQueue() {
145149
serverQueue.getPlayersConnected().stream()
146150
.filter(p -> p.getUniqueId().equals(uuid))
147151
.findAny().ifPresentOrElse(p -> {
148-
p.sendMessage(Identity.nil(), Component.text(Config.messageConnecting));
152+
p.sendMessage(Component.text(Config.messageConnecting));
149153
try {
150154
if (p.createConnectionRequest(serverMain).connect().get().isSuccessful()) {
151155
queuedPlayers.removeFirst();
152-
log.info("\u00A7f" + p.getUsername() + "\u00A73 connected to server §b" + serverMain.getServerInfo().getName() + "\u00A73. Queue count is " + serverQueue.getPlayersConnected().size() + ". Main count is " + (serverMain.getPlayersConnected().size()) + " of " + Config.maxPlayers + ".");
156+
log.info(mm("<white>" + p.getUsername() + "<dark_aqua> connected to server <aqua>" + serverMain.getServerInfo().getName() + "<dark_aqua>. Queue count is " + serverQueue.getPlayersConnected().size() + ". Main count is " + (serverMain.getPlayersConnected().size()) + " of " + Config.maxPlayers + "."));
153157
}
154158
} catch (InterruptedException | ExecutionException e) {
155-
log.error("\u00A7f" + p.getUsername() + "s\u00A7c connection to server §b" + Config.serverMain + "\u00A7c failed: " + e.getMessage());
159+
log.error(mm("<white>" + p.getUsername() + "s<red> connection to server <aqua>" + Config.serverMain + "<red> failed: " + e.getMessage()));
156160
// FIXME: requeue
157161
queuedPlayers.removeFirst();
158162
queuedPlayers.add(new QueuedPlayer(finalCurrPlayer.player(), System.currentTimeMillis()));
159163
}
160164
},
161165
() -> {
162-
log.error("\u00A7f" + finalCurrPlayer.player().getUsername() + "s\u00A7c connection to server §b" + Config.serverMain + "\u00A7c failed: player is not connected to " + serverQueue.getServerInfo().getName());
166+
log.error(mm("<white>" + finalCurrPlayer.player().getUsername() + "s<red> connection to server <aqua>" + Config.serverMain + "<red> failed: player is not connected to " + serverQueue.getServerInfo().getName()));
163167
queuedPlayers.removeFirst();
164168
}
165169
);
@@ -171,25 +175,20 @@ public void flushQueue() {
171175
}
172176

173177
private void sendInfo(RegisteredServer serverQueue, boolean full) {
174-
for (int i = 0; i < queuedPlayers.size(); i++) {
175-
queuedPlayers
176-
.get(i)
177-
.player()
178-
.sendMessage(Identity.nil(), Component.text(
179-
Config.messagePosition + (i + 1) + "/" + queuedPlayers.size()
180-
));
178+
int i = 1;
179+
180+
for (QueuedPlayer player : queuedPlayers) {
181+
player.player().sendMessage(Component.text(Config.messagePosition + (i + 1) + "/" + queuedPlayers.size()));
182+
i++;
181183
}
182184

183185
if (full) {
184-
serverQueue.getPlayersConnected().forEach(queuedPlayer ->
185-
queuedPlayer.sendMessage(Identity.nil(), Component.text(
186-
Config.messageFull
187-
)));
186+
serverQueue.getPlayersConnected().forEach(queuedPlayer -> queuedPlayer.sendMessage(Component.text(Config.messageFull)));
188187
}
189188
}
190189

191190
private RegisteredServer getServer(String name) throws ServerNotReachableException {
192-
// get server configured in velocity.toml by name
191+
// Get server configured in velocity.toml by name
193192
Optional<RegisteredServer> serverOpt = proxyServer.getServer(name);
194193

195194
if (serverOpt.isEmpty()) {
@@ -198,7 +197,7 @@ private RegisteredServer getServer(String name) throws ServerNotReachableExcepti
198197

199198
final RegisteredServer server = serverOpt.get();
200199

201-
// test server availability by pinging
200+
// Test server availability by pinging
202201
try {
203202
server.ping().get();
204203
} catch (InterruptedException | ExecutionException e) {

0 commit comments

Comments
 (0)