Skip to content

Commit 8053995

Browse files
committed
Kick players after 5 mins
1 parent 6571d42 commit 8053995

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

src/main/java/org/geysermc/globallinkserver/GlobalLinkServer.java

+37
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,18 @@
55
*/
66
package org.geysermc.globallinkserver;
77

8+
import java.time.Instant;
89
import java.util.ArrayList;
910
import java.util.Collection;
1011
import java.util.List;
12+
import java.util.UUID;
13+
import java.util.concurrent.TimeUnit;
1114
import java.util.logging.Logger;
1215

1316
import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
17+
import com.google.common.cache.Cache;
18+
import com.google.common.cache.CacheBuilder;
19+
import com.google.common.cache.RemovalCause;
1420
import com.mojang.brigadier.arguments.IntegerArgumentType;
1521
import io.papermc.paper.command.brigadier.Commands;
1622
import io.papermc.paper.event.player.AsyncChatEvent;
@@ -55,6 +61,22 @@ public class GlobalLinkServer extends JavaPlugin implements Listener {
5561
.append(Component.text("`/unlink`", NamedTextColor.RED))
5662
.append(Component.text("."));
5763

64+
private final Cache<UUID, Instant> playerIdleCache = CacheBuilder.newBuilder()
65+
.expireAfterWrite(5, TimeUnit.MINUTES)
66+
.removalListener(removalNotification -> {
67+
getLogger().info(removalNotification.getKey() + " was removed from the cache due to " + removalNotification.getCause());
68+
if (removalNotification.wasEvicted() && removalNotification.getCause() == RemovalCause.EXPIRED) {
69+
Player player = Bukkit.getPlayer((UUID)removalNotification.getKey());
70+
if (player != null) {
71+
Bukkit.getScheduler().callSyncMethod(plugin, () -> {
72+
player.kick(Component.text("You have been idle for too long!"));
73+
return null;
74+
});
75+
}
76+
}
77+
})
78+
.build();
79+
5880
@Override
5981
public void onEnable() {
6082
LOGGER = getLogger();
@@ -137,6 +159,9 @@ public void onEnable() {
137159
getServer().clearRecipes();
138160
getServer().setDefaultGameMode(GameMode.ADVENTURE);
139161

162+
// Clean up every 10 seconds (200 ticks)
163+
Bukkit.getScheduler().runTaskTimer(plugin, () -> playerIdleCache.cleanUp(), 0, 200);
164+
140165
LOGGER.info("Started Global Linking plugin!");
141166
}
142167

@@ -218,12 +243,15 @@ public void onPlayerLoad(PlayerJoinEvent event) {
218243
player.hidePlayer(this, event.getPlayer());
219244
});
220245

246+
playerIdleCache.put(event.getPlayer().getUniqueId(), Instant.now());
247+
221248
Utils.processJoin(event.getPlayer());
222249
}
223250

224251
@EventHandler
225252
public void onPlayerLeave(PlayerQuitEvent event) {
226253
event.quitMessage(null);
254+
playerIdleCache.invalidate(event.getPlayer().getUniqueId());
227255
Utils.processLeave(event.getPlayer());
228256
}
229257

@@ -267,4 +295,13 @@ public void onServerListPing(PaperServerListPingEvent event) {
267295
event.setNumPlayers(0);
268296
event.setMaxPlayers(1);
269297
}
298+
299+
@EventHandler
300+
public void onPlayerMove(PlayerMoveEvent event) {
301+
int diffX = event.getFrom().getBlockX() - event.getTo().getBlockX();
302+
int diffY = event.getFrom().getBlockZ() - event.getTo().getBlockZ();
303+
if (Math.abs(diffX) > 0 || Math.abs(diffY) > 0) {
304+
playerIdleCache.put(event.getPlayer().getUniqueId(), Instant.now());
305+
}
306+
}
270307
}

0 commit comments

Comments
 (0)