|
1 | 1 | package net.glowstone;
|
2 | 2 |
|
| 3 | +import com.destroystokyo.paper.event.profile.ProfileWhitelistVerifyEvent; |
3 | 4 | import java.net.InetAddress;
|
4 | 5 | import java.net.InetSocketAddress;
|
5 | 6 | import java.util.HashSet;
|
@@ -144,9 +145,8 @@ public PlayerLoginEvent onPlayerLogin(GlowPlayer player, String hostname) {
|
144 | 145 | } else if (ipBans.isBanned(addressString)) {
|
145 | 146 | event.disallow(Result.KICK_BANNED,
|
146 | 147 | Kick.BANNED.get(ipBans.getBanEntry(addressString).getReason()));
|
147 |
| - } else if (server.hasWhitelist() && !player.isWhitelisted()) { |
148 |
| - event.disallow(Result.KICK_WHITELIST, Kick.WHITELIST.get()); |
149 |
| - } else if (server.getOnlinePlayers().size() >= server.getMaxPlayers()) { |
| 148 | + } else if (checkWhitelisted(player, event) |
| 149 | + && server.getOnlinePlayers().size() >= server.getMaxPlayers()) { |
150 | 150 | event.disallow(Result.KICK_FULL, Kick.FULL.get(server.getMaxPlayers()));
|
151 | 151 | }
|
152 | 152 |
|
@@ -247,4 +247,36 @@ public <T extends EntityDamageEvent> T onEntityDamage(T event) {
|
247 | 247 | }
|
248 | 248 | return result;
|
249 | 249 | }
|
| 250 | + |
| 251 | + /** |
| 252 | + * Checks whether a player is whitelisted when joining the server, |
| 253 | + * and fires the {@link ProfileWhitelistVerifyEvent} in the process. |
| 254 | + * |
| 255 | + * <p>The supplied {@link PlayerLoginEvent} will be disallowed by this method |
| 256 | + * if the player is not whitelisted. |
| 257 | + * |
| 258 | + * @param player the player joining the server |
| 259 | + * @param loginEvent the {@link PlayerLoginEvent} that will follow this check |
| 260 | + * @return true if the player is whitelisted, false otherwise |
| 261 | + */ |
| 262 | + private boolean checkWhitelisted(GlowPlayer player, PlayerLoginEvent loginEvent) { |
| 263 | + // check whether the player is whitelisted (explicitly or implicitly) |
| 264 | + boolean whitelisted = player.isOp() |
| 265 | + || !player.getServer().hasWhitelist() |
| 266 | + || player.isWhitelisted(); |
| 267 | + // fire the event to allow plugins to change this behavior |
| 268 | + ProfileWhitelistVerifyEvent event = callEvent(new ProfileWhitelistVerifyEvent( |
| 269 | + player.getProfile(), |
| 270 | + player.getServer().hasWhitelist(), |
| 271 | + whitelisted, |
| 272 | + player.isOp(), |
| 273 | + Kick.WHITELIST.get() |
| 274 | + )); |
| 275 | + if (event.isWhitelisted()) { |
| 276 | + return true; |
| 277 | + } |
| 278 | + // note: the kick message is mutable by plugins |
| 279 | + loginEvent.disallow(Result.KICK_WHITELIST, event.getKickMessage()); |
| 280 | + return false; |
| 281 | + } |
250 | 282 | }
|
0 commit comments