Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: uuid bulk fetching over Mojang API #444

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,18 @@
public class SCCommandManager extends PaperCommandManager {
private final SimpleClans plugin;
private static final List<String> SUBCOMMANDS;
private static final List<String> COMPLETIONS;

public SCCommandManager(@NotNull SimpleClans plugin) {
super(plugin);
this.plugin = plugin;
configure();
}

private void configure() {
enableUnstableAPI("help");
registerDependencies();
addCommandReplacements();
addReplacements();
registerContexts();
registerCommands();
registerConditions();
Expand Down Expand Up @@ -105,13 +106,10 @@ private void registerConditions() {
}
try {
AbstractCondition obj = c.getConstructor(SimpleClans.class).newInstance(plugin);
if (obj instanceof AbstractParameterCondition) {
@SuppressWarnings("rawtypes")
AbstractParameterCondition condition = (AbstractParameterCondition) obj;
if (obj instanceof @SuppressWarnings("rawtypes")AbstractParameterCondition condition) {
getCommandConditions().addCondition(condition.getType(), condition.getId(), condition);
}
if (obj instanceof AbstractCommandCondition) {
AbstractCommandCondition condition = (AbstractCommandCondition) obj;
if (obj instanceof AbstractCommandCondition condition) {
getCommandConditions().addCondition(condition.getId(), condition);
}
} catch (Exception ex) {
Expand Down Expand Up @@ -162,7 +160,7 @@ private void registerCommands() {
}
}

private void addCommandReplacements() {
private void addReplacements() {
SettingsManager sm = plugin.getSettingsManager();
getCommandReplacements().addReplacements(
"basic_conditions", "not_blacklisted|not_banned",
Expand All @@ -174,17 +172,10 @@ private void addCommandReplacements() {
"clan_chat", sm.getString(COMMANDS_CLAN_CHAT)
);

SUBCOMMANDS.forEach(s -> {
String command = optionalLang(s + ".command", (ClanPlayer) null);
if (command == null) {
command = s;
}
command = command.replace(" ", "");
String replacement = command.equals(s) ? s : command + "|" + s;
getCommandReplacements().addReplacement(s, replacement);
});
SUBCOMMANDS.forEach(s -> processReplacement(s, "", ".command", true));
COMPLETIONS.forEach(s -> processReplacement(s, "compl:", ".completion", false));
}

@Override
public BukkitLocales getLocales() {
if (this.locales == null) {
Expand Down Expand Up @@ -215,6 +206,20 @@ public String getMessage(CommandIssuer issuer, MessageKeyProvider key) {
return this.locales;
}

private void processReplacement(String key, String prefix, String suffix, boolean hasFallback) {
String replacement = optionalLang(key + suffix, (ClanPlayer) null);
if (replacement == null) {
replacement = key;
}

replacement = replacement.replace(" ", "");
if (hasFallback) {
replacement = replacement + "|" + key;
}

getCommandReplacements().addReplacement(prefix + key, replacement);
}

static {
SUBCOMMANDS = Arrays.asList("setbanner", "resetkdr", "place", "rank", "home", "war", "regroup",
"mostkilled", "kills", "globalff", "reload", "unban", "ban", "verify", "disband", "resign", "ff",
Expand All @@ -225,5 +230,7 @@ public String getMessage(CommandIssuer issuer, MessageKeyProvider key) {
"lookup", "roster", "profile", "list", "create", "description", "start", "end", "admin", "help", "mod",
"setdefault", "removedefault", "land", "break", "interact", "place_block", "damage", "interact_entity",
"container", "permanent", "take", "give", "join", "leave", "mute", "confirm", "balance", "discord", "rename", "locale");

COMPLETIONS = Arrays.asList("tag", "name");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,21 @@ public void main(CommandSender sender) {
@CommandPermission("simpleclans.anyone.locale")
@Description("{@@command.description.locale}")
@CommandCompletion("@locales")
public void locale(ClanPlayer cp, @Values("@locales") @Name("locale") String locale) {
public void locale(ClanPlayer cp, @Values("@locales") @Name("locale") @Single String locale) {
if (!settings.is(LANGUAGE_SELECTOR)) {
ChatBlock.sendMessageKey(cp, "locale.is.prohibited");
return;
}

cp.setLocale(Helper.forLanguageTag(locale.replace("_", "-")));
plugin.getStorageManager().updateClanPlayer(cp);

ChatBlock.sendMessage(cp, lang("locale.has.been.changed"));
ChatBlock.sendMessageKey(cp, "locale.has.been.changed");
}

@Subcommand("%create")
@CommandPermission("simpleclans.leader.create")
@CommandCompletion("%compl:tag %compl:name")
@Description("{@@command.description.create}")
public void create(Player player, @Optional @Name("tag") String tag, @Optional @Name("name") String name) {
ClanPlayer cp = cm.getAnyClanPlayer(player.getUniqueId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ public void rename(CommandSender sender, @Name("clan") ClanInput clanInput, @Nam
@CommandPermission("simpleclans.mod.locale")
@Description("{@@command.description.mod.locale}")
@CommandCompletion("@locales")
public void locale(CommandSender sender, @Name("player") ClanPlayerInput input, @Values("@locales") @Name("locale") String locale) {
public void locale(CommandSender sender, @Name("player") ClanPlayerInput input, @Values("@locales") @Name("locale") @Single String locale) {
ClanPlayer cp = input.getClanPlayer();
cp.setLocale(Helper.forLanguageTag(locale.replace("_", "-")));
plugin.getStorageManager().updateClanPlayer(cp);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.sacredlabyrinth.phaed.simpleclans.managers;

import com.google.common.base.Charsets;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankLogger;
Expand All @@ -26,7 +25,9 @@
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.stream.Collectors;

import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
Expand Down Expand Up @@ -541,7 +542,7 @@ public List<ClanPlayer> retrieveClanPlayers() {

if (last_seen == 0) {
last_seen = (new Date()).getTime();
}
}

ClanPlayer cp = new ClanPlayer();
if (uuid != null) {
Expand Down Expand Up @@ -1180,47 +1181,80 @@ private void updateDatabase() {
* Updates the database to the latest version
*
*/

private void updatePlayersToUUID() {
plugin.getLogger().log(Level.WARNING, "Starting Migration to UUID Players !");
plugin.getLogger().log(Level.WARNING, "==================== ATTENTION DONT STOP BUKKIT ! ==================== ");
plugin.getLogger().log(Level.WARNING, "==================== ATTENTION DONT STOP BUKKIT ! ==================== ");
plugin.getLogger().log(Level.WARNING, "==================== ATTENTION DONT STOP BUKKIT ! ==================== ");
logMigrationStart();
SimpleClans.getInstance().setUUID(false);

List<ClanPlayer> cps = retrieveClanPlayers();
Map<String, UUID> uuidMap = fetchUUIDs(cps);

int i = 1;
for (ClanPlayer cp : cps) {
int totalPlayers = cps.size();
for (int i = 0; i < totalPlayers; i++) {
ClanPlayer cp = cps.get(i);
try {
UUID uuidPlayer;
if (SimpleClans.getInstance().getServer().getOnlineMode()) {
uuidPlayer = UUIDFetcher.getUUIDOfThrottled(cp.getName());
} else {
uuidPlayer = UUID.nameUUIDFromBytes(("OfflinePlayer:" + cp.getName()).getBytes(Charsets.UTF_8));
}
String query = "UPDATE `" + getPrefixedTable("players") + "` SET uuid = '" + uuidPlayer.toString() + "' WHERE name = '" + cp.getName() + "';";
core.executeUpdate(query);
UUID uuid = uuidMap.getOrDefault(cp.getName(), cp.getUniqueId());
updatePlayerInDatabase(cp.getName(), uuid);
logSuccess(i + 1, totalPlayers, cp.getName(), uuid);
} catch (Exception ex) {
logFailure(i + 1, totalPlayers, cp.getName(), ex);
}
}

String query2 = "UPDATE `" + getPrefixedTable("kills") + "` SET attacker_uuid = '" + uuidPlayer + "' WHERE attacker = '" + cp.getName() + "';";
core.executeUpdate(query2);
logMigrationEnd(totalPlayers);
SimpleClans.getInstance().setUUID(true);
}

String query3 = "UPDATE `" + getPrefixedTable("kills") + "` SET victim_uuid = '" + uuidPlayer + "' WHERE victim = '" + cp.getName() + "';";
core.executeUpdate(query3);
plugin.getLogger().info("[" + i + " / " + cps.size() + "] Success: " + cp.getName() + "; UUID: " + uuidPlayer);
} catch (Exception ex) {
plugin.getLogger().log(Level.WARNING, "[" + i + " / " + cps.size() + "] Failed [ERRO]: " + cp.getName() + "; UUID: ???");
private void updatePlayerInDatabase(String playerName, UUID uuid) {
String[] tables = {"players", "kills", "kills"};
String[] columns = {"uuid", "attacker_uuid", "victim_uuid"};
String[] conditions = {"name", "attacker", "victim"};

for (int i = 0; i < tables.length; i++) {
String query = String.format("UPDATE `%s` SET %s = '%s' WHERE %s = '%s';",
getPrefixedTable(tables[i]), columns[i], uuid.toString(), conditions[i], playerName);
core.executeUpdate(query);
}
}

private Map<String, UUID> fetchUUIDs(List<ClanPlayer> clanPlayers) {
Map<String, UUID> uuidMap = new HashMap<>();

try {
if (SimpleClans.getInstance().getServer().getOnlineMode()) {
uuidMap = UUIDFetcher.fetchUUIDsForClanPlayers(clanPlayers);
} else {
uuidMap = clanPlayers.stream().collect(Collectors.toMap(ClanPlayer::getName, ClanPlayer::getUniqueId));
}
i++;
} catch (InterruptedException | ExecutionException ex) {
plugin.getLogger().log(Level.SEVERE, "Error fetching UUIDs in bulk: " + ex.getMessage(), ex);
}

return uuidMap;
}

private void logSuccess(int current, int total, String playerName, UUID uuid) {
plugin.getLogger().info(String.format("[%d / %d] Success: %s; UUID: %s", current, total, playerName, uuid));
}

private void logFailure(int current, int total, String playerName, Exception ex) {
plugin.getLogger().log(Level.WARNING, String.format("[%d / %d] Failed [ERROR]: %s; UUID: ???", current, total, playerName), ex);
}

private void logMigrationStart() {
plugin.getLogger().log(Level.WARNING, "Starting Migration to UUID Players!");
plugin.getLogger().log(Level.WARNING, "==================== ATTENTION DON'T STOP BUKKIT! ====================");
plugin.getLogger().log(Level.WARNING, "==================== ATTENTION DON'T STOP BUKKIT! ====================");
plugin.getLogger().log(Level.WARNING, "==================== ATTENTION DON'T STOP BUKKIT! ====================");
}

private void logMigrationEnd(int totalPlayers) {
plugin.getLogger().log(Level.WARNING, "==================== END OF MIGRATION ====================");
plugin.getLogger().log(Level.WARNING, "==================== END OF MIGRATION ====================");
plugin.getLogger().log(Level.WARNING, "==================== END OF MIGRATION ====================");


if (!cps.isEmpty()) {
plugin.getLogger().info(MessageFormat.format(lang("clan.players"), cps.size()));
if (totalPlayers > 0) {
plugin.getLogger().info(MessageFormat.format(lang("clan.players"), totalPlayers));
}
SimpleClans.getInstance().setUUID(true);
}

private String getPrefixedTable(String name) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ private void addDisband() {
50);
disband.setListener(ClickType.DROP, () -> InventoryController.runSubcommand(getViewer(), "disband", false));
disband.setPermission(ClickType.DROP, "simpleclans.leader.disband");
disband.setConfirmationRequired(ClickType.LEFT);
add(disband);
}

Expand Down
Loading
Loading