Skip to content

Commit 4c7e8c0

Browse files
committed
Implement ProfileWhitelistVerifyEvent.
Related to #922. * Fixed /whitelist remove <player> showing usage error even on success
1 parent a40541d commit 4c7e8c0

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

src/main/java/net/glowstone/EventFactory.java

+35-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.glowstone;
22

3+
import com.destroystokyo.paper.event.profile.ProfileWhitelistVerifyEvent;
34
import java.net.InetAddress;
45
import java.net.InetSocketAddress;
56
import java.util.HashSet;
@@ -144,9 +145,8 @@ public PlayerLoginEvent onPlayerLogin(GlowPlayer player, String hostname) {
144145
} else if (ipBans.isBanned(addressString)) {
145146
event.disallow(Result.KICK_BANNED,
146147
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()) {
150150
event.disallow(Result.KICK_FULL, Kick.FULL.get(server.getMaxPlayers()));
151151
}
152152

@@ -247,4 +247,36 @@ public <T extends EntityDamageEvent> T onEntityDamage(T event) {
247247
}
248248
return result;
249249
}
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+
}
250282
}

src/main/java/net/glowstone/command/minecraft/WhitelistCommand.java

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public boolean execute(CommandSender sender, String label, String[] args) {
9595
player.setWhitelisted(false);
9696
sender.sendMessage("Removed " + player.getName() + " from the whitelist");
9797
});
98+
return true;
9899
}
99100
if (subcommand.equals("reload")) {
100101
sender.getServer().reloadWhitelist();

0 commit comments

Comments
 (0)