Convert ignore list storage to UUID-based (#3209)

As the title describes, this PR converts the ignore list storage from username-based to UUID-based.

Fixes #239.
This commit is contained in:
Josh Roy 2020-05-04 06:06:09 -04:00 committed by GitHub
parent 8ad55cb634
commit 1bc1f646fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 79 additions and 11 deletions

View File

@ -42,6 +42,47 @@ public class EssentialsUpgrade {
doneFile.load();
}
public void convertIgnoreList() {
if (doneFile.getBoolean("updateUsersIgnoreListUUID", false)) {
return;
}
final File userdataFolder = new File(ess.getDataFolder(), "userdata");
if (!userdataFolder.exists() || !userdataFolder.isDirectory()) {
return;
}
final File[] userFiles = userdataFolder.listFiles();
for (File file : userFiles) {
if (!file.isFile() || !file.getName().endsWith(".yml")) {
continue;
}
final EssentialsConf config = new EssentialsConf(file);
try {
config.load();
if (config.hasProperty("ignore")) {
List<String> migratedIgnores = new ArrayList<>();
for (String name : Collections.synchronizedList(config.getStringList("ignore"))) {
if (name == null) {
continue;
}
OfflinePlayer user = ((OfflinePlayer) ess.getOfflineUser(name).getBase());
if (user != null) {
migratedIgnores.add(user.getUniqueId().toString());
}
}
config.removeProperty("ignore");
config.setProperty("ignore", migratedIgnores);
config.forceSave();
}
} catch (RuntimeException ex) {
LOGGER.log(Level.INFO, "File: " + file.toString());
throw ex;
}
}
doneFile.setProperty("updateUsersIgnoreListUUID", true);
doneFile.save();
}
public void convertKits() {
Kits kits = ess.getKits();
EssentialsConf config = kits.getConfig();
@ -713,5 +754,6 @@ public class EssentialsUpgrade {
banFormatChange();
warnMetrics();
repairUserMap();
convertIgnoreList();
}
}

View File

@ -470,19 +470,42 @@ public abstract class UserData extends PlayerExtension implements IConf {
config.save();
}
private List<String> ignoredPlayers;
private List<UUID> ignoredPlayers;
public List<String> _getIgnoredPlayers() {
return Collections.synchronizedList(config.getStringList("ignore"));
public List<UUID> _getIgnoredPlayers() {
List<UUID> players = new ArrayList<>();
for (String uuid : config.getStringList("ignore")) {
try {
players.add(UUID.fromString(uuid));
} catch (IllegalArgumentException ignored) {}
}
return Collections.synchronizedList(players);
}
@Deprecated
public void setIgnoredPlayers(List<String> players) {
List<UUID> uuids = new ArrayList<>();
for (String player : players) {
User user = ess.getOfflineUser(player);
if (user == null) {
return;
}
uuids.add(user.getBase().getUniqueId());
}
setIgnoredPlayerUUIDs(uuids);
}
public void setIgnoredPlayerUUIDs(List<UUID> players) {
if (players == null || players.isEmpty()) {
ignoredPlayers = Collections.synchronizedList(new ArrayList<>());
config.removeProperty("ignore");
} else {
ignoredPlayers = players;
config.setProperty("ignore", players);
List<String> uuids = new ArrayList<>();
for (UUID uuid : players) {
uuids.add(uuid.toString());
}
config.setProperty("ignore", uuids);
}
config.save();
}
@ -497,17 +520,19 @@ public abstract class UserData extends PlayerExtension implements IConf {
}
public boolean isIgnoredPlayer(IUser user) {
return (ignoredPlayers.contains(user.getName().toLowerCase(Locale.ENGLISH)) && !user.isIgnoreExempt());
return ignoredPlayers.contains(user.getBase().getUniqueId()) && !user.isIgnoreExempt();
}
public void setIgnoredPlayer(IUser user, boolean set) {
final String entry = user.getName().toLowerCase(Locale.ENGLISH);
UUID uuid = user.getBase().getUniqueId();
if (set) {
if (!ignoredPlayers.contains(entry)) ignoredPlayers.add(entry);
if (!ignoredPlayers.contains(uuid)) {
ignoredPlayers.add(uuid);
}
} else {
ignoredPlayers.remove(entry);
ignoredPlayers.remove(uuid);
}
setIgnoredPlayers(ignoredPlayers);
setIgnoredPlayerUUIDs(ignoredPlayers);
}
private boolean godmode;

View File

@ -5,6 +5,7 @@ import org.bukkit.Server;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import static com.earth2me.essentials.I18n.tl;
@ -18,8 +19,8 @@ public class Commandignore extends EssentialsCommand {
protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
if (args.length < 1) {
StringBuilder sb = new StringBuilder();
for (String s : user._getIgnoredPlayers()) {
sb.append(s).append(" ");
for (UUID uuid : user._getIgnoredPlayers()) {
sb.append(ess.getUser(uuid).getName()).append(" ");
}
String ignoredList = sb.toString().trim();
user.sendMessage(ignoredList.length() > 0 ? tl("ignoredList", ignoredList) : tl("noIgnored"));