Skip to content

Commit 9c134b5

Browse files
Remove players immediately from channel listeners (#381)
Fixes players not being able to receive messages after registering to a channel, rejoining and registering again.
1 parent 8e76f31 commit 9c134b5

File tree

2 files changed

+27
-31
lines changed

2 files changed

+27
-31
lines changed

src/main/java/pw/kaboom/extras/Main.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ public void onEnable() {
9494
final Messenger messenger = this.getServer().getMessenger();
9595
final PlayerMessaging playerMessaging = new PlayerMessaging(this);
9696

97+
this.getServer().getPluginManager().registerEvents(playerMessaging, this);
98+
9799
messenger.registerIncomingPluginChannel(this, PlayerMessaging.REGISTER, playerMessaging);
98100
messenger.registerIncomingPluginChannel(this, PlayerMessaging.UNREGISTER, playerMessaging);
99101

src/main/java/pw/kaboom/extras/modules/player/PlayerMessaging.java

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import net.kyori.adventure.text.Component;
66
import net.kyori.adventure.text.format.NamedTextColor;
77
import org.bukkit.entity.Player;
8+
import org.bukkit.event.EventHandler;
9+
import org.bukkit.event.EventPriority;
10+
import org.bukkit.event.Listener;
11+
import org.bukkit.event.player.PlayerQuitEvent;
812
import org.bukkit.plugin.messaging.Messenger;
913
import org.bukkit.plugin.messaging.PluginMessageListener;
1014
import org.jetbrains.annotations.NotNull;
@@ -13,50 +17,20 @@
1317
import java.io.*;
1418
import java.nio.charset.StandardCharsets;
1519
import java.util.*;
16-
import java.util.concurrent.Executors;
17-
import java.util.concurrent.ScheduledExecutorService;
18-
import java.util.concurrent.TimeUnit;
1920

20-
public final class PlayerMessaging implements PluginMessageListener {
21+
public final class PlayerMessaging implements PluginMessageListener, Listener {
2122
public static final String REGISTER = "extras:register";
2223
public static final String UNREGISTER = "extras:unregister";
2324
public static final String MESSAGE = "extras:message";
2425

2526
private static final Component ERROR =
2627
Component.text("Could not send plugin channel message.", NamedTextColor.RED);
27-
private static final ScheduledExecutorService SCHEDULED_EXECUTOR_SERVICE =
28-
Executors.newSingleThreadScheduledExecutor();
2928
private static final byte END_CHAR_MASK = (byte) 0x80;
3029

3130
private final Main plugin;
3231

3332
public PlayerMessaging(final Main plugin) {
3433
this.plugin = plugin;
35-
36-
SCHEDULED_EXECUTOR_SERVICE.scheduleAtFixedRate(() -> {
37-
synchronized (this.listening) {
38-
final Iterator<Map.Entry<String, Set<Player>>> iterator =
39-
this.listening.entrySet().iterator();
40-
41-
while (iterator.hasNext()) {
42-
final Map.Entry<String, Set<Player>> entry = iterator.next();
43-
44-
final Set<Player> players = entry.getValue();
45-
synchronized (players) {
46-
// try and avoid issues with other plugins causing player obj leaks
47-
int onlineCount = 0;
48-
49-
for (final Player player: players) {
50-
if (!player.isOnline()) continue;
51-
onlineCount++;
52-
}
53-
54-
if (onlineCount != 0) continue;
55-
iterator.remove();
56-
}
57-
}
58-
}
59-
}, 1, 1, TimeUnit.MINUTES);
6034
}
6135

6236
private final Map<String, Set<Player>> listening = Collections.synchronizedMap(new HashMap<>());
@@ -190,4 +164,24 @@ public void onPluginMessageReceived(final @NotNull String channelName,
190164
player.sendMessage(ERROR);
191165
}
192166
}
167+
168+
@EventHandler(priority = EventPriority.MONITOR)
169+
public void onPlayerQuit(PlayerQuitEvent event) {
170+
final Player removedPlayer = event.getPlayer();
171+
172+
synchronized (this.listening) {
173+
final Iterator<Map.Entry<String, Set<Player>>> listeningIterator =
174+
this.listening.entrySet().iterator();
175+
176+
while (listeningIterator.hasNext()) {
177+
final Map.Entry<String, Set<Player>> entry = listeningIterator.next();
178+
final Set<Player> players = entry.getValue();
179+
synchronized (players) {
180+
players.remove(removedPlayer);
181+
182+
if (players.isEmpty()) listeningIterator.remove();
183+
}
184+
}
185+
}
186+
}
193187
}

0 commit comments

Comments
 (0)