Skip to content

Commit fdc0ab8

Browse files
authored
feat: add getPlayerExact method to CommonServer and its implementations (#1046)
* feat: add getPlayerExact method to CommonServer and its implementations - Introduced getPlayerExact method in CommonServer interface. - Implemented getPlayerExact in BukkitServer, BungeeServer, VelocityServer, SpongeServer, and FabricServer classes. - Updated ban, temp ban, mute, temp mute, warn, and temp warn commands to handle ambiguous player names and provide appropriate error messages. - Enhanced error handling for ambiguous player matches in command tests. fixes #1042
1 parent ecf5f36 commit fdc0ab8

30 files changed

Lines changed: 762 additions & 163 deletions

File tree

bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitServer.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ public CommonPlayer getPlayer(String name) {
5151
return new BukkitPlayer(player, plugin.getConfig().isOnlineMode());
5252
}
5353

54+
@Override
55+
public CommonPlayer getPlayerExact(String name) {
56+
Player player = Bukkit.getPlayerExact(name);
57+
58+
if (player == null) return null;
59+
60+
return new BukkitPlayer(player, plugin.getConfig().isOnlineMode());
61+
}
62+
5463
@Override
5564
public CommonPlayer[] getOnlinePlayers() {
5665
return Bukkit.getOnlinePlayers().stream()

bungee/src/main/java/me/confuser/banmanager/bungee/BungeeServer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public CommonPlayer getPlayer(String name) {
4646
return new BungeePlayer(player, plugin.getConfig().isOnlineMode());
4747
}
4848

49+
@Override
50+
public CommonPlayer getPlayerExact(String name) {
51+
return getPlayer(name);
52+
}
53+
4954
@Override
5055
public CommonPlayer[] getOnlinePlayers() {
5156
return ProxyServer.getInstance().getPlayers().stream()

common/src/main/java/me/confuser/banmanager/common/CommonServer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public interface CommonServer {
1111

1212
CommonPlayer getPlayer(String name);
1313

14+
CommonPlayer getPlayerExact(String name);
15+
1416
CommonPlayer[] getOnlinePlayers();
1517

1618
void broadcast(String message, String permission);

common/src/main/java/me/confuser/banmanager/common/commands/BanCommand.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,29 @@ public boolean onCommand(CommonSender sender, CommandParser parser) {
3535
return true;
3636
}
3737

38-
if (parser.args[0].equalsIgnoreCase(sender.getName())) {
38+
final String playerName = parser.args[0];
39+
final boolean isUUID = isUUID(playerName);
40+
final TargetResolver.TargetResult target = TargetResolver.resolveTarget(getPlugin().getServer(), playerName);
41+
42+
if (target.getStatus() == TargetResolver.TargetStatus.NOT_FOUND) {
43+
sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString());
44+
return true;
45+
}
46+
47+
if (target.getStatus() == TargetResolver.TargetStatus.AMBIGUOUS) {
48+
sender.sendMessage(Message.get("sender.error.ambiguousPlayer").set("player", playerName).toString());
49+
return true;
50+
}
51+
52+
final CommonPlayer onlinePlayer = target.getOnlinePlayer();
53+
final String targetName = target.getResolvedName() == null ? playerName : target.getResolvedName();
54+
55+
if (targetName.equalsIgnoreCase(sender.getName())
56+
|| (onlinePlayer != null && onlinePlayer.getName().equalsIgnoreCase(sender.getName()))) {
3957
sender.sendMessage(Message.getString("sender.error.noSelf"));
4058
return true;
4159
}
4260

43-
// Check if UUID vs name
44-
final String playerName = parser.args[0];
45-
final boolean isUUID = isUUID(playerName);
4661
final boolean isBanned;
4762

4863
if (isUUID) {
@@ -53,26 +68,18 @@ public boolean onCommand(CommonSender sender, CommandParser parser) {
5368
return true;
5469
}
5570
} else {
56-
isBanned = getPlugin().getPlayerBanStorage().isBanned(playerName);
71+
isBanned = getPlugin().getPlayerBanStorage().isBanned(targetName);
5772
}
5873

5974
if (isBanned && !sender.hasPermission("bm.command.ban.override")) {
6075
Message message = Message.get("ban.error.exists");
61-
message.set("player", playerName);
76+
message.set("player", targetName);
6277

6378
sender.sendMessage(message.toString());
6479
return true;
6580
}
6681

67-
final CommonPlayer onlinePlayer;
68-
69-
if (isUUID) {
70-
onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName));
71-
} else {
72-
onlinePlayer = getPlugin().getServer().getPlayer(playerName);
73-
}
74-
75-
if (onlinePlayer == null) {
82+
if (target.getStatus() != TargetResolver.TargetStatus.EXACT_ONLINE) {
7683
if (!sender.hasPermission("bm.command.ban.offline")) {
7784
sender.sendMessage(Message.getString("sender.error.offlinePermission"));
7885
return true;
@@ -83,15 +90,15 @@ public boolean onCommand(CommonSender sender, CommandParser parser) {
8390
}
8491

8592
getPlugin().getScheduler().runAsync(() -> {
86-
final PlayerData player = getPlayer(sender, playerName, true);
93+
final PlayerData player = getPlayer(sender, targetName, true);
8794

8895
if (player == null) {
89-
sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString());
96+
sender.sendMessage(Message.get("sender.error.notFound").set("player", targetName).toString());
9097
return;
9198
}
9299

93100
if (getPlugin().getExemptionsConfig().isExempt(player, "ban")) {
94-
sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString());
101+
sender.sendMessage(Message.get("sender.error.exempt").set("player", targetName).toString());
95102
return;
96103
}
97104

@@ -116,7 +123,7 @@ public boolean onCommand(CommonSender sender, CommandParser parser) {
116123
if (isUUID) {
117124
ban = getPlugin().getPlayerBanStorage().getBan(UUID.fromString(playerName));
118125
} else {
119-
ban = getPlugin().getPlayerBanStorage().getBan(playerName);
126+
ban = getPlugin().getPlayerBanStorage().getBan(targetName);
120127
}
121128

122129
if (ban != null) {
@@ -137,7 +144,7 @@ public boolean onCommand(CommonSender sender, CommandParser parser) {
137144
created = getPlugin().getPlayerBanStorage().ban(ban);
138145
} catch (SQLException e) {
139146
handlePunishmentCreateException(e, sender, Message.get("ban.error.exists").set("player",
140-
playerName));
147+
targetName));
141148
return;
142149
}
143150

common/src/main/java/me/confuser/banmanager/common/commands/MuteCommand.java

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,31 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
4242
return true;
4343
}
4444

45-
if (parser.args[0].equalsIgnoreCase(sender.getName())) {
45+
final String playerName = parser.args[0];
46+
final boolean isUUID = playerName.length() > 16;
47+
TargetResolver.TargetResult target = TargetResolver.resolveTarget(getPlugin().getServer(), playerName);
48+
49+
if (target.getStatus() == TargetResolver.TargetStatus.NOT_FOUND) {
50+
sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString());
51+
return true;
52+
}
53+
54+
if (target.getStatus() == TargetResolver.TargetStatus.AMBIGUOUS) {
55+
sender.sendMessage(Message.get("sender.error.ambiguousPlayer").set("player", playerName).toString());
56+
return true;
57+
}
58+
59+
CommonPlayer onlinePlayer;
60+
final String targetName = target.getResolvedName() == null ? playerName : target.getResolvedName();
61+
62+
onlinePlayer = target.getOnlinePlayer();
63+
64+
if (targetName.equalsIgnoreCase(sender.getName())
65+
|| (onlinePlayer != null && onlinePlayer.getName().equalsIgnoreCase(sender.getName()))) {
4666
sender.sendMessage(Message.getString("sender.error.noSelf"));
4767
return true;
4868
}
4969

50-
// Check if UUID vs name
51-
final String playerName = parser.args[0];
52-
final boolean isUUID = playerName.length() > 16;
5370
final boolean isMuted;
5471

5572
if (isUUID) {
@@ -60,26 +77,18 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
6077
return true;
6178
}
6279
} else {
63-
isMuted = getPlugin().getPlayerMuteStorage().isMuted(playerName);
80+
isMuted = getPlugin().getPlayerMuteStorage().isMuted(targetName);
6481
}
6582

6683
if (isMuted && !sender.hasPermission("bm.command.mute.override")) {
6784
Message message = Message.get("mute.error.exists");
68-
message.set("player", playerName);
85+
message.set("player", targetName);
6986

7087
sender.sendMessage(message.toString());
7188
return true;
7289
}
7390

74-
CommonPlayer onlinePlayer;
75-
76-
if (isUUID) {
77-
onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName));
78-
} else {
79-
onlinePlayer = getPlugin().getServer().getPlayer(playerName);
80-
}
81-
82-
if (onlinePlayer == null) {
91+
if (target.getStatus() != TargetResolver.TargetStatus.EXACT_ONLINE) {
8392
if (!sender.hasPermission("bm.command.mute.offline")) {
8493
sender.sendMessage(Message.getString("sender.error.offlinePermission"));
8594
return true;
@@ -92,15 +101,15 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
92101
final Reason reason = parser.getReason();
93102

94103
getPlugin().getScheduler().runAsync(() -> {
95-
final PlayerData player = getPlayer(sender, playerName, true);
104+
final PlayerData player = getPlayer(sender, targetName, true);
96105

97106
if (player == null) {
98-
sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString());
107+
sender.sendMessage(Message.get("sender.error.notFound").set("player", targetName).toString());
99108
return;
100109
}
101110

102111
if (getPlugin().getExemptionsConfig().isExempt(player, "mute")) {
103-
sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString());
112+
sender.sendMessage(Message.get("sender.error.exempt").set("player", targetName).toString());
104113
return;
105114
}
106115

@@ -123,7 +132,7 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
123132
if (isUUID) {
124133
mute = getPlugin().getPlayerMuteStorage().getMute(UUID.fromString(playerName));
125134
} else {
126-
mute = getPlugin().getPlayerMuteStorage().getMute(playerName);
135+
mute = getPlugin().getPlayerMuteStorage().getMute(targetName);
127136
}
128137

129138
if (mute != null) {
@@ -144,7 +153,7 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
144153
created = getPlugin().getPlayerMuteStorage().mute(mute);
145154
} catch (SQLException e) {
146155
handlePunishmentCreateException(e, sender, Message.get("mute.error.exists").set("player",
147-
playerName));
156+
targetName));
148157
return;
149158
}
150159

common/src/main/java/me/confuser/banmanager/common/commands/ReportCommand.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import me.confuser.banmanager.common.util.Message;
88

99
import java.sql.SQLException;
10-
import java.util.UUID;
1110

1211
public class ReportCommand extends CommonCommand {
1312

@@ -35,24 +34,29 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
3534
return true;
3635
}
3736

38-
if (parser.args[0].equalsIgnoreCase(sender.getName())) {
39-
sender.sendMessage(Message.getString("sender.error.noSelf"));
37+
final String playerName = parser.args[0];
38+
final TargetResolver.TargetResult target = TargetResolver.resolveTarget(getPlugin().getServer(), playerName);
39+
40+
if (target.getStatus() == TargetResolver.TargetStatus.NOT_FOUND) {
41+
sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString());
4042
return true;
4143
}
4244

43-
// Check if UUID vs name
44-
final String playerName = parser.args[0];
45-
final boolean isUUID = playerName.length() > 16;
45+
if (target.getStatus() == TargetResolver.TargetStatus.AMBIGUOUS) {
46+
sender.sendMessage(Message.get("sender.error.ambiguousPlayer").set("player", playerName).toString());
47+
return true;
48+
}
4649

47-
CommonPlayer onlinePlayer;
50+
CommonPlayer onlinePlayer = target.getOnlinePlayer();
51+
final String targetName = target.getResolvedName() == null ? playerName : target.getResolvedName();
4852

49-
if (isUUID) {
50-
onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName));
51-
} else {
52-
onlinePlayer = getPlugin().getServer().getPlayer(playerName);
53+
if (targetName.equalsIgnoreCase(sender.getName())
54+
|| (onlinePlayer != null && onlinePlayer.getName().equalsIgnoreCase(sender.getName()))) {
55+
sender.sendMessage(Message.getString("sender.error.noSelf"));
56+
return true;
5357
}
5458

55-
if (onlinePlayer == null) {
59+
if (target.getStatus() != TargetResolver.TargetStatus.EXACT_ONLINE) {
5660
if (!sender.hasPermission("bm.command.report.offline")) {
5761
sender.sendMessage(Message.getString("sender.error.offlinePermission"));
5862
return true;
@@ -65,15 +69,15 @@ public boolean onCommand(final CommonSender sender, CommandParser parser) {
6569
final String reason = parser.getReason().getMessage();
6670

6771
getPlugin().getScheduler().runAsync(() -> {
68-
final PlayerData player = getPlayer(sender, playerName, false);
72+
final PlayerData player = getPlayer(sender, targetName, false);
6973

7074
if (player == null) {
71-
sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString());
75+
sender.sendMessage(Message.get("sender.error.notFound").set("player", targetName).toString());
7276
return;
7377
}
7478

75-
if (getPlugin().getExemptionsConfig().isExempt(player, "ban")) {
76-
sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString());
79+
if (getPlugin().getExemptionsConfig().isExempt(player, "report")) {
80+
sender.sendMessage(Message.get("sender.error.exempt").set("player", targetName).toString());
7781
return;
7882
}
7983

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package me.confuser.banmanager.common.commands;
2+
3+
import me.confuser.banmanager.common.BanManagerPlugin;
4+
import me.confuser.banmanager.common.CommonPlayer;
5+
import me.confuser.banmanager.common.CommonServer;
6+
import me.confuser.banmanager.common.data.PlayerData;
7+
8+
import java.util.UUID;
9+
10+
public final class TargetResolver {
11+
12+
public enum TargetStatus {
13+
EXACT_ONLINE,
14+
EXACT_OFFLINE,
15+
AMBIGUOUS,
16+
NOT_FOUND
17+
}
18+
19+
public static final class TargetResult {
20+
private final TargetStatus status;
21+
private final CommonPlayer onlinePlayer;
22+
private final String resolvedName;
23+
24+
private TargetResult(TargetStatus status, CommonPlayer onlinePlayer, String resolvedName) {
25+
this.status = status;
26+
this.onlinePlayer = onlinePlayer;
27+
this.resolvedName = resolvedName;
28+
}
29+
30+
public TargetStatus getStatus() {
31+
return status;
32+
}
33+
34+
public CommonPlayer getOnlinePlayer() {
35+
return onlinePlayer;
36+
}
37+
38+
public String getResolvedName() {
39+
return resolvedName;
40+
}
41+
}
42+
43+
private TargetResolver() {
44+
}
45+
46+
public static TargetResult resolveTarget(CommonServer server, String input) {
47+
if (CommonCommand.isUUID(input)) {
48+
try {
49+
CommonPlayer onlinePlayer = server.getPlayer(UUID.fromString(input));
50+
51+
if (onlinePlayer != null) {
52+
return new TargetResult(TargetStatus.EXACT_ONLINE, onlinePlayer, onlinePlayer.getName());
53+
}
54+
55+
return new TargetResult(TargetStatus.EXACT_OFFLINE, null, input);
56+
} catch (IllegalArgumentException e) {
57+
return new TargetResult(TargetStatus.NOT_FOUND, null, input);
58+
}
59+
}
60+
61+
CommonPlayer exactPlayer = server.getPlayerExact(input);
62+
if (exactPlayer != null) {
63+
return new TargetResult(TargetStatus.EXACT_ONLINE, exactPlayer, exactPlayer.getName());
64+
}
65+
66+
CommonPlayer partialPlayer = server.getPlayer(input);
67+
if (partialPlayer != null) {
68+
PlayerData exactStored = BanManagerPlugin.getInstance().getPlayerStorage().retrieve(input, false);
69+
70+
if (exactStored != null && !exactStored.getName().equalsIgnoreCase(partialPlayer.getName())) {
71+
return new TargetResult(TargetStatus.AMBIGUOUS, partialPlayer, partialPlayer.getName());
72+
}
73+
74+
return new TargetResult(TargetStatus.EXACT_ONLINE, partialPlayer, partialPlayer.getName());
75+
}
76+
77+
return new TargetResult(TargetStatus.EXACT_OFFLINE, null, input);
78+
}
79+
}

0 commit comments

Comments
 (0)