Skip to content
Open
Show file tree
Hide file tree
Changes from 6 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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

**⭐ Modern conveniences** — Beautiful clickable menus and glowing display entity visualisation. Make groups to manage trust in bulk.

**⭐ Easy to import & configure** — Import existing player claims and profiles from GriefPrevention. Has a robust, [extensible API](https://william278.net/docs/huskclaims/api).
**⭐ Easy to import & configure** — Import existing player claims and profiles from GriefPrevention. Seamlessly migrate between MySQL and SQLite. Has a robust, [extensible API](https://william278.net/docs/huskclaims/api).

**Ready?** [Let the claims begin!](https://william278.net/docs/huskclaims/setup)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ default List<Hook> getAvailableHooks() {

// Add bukkit importers
hooks.add(new BukkitGriefPreventionImporter(getPlugin()));

// Add database importer
hooks.add(new DatabaseImporter(getPlugin()));

return hooks;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import net.william278.huskclaims.user.SavedUser;
import net.william278.huskclaims.util.StatusLine;
import net.william278.paginedown.PaginatedList;
import net.william278.huskclaims.hook.DatabaseImporter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -177,8 +178,25 @@ public List<String> suggest(@NotNull CommandUser user, @NotNull String[] args) {
case 0, 1 -> SUB_COMMANDS.keySet().stream().filter(n -> user.hasPermission(getPermission(n))).toList();
default -> switch (args[0].toLowerCase(Locale.ENGLISH)) {
case "import" -> switch (args.length - 2) {
case 0 -> plugin.getImporters().stream().map(Importer::getName).toList();
case 1 -> List.of("start", "set", "reset");
case 0 -> plugin.getImporters().stream()
.map(Importer::getName)
.collect(Collectors.toList());
case 1 -> {
if (args[1].equalsIgnoreCase("database")) {
yield List.of("mysql", "sqlite", "mariadb");
}
yield List.of("start", "set", "reset");
}
case 2 -> {
if (args[1].equalsIgnoreCase("database")) {
yield List.of("mysql", "sqlite", "mariadb");
}
yield plugin.getImporters().stream().filter(i -> i.getName().equalsIgnoreCase(args[1]))
.flatMap(i -> i.getRequiredParameters().keySet().stream()
.filter(p -> parseKeyValues(args, 3).keySet().stream()
.noneMatch(p::equalsIgnoreCase))
.map("%s:"::formatted)).toList();
}
default -> plugin.getImporters().stream().filter(i -> i.getName().equalsIgnoreCase(args[1]))
.flatMap(i -> i.getRequiredParameters().keySet().stream()
.filter(p -> parseKeyValues(args, 3).keySet().stream()
Expand All @@ -194,6 +212,48 @@ public List<String> suggest(@NotNull CommandUser user, @NotNull String[] args) {
}

private void handleImportCommand(@NotNull CommandUser executor, @NotNull String[] args) {
// Special handling for database import command
if (args.length >= 3 && args[0].equalsIgnoreCase("database")) {
final String sourceType = args[1].toLowerCase(Locale.ENGLISH);
final String targetType = args[2].toLowerCase(Locale.ENGLISH);

// Validate database types
if (!isValidDatabaseType(sourceType)) {
plugin.getLocales().getLocale("error_invalid_database_type", sourceType)
.ifPresent(executor::sendMessage);
return;
}
if (!isValidDatabaseType(targetType)) {
plugin.getLocales().getLocale("error_invalid_database_type", targetType)
.ifPresent(executor::sendMessage);
return;
}

// Compare normalized types (treat mariadb as mysql)
String normalizedSource = normalizeDbType(sourceType);
String normalizedTarget = normalizeDbType(targetType);
if (normalizedSource.equalsIgnoreCase(normalizedTarget)) {
plugin.getLocales().getLocale("error_same_database_type")
.ifPresent(executor::sendMessage);
return;
}

// Get the database importer
final Optional<Importer> optionalImporter = plugin.getImporterByName("database");
if (optionalImporter.isEmpty()) {
plugin.getLocales().getLocale("error_importer_not_found", "database")
.ifPresent(executor::sendMessage);
return;
}

// Set source and target database types and start import
final DatabaseImporter databaseImporter = (DatabaseImporter) optionalImporter.get();
databaseImporter.setDatabaseTypes(sourceType, targetType);
databaseImporter.start(executor);
return;
}

// Standard importer handling
final Optional<Importer> optionalImporter = parseStringArg(args, 0).flatMap(plugin::getImporterByName);
if (optionalImporter.isEmpty()) {
plugin.getLocales().getLocale("available_importers", plugin.getImporters().stream()
Expand All @@ -213,6 +273,22 @@ private void handleImportCommand(@NotNull CommandUser executor, @NotNull String[
}
}

/**
* Check if a database type is valid (mysql, mariadb, or sqlite)
*/
private boolean isValidDatabaseType(String dbType) {
return dbType.equalsIgnoreCase("mysql") ||
dbType.equalsIgnoreCase("mariadb") ||
dbType.equalsIgnoreCase("sqlite");
}

/**
* Normalize database type names (treats mariadb as mysql)
*/
private String normalizeDbType(String dbType) {
return dbType.equalsIgnoreCase("mariadb") ? "mysql" : dbType;
}

private void handleLogsCommand(@NotNull CommandUser executor, @NotNull String[] args) {
final Optional<SavedUser> optionalUser = parseStringArg(args, 0).flatMap(plugin.getDatabase()::getUser);
if (optionalUser.isEmpty()) {
Expand Down
Loading
Loading