Skip to content

Commit ba5f7f8

Browse files
authored
Merge pull request #584 from Multiverse/ben/mv5/playername-mapper
Implement player name mapper
2 parents df08d84 + d60259d commit ba5f7f8

File tree

9 files changed

+226
-30
lines changed

9 files changed

+226
-30
lines changed

src/main/java/org/mvplugins/multiverse/inventories/MultiverseInventories.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
import com.dumptruckman.minecraft.util.Logging;
44
import org.bukkit.entity.Player;
55
import org.bukkit.plugin.PluginManager;
6-
import org.mvplugins.multiverse.core.MultiverseCoreApi;
76
import org.mvplugins.multiverse.core.config.CoreConfig;
87
import org.mvplugins.multiverse.core.destination.DestinationsProvider;
9-
import org.mvplugins.multiverse.core.inject.PluginServiceLocatorFactory;
108
import org.mvplugins.multiverse.core.module.MultiverseModule;
119
import org.mvplugins.multiverse.core.utils.StringFormatter;
1210
import org.mvplugins.multiverse.inventories.command.MVInvCommandConditions;
@@ -21,6 +19,7 @@
2119
import org.mvplugins.multiverse.inventories.handleshare.SingleShareWriter;
2220
import org.mvplugins.multiverse.inventories.handleshare.SpawnChangeListener;
2321
import org.mvplugins.multiverse.inventories.handleshare.WriteOnlyShareHandler;
22+
import org.mvplugins.multiverse.inventories.profile.PlayerNamesMapper;
2423
import org.mvplugins.multiverse.inventories.profile.ProfileCacheManager;
2524
import org.mvplugins.multiverse.inventories.profile.ProfileDataSource;
2625
import org.mvplugins.multiverse.inventories.profile.key.GlobalProfileKey;
@@ -31,8 +30,6 @@
3130
import org.mvplugins.multiverse.inventories.util.ItemStackConverter;
3231
import org.mvplugins.multiverse.inventories.util.Perm;
3332
import org.bukkit.Bukkit;
34-
import org.mvplugins.multiverse.core.command.MVCommandManager;
35-
import org.mvplugins.multiverse.core.inject.PluginServiceLocator;
3633
import org.mvplugins.multiverse.external.jakarta.inject.Inject;
3734
import org.mvplugins.multiverse.external.jakarta.inject.Provider;
3835
import org.jvnet.hk2.annotations.Service;
@@ -61,6 +58,8 @@ public class MultiverseInventories extends MultiverseModule {
6158
@Inject
6259
private Provider<WorldGroupManager> worldGroupManager;
6360
@Inject
61+
private Provider<PlayerNamesMapper> playerNamesMapperProvider;
62+
@Inject
6463
private Provider<ProfileDataSource> profileDataSource;
6564
@Inject
6665
private Provider<ProfileCacheManager> profileCacheManager;
@@ -119,6 +118,7 @@ public final void onEnable() {
119118
// Init other extensions
120119
this.hookLuckPerms();
121120
this.dupingPatch = InventoriesDupingPatch.enableDupingPatch(this);
121+
this.playerNamesMapperProvider.get().loadMap();
122122

123123
Logging.config("Version %s (API v%s) Enabled - By %s",
124124
this.getDescription().getVersion(), getVersionAsNumber(), StringFormatter.joinAnd(this.getDescription().getAuthors()));

src/main/java/org/mvplugins/multiverse/inventories/command/MVInvCommandCompletion.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,23 @@
55
import org.mvplugins.multiverse.core.command.MVCommandCompletions;
66
import org.mvplugins.multiverse.core.command.MVCommandManager;
77
import org.mvplugins.multiverse.core.config.handle.PropertyModifyAction;
8+
import org.mvplugins.multiverse.core.utils.StringFormatter;
89
import org.mvplugins.multiverse.external.acf.commands.BukkitCommandCompletionContext;
910
import org.mvplugins.multiverse.external.jakarta.inject.Inject;
1011
import org.mvplugins.multiverse.external.vavr.control.Try;
1112
import org.mvplugins.multiverse.inventories.config.InventoriesConfig;
1213
import org.mvplugins.multiverse.inventories.dataimport.DataImportManager;
14+
import org.mvplugins.multiverse.inventories.profile.PlayerNamesMapper;
1315
import org.mvplugins.multiverse.inventories.profile.group.WorldGroup;
1416
import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager;
17+
import org.mvplugins.multiverse.inventories.profile.key.GlobalProfileKey;
1518
import org.mvplugins.multiverse.inventories.share.Sharables;
1619

1720
import java.util.Arrays;
1821
import java.util.Collection;
1922
import java.util.Collections;
23+
import java.util.List;
24+
import java.util.Objects;
2025
import java.util.Set;
2126
import java.util.stream.Collectors;
2227

@@ -28,21 +33,26 @@ public final class MVInvCommandCompletion {
2833
private final InventoriesConfig inventoriesConfig;
2934
private final WorldGroupManager worldGroupManager;
3035
private final DataImportManager dataImportManager;
36+
private final PlayerNamesMapper playerNamesMapper;
3137

3238
@Inject
3339
private MVInvCommandCompletion(
3440
@NotNull InventoriesConfig inventoriesConfig,
3541
@NotNull WorldGroupManager worldGroupManager,
3642
@NotNull DataImportManager dataImportManager,
37-
@NotNull MVCommandManager mvCommandManager) {
43+
@NotNull MVCommandManager mvCommandManager,
44+
@NotNull PlayerNamesMapper playerNamesMapper
45+
) {
3846
this.inventoriesConfig = inventoriesConfig;
3947
this.worldGroupManager = worldGroupManager;
4048
this.dataImportManager = dataImportManager;
49+
this.playerNamesMapper = playerNamesMapper;
4150

4251
MVCommandCompletions commandCompletions = mvCommandManager.getCommandCompletions();
4352
commandCompletions.registerAsyncCompletion("dataimporters", this::suggestDataImporters);
4453
commandCompletions.registerStaticCompletion("mvinvconfigs", inventoriesConfig.getStringPropertyHandle().getAllPropertyNames());
4554
commandCompletions.registerAsyncCompletion("mvinvconfigvalues", this::suggestConfigValues);
55+
commandCompletions.registerAsyncCompletion("mvinvplayernames", this::suggestPlayerNames);
4656
commandCompletions.registerAsyncCompletion("sharables", this::suggestSharables);
4757
commandCompletions.registerAsyncCompletion("shares", this::suggestShares);
4858
commandCompletions.registerAsyncCompletion("worldGroups", this::suggestWorldGroups);
@@ -60,6 +70,25 @@ private Collection<String> suggestConfigValues(BukkitCommandCompletionContext co
6070
.getOrElse(Collections.emptyList());
6171
}
6272

73+
private Collection<String> suggestPlayerNames(BukkitCommandCompletionContext context) {
74+
if (Objects.equals(context.getInput(), "@all")) {
75+
return Collections.emptyList();
76+
}
77+
List<String> playerNames = getPlayerNames();
78+
if (context.getInput().indexOf(',') == -1) {
79+
playerNames.add("@all");
80+
return playerNames;
81+
}
82+
return StringFormatter.addonToCommaSeperated(context.getInput(), playerNames);
83+
}
84+
85+
private List<String> getPlayerNames() {
86+
return playerNamesMapper.getKeys()
87+
.stream()
88+
.map(GlobalProfileKey::getPlayerName)
89+
.collect(Collectors.toList());
90+
}
91+
6392
private Collection<String> suggestSharables(BukkitCommandCompletionContext context) {
6493
String scope = context.getConfig("scope", "enabled");
6594

src/main/java/org/mvplugins/multiverse/inventories/command/MVInvCommandContexts.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import org.bukkit.Bukkit;
55
import org.jvnet.hk2.annotations.Service;
66
import org.mvplugins.multiverse.core.command.MVCommandManager;
7+
import org.mvplugins.multiverse.core.utils.REPatterns;
78
import org.mvplugins.multiverse.external.acf.commands.BukkitCommandExecutionContext;
89
import org.mvplugins.multiverse.external.acf.commands.CommandContexts;
910
import org.mvplugins.multiverse.external.acf.commands.InvalidCommandArgument;
1011
import org.mvplugins.multiverse.external.jakarta.inject.Inject;
1112
import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull;
1213
import org.mvplugins.multiverse.external.vavr.control.Option;
14+
import org.mvplugins.multiverse.inventories.profile.PlayerNamesMapper;
1315
import org.mvplugins.multiverse.inventories.profile.group.WorldGroup;
1416
import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager;
1517
import org.mvplugins.multiverse.inventories.profile.key.GlobalProfileKey;
@@ -25,10 +27,16 @@
2527
public final class MVInvCommandContexts {
2628

2729
private final WorldGroupManager worldGroupManager;
30+
private final PlayerNamesMapper playerNamesMapper;
2831

2932
@Inject
30-
private MVInvCommandContexts(@NotNull MVCommandManager commandManager, @NotNull WorldGroupManager worldGroupManager) {
33+
private MVInvCommandContexts(
34+
@NotNull MVCommandManager commandManager,
35+
@NotNull WorldGroupManager worldGroupManager,
36+
@NotNull PlayerNamesMapper playerNamesMapper
37+
) {
3138
this.worldGroupManager = worldGroupManager;
39+
this.playerNamesMapper = playerNamesMapper;
3240

3341
CommandContexts<BukkitCommandExecutionContext> commandContexts = commandManager.getCommandContexts();
3442
commandContexts.registerContext(GlobalProfileKey[].class, this::parseGlobalProfileKeys);
@@ -40,15 +48,14 @@ private MVInvCommandContexts(@NotNull MVCommandManager commandManager, @NotNull
4048
private GlobalProfileKey[] parseGlobalProfileKeys(BukkitCommandExecutionContext context) {
4149
String profileStrings = context.popFirstArg();
4250
if (profileStrings.equals("@all")) {
43-
return Arrays.stream(Bukkit.getOfflinePlayers())
44-
.map(GlobalProfileKey::create)
45-
.toArray(GlobalProfileKey[]::new);
51+
return playerNamesMapper.getKeys().toArray(GlobalProfileKey[]::new);
4652
}
4753

48-
String[] profileNames = profileStrings.split(",");
54+
String[] profileNames = REPatterns.COMMA.split(profileStrings);
4955
return Arrays.stream(profileNames)
50-
.map(Bukkit::getOfflinePlayer)
51-
.map(GlobalProfileKey::create)
56+
.map(playerNamesMapper::getKey)
57+
.filter(Option::isDefined)
58+
.map(Option::get)
5259
.toArray(GlobalProfileKey[]::new);
5360
}
5461

src/main/java/org/mvplugins/multiverse/inventories/commands/bulkedit/globalprofile/ClearCommand.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,15 @@ final class ClearCommand extends InventoriesCommand {
4242

4343
@Subcommand("bulkedit globalprofile clear")
4444
@CommandPermission("multiverse.inventories.bulkedit")
45-
@CommandCompletion("@players @flags:groupName=" + Flags.NAME)
46-
@Syntax("<players>")
45+
@CommandCompletion("@mvinvplayernames @flags:groupName=" + Flags.NAME)
46+
@Syntax("<players> [--clear-all-playerprofiles]")
4747
void onCommand(
4848
MVCommandIssuer issuer,
4949

5050
@Syntax("<players>")
5151
GlobalProfileKey[] globalProfileKeys,
5252

53+
@Syntax("[--clear-all-playerprofiles]")
5354
String[] flagArray
5455
) {
5556
ParsedCommandFlags parsedFlags = flags.parse(flagArray);

src/main/java/org/mvplugins/multiverse/inventories/commands/bulkedit/globalprofile/ModifyCommand.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.mvplugins.multiverse.core.command.queue.CommandQueuePayload;
77
import org.mvplugins.multiverse.core.config.handle.PropertyModifyAction;
88
import org.mvplugins.multiverse.core.locale.message.Message;
9+
import org.mvplugins.multiverse.external.acf.commands.annotation.CommandCompletion;
910
import org.mvplugins.multiverse.external.acf.commands.annotation.CommandPermission;
1011
import org.mvplugins.multiverse.external.acf.commands.annotation.Subcommand;
1112
import org.mvplugins.multiverse.external.acf.commands.annotation.Syntax;
@@ -32,6 +33,7 @@ final class ModifyCommand extends InventoriesCommand {
3233

3334
@Subcommand("bulkedit globalprofile modify")
3435
@CommandPermission("multiverse.inventories.bulkedit")
36+
@CommandCompletion("load-on-login|last-world @empty @mvinvplayernames")
3537
@Syntax("<property> <value> <players>")
3638
void onCommand(
3739
MVCommandIssuer issuer,

src/main/java/org/mvplugins/multiverse/inventories/profile/FlatFileProfileDataSource.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,19 @@ final class FlatFileProfileDataSource implements ProfileDataSource {
3434
private final AsyncFileIO asyncFileIO;
3535
private final ProfileFilesLocator profileFilesLocator;
3636
private final ProfileCacheManager profileCacheManager;
37+
private final PlayerNamesMapper playerNamesMapper;
3738

3839
@Inject
3940
FlatFileProfileDataSource(
4041
@NotNull AsyncFileIO asyncFileIO,
4142
@NotNull ProfileFilesLocator profileFilesLocator,
42-
@NotNull ProfileCacheManager profileCacheManager
43+
@NotNull ProfileCacheManager profileCacheManager,
44+
@NotNull PlayerNamesMapper playerNamesMapper
4345
) {
4446
this.asyncFileIO = asyncFileIO;
4547
this.profileFilesLocator = profileFilesLocator;
4648
this.profileCacheManager = profileCacheManager;
49+
this.playerNamesMapper = playerNamesMapper;
4750
}
4851

4952
private FileConfiguration loadFileToJsonConfiguration(File file) {
@@ -263,7 +266,7 @@ public CompletableFuture<GlobalProfile> getGlobalProfile(GlobalProfileKey key) {
263266
globalProfile.setLastKnownName(key.getPlayerName());
264267
return CompletableFuture.completedFuture(globalProfile);
265268
}
266-
return asyncFileIO.queueFileCallable(globalFile, () -> getGlobalProfileFromDisk(key.getPlayerUUID(), key.getPlayerName(), globalFile));
269+
return asyncFileIO.queueFileCallable(globalFile, () -> getGlobalProfileFromDisk(key.getPlayerUUID(), globalFile));
267270
});
268271
}
269272

@@ -289,10 +292,8 @@ private void migrateGlobalProfileToUUID(UUID playerUUID, String playerName) {
289292
}
290293
}
291294

292-
private GlobalProfile getGlobalProfileFromDisk(UUID playerUUID, String playerName, File globalFile) {
293-
GlobalProfile globalProfile = new GlobalProfile(playerUUID, globalFile.toPath());
294-
globalProfile.setLastKnownName(playerName);
295-
return globalProfile;
295+
private GlobalProfile getGlobalProfileFromDisk(UUID playerUUID, File globalFile) {
296+
return new GlobalProfile(playerUUID, globalFile.toPath());
296297
}
297298

298299
/**
@@ -314,7 +315,11 @@ private CompletableFuture<Void> modifyGlobalProfile(GlobalProfile globalProfile,
314315
@Override
315316
public CompletableFuture<Void> updateGlobalProfile(GlobalProfile globalProfile) {
316317
File globalFile = profileFilesLocator.getGlobalFile(globalProfile.getPlayerUUID().toString());
317-
return asyncFileIO.queueFileAction(globalFile, () -> processGlobalProfileWrite(globalProfile));
318+
boolean didPlayerNameChange = playerNamesMapper.setPlayerName(globalProfile.getPlayerUUID(), globalProfile.getLastKnownName());
319+
return asyncFileIO.queueFileAction(globalFile, () -> processGlobalProfileWrite(globalProfile))
320+
.thenCompose(ignore -> didPlayerNameChange
321+
? asyncFileIO.queueFileAction(playerNamesMapper.getFile(), playerNamesMapper::savePlayerNames)
322+
: CompletableFuture.completedFuture(null));
318323
}
319324

320325
private void processGlobalProfileWrite(GlobalProfile globalProfile) {

0 commit comments

Comments
 (0)