Skip to content
Merged
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
15 changes: 12 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,19 @@ group = 'org.mvplugins.multiverse.inventories'
description = 'Multiverse-Inventories'

repositories {
maven {
name = 'codemc'
url = uri('https://repo.codemc.org/repository/maven-releases')
}

maven {
name = 'benwoo1110'
url = uri('https://repo.c0ding.party/multiverse-beta')
}
}

configure(apiDependencies) {
serverApiVersion = '1.21.4-R0.1-SNAPSHOT'
serverApiVersion = '1.21.3-R0.1-SNAPSHOT'
mockBukkitServerApiVersion = '1.21'
mockBukkitVersion = '4.31.1'
}
Expand All @@ -35,10 +40,14 @@ dependencies {
}

// Other plugins for import
externalPlugin('uk.co:MultiInv:3.0.6') {
compileOnly('uk.co:MultiInv:3.0.6') {
exclude group: '*', module: '*'
}
compileOnly('me.drayshak:WorldInventories:1.0.2') {
exclude group: '*', module: '*'
}
externalPlugin('me.drayshak:WorldInventories:1.0.2') {
// perworldinventory is weird and has snakeyaml included in the jar, so we can only use compileOnly for build to work properly
compileOnly('me.ebonjaeger:perworldinventory-kt:2.3.2') {
exclude group: '*', module: '*'
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,27 @@
import org.mvplugins.multiverse.core.utils.StringFormatter;
import org.mvplugins.multiverse.inventories.commands.InventoriesCommand;
import org.mvplugins.multiverse.inventories.config.InventoriesConfig;
import org.mvplugins.multiverse.inventories.dataimport.DataImportManager;
import org.mvplugins.multiverse.inventories.dataimport.DataImporter;
import org.mvplugins.multiverse.inventories.listeners.InventoriesListener;
import org.mvplugins.multiverse.inventories.listeners.SpawnChangeListener;
import org.mvplugins.multiverse.inventories.locale.Message;
import org.mvplugins.multiverse.inventories.locale.Messager;
import org.mvplugins.multiverse.inventories.locale.Messaging;
import org.mvplugins.multiverse.inventories.migration.ImportManager;
import org.mvplugins.multiverse.inventories.profile.PersistingProfile;
import org.mvplugins.multiverse.inventories.profile.ProfileDataSource;
import org.mvplugins.multiverse.inventories.profile.container.ContainerType;
import org.mvplugins.multiverse.inventories.profile.container.ProfileContainerStoreProvider;
import org.mvplugins.multiverse.inventories.profile.group.WorldGroupManager;
import org.mvplugins.multiverse.inventories.share.Sharables;
import org.mvplugins.multiverse.inventories.util.Perm;
import me.drayshak.WorldInventories.WorldInventories;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.mvplugins.multiverse.core.commandtools.MVCommandManager;
import org.mvplugins.multiverse.core.inject.PluginServiceLocator;
import org.mvplugins.multiverse.external.jakarta.inject.Inject;
import org.mvplugins.multiverse.external.jakarta.inject.Provider;
import org.jvnet.hk2.annotations.Service;
import org.mvplugins.multiverse.external.vavr.control.Try;
import uk.co.tggl.pluckerpluck.multiinv.MultiInv;

/**
* Multiverse-Inventories plugin main class.
Expand All @@ -59,7 +56,7 @@ public class MultiverseInventories extends MultiversePlugin implements Messaging
@Inject
private Provider<ProfileContainerStoreProvider> profileContainerStoreProvider;
@Inject
private Provider<ImportManager> importManager;
private Provider<DataImportManager> dataImportManager;

private PluginServiceLocator serviceLocator;
private Messager messager = new DefaultMessager(this);
Expand All @@ -86,9 +83,9 @@ public void onLoad() {
public final void onEnable() {
super.onEnable();
initializeDependencyInjection();
Logging.setDebugLevel(mvCoreConfig.get().getGlobalDebug());
inventoriesConfig.get().load().onFailure(e -> Logging.severe(e.getMessage()));

Logging.setDebugLevel(mvCoreConfig.get().getGlobalDebug());
this.onMVPluginEnable();
Logging.config("Version %s (API v%s) Enabled - By %s",
this.getDescription().getVersion(), getTargetCoreProtocolVersion(), StringFormatter.joinAnd(this.getDescription().getAuthors()));
Expand Down Expand Up @@ -174,15 +171,9 @@ private void registerCommands() {
}

private void hookImportables() {
final PluginManager pm = Bukkit.getPluginManager();
Plugin plugin = pm.getPlugin("MultiInv");
if (plugin != null) {
importManager.get().hookMultiInv((MultiInv) plugin);
}
plugin = pm.getPlugin("WorldInventories");
if (plugin != null) {
importManager.get().hookWorldInventories((WorldInventories) plugin);
}
serviceLocator.getAllServices(DataImporter.class).forEach(dataImporter -> {
dataImportManager.get().register(dataImporter);
});
}

/**
Expand All @@ -207,6 +198,8 @@ public PluginServiceLocator getServiceLocator() {
@Override
public void reloadConfig() {
try {
Logging.setDebugLevel(mvCoreConfig.get().getGlobalDebug());

inventoriesConfig.get().load().onFailure(e -> {
Logging.severe("Failed to load config file!");
Logging.severe(e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.mvplugins.multiverse.inventories.commands;

import org.jetbrains.annotations.NotNull;
import org.jvnet.hk2.annotations.Service;
import org.mvplugins.multiverse.core.commandtools.MVCommandIssuer;
import org.mvplugins.multiverse.core.commandtools.MVCommandManager;
import org.mvplugins.multiverse.core.commandtools.queue.CommandQueueManager;
import org.mvplugins.multiverse.core.commandtools.queue.CommandQueuePayload;
import org.mvplugins.multiverse.core.locale.message.Message;
import org.mvplugins.multiverse.external.acf.commands.annotation.CommandAlias;
import org.mvplugins.multiverse.external.acf.commands.annotation.CommandCompletion;
import org.mvplugins.multiverse.external.acf.commands.annotation.CommandPermission;
import org.mvplugins.multiverse.external.acf.commands.annotation.Description;
import org.mvplugins.multiverse.external.acf.commands.annotation.Single;
import org.mvplugins.multiverse.external.acf.commands.annotation.Subcommand;
import org.mvplugins.multiverse.external.acf.commands.annotation.Syntax;
import org.mvplugins.multiverse.external.jakarta.inject.Inject;
import org.mvplugins.multiverse.inventories.dataimport.DataImportManager;
import org.mvplugins.multiverse.inventories.dataimport.DataImporter;

import static org.mvplugins.multiverse.core.locale.message.MessageReplacement.replace;

@Service
@CommandAlias("mvinv")
final class ImportCommand extends InventoriesCommand {

private final DataImportManager dataImportManager;
private final CommandQueueManager commandQueueManager;

@Inject
ImportCommand(
@NotNull MVCommandManager commandManager,
@NotNull DataImportManager dataImportManager,
@NotNull CommandQueueManager commandQueueManager) {
super(commandManager);
this.dataImportManager = dataImportManager;
this.commandQueueManager = commandQueueManager;
}

@Subcommand("import")
@Syntax("<MultiInv|WorldInventories|PerWorldInventory>")
@CommandPermission("multiverse.inventories.import")
@CommandCompletion("MultiInv|WorldInventories|PerWorldInventory")
@Description("Import inventories from MultiInv/WorldInventories/PerWorldInventory plugin.")
public void onImportCommand(
MVCommandIssuer issuer,

@Single
@Syntax("<MultiInv|WorldInventories|PerWorldInventory>")
String pluginName) {

dataImportManager.getImporter(pluginName)
.onEmpty(() -> issuer.sendMessage("No importer found for " + pluginName))
.peek(dataImporter -> {
if (!dataImporter.isEnabled()) {
issuer.sendMessage("Plugin " + pluginName + " is not running on your server!");
return;
}
commandQueueManager.addToQueue(CommandQueuePayload.issuer(issuer)
.prompt(Message.of("Are you sure you want to import data from {plugin}? " +
"This will override existing Multiverse-Inventories playerdata!!!",
replace("{plugin}").with(pluginName)))
.action(() -> doDataImport(issuer, dataImporter)));
});
}

void doDataImport(MVCommandIssuer issuer, DataImporter dataImporter) {
if (dataImporter.importData()) {
issuer.sendMessage("Successfully to imported data from " + dataImporter.getPluginName() + "!");
} else {
issuer.sendMessage("Failed to import data from " + dataImporter.getPluginName() + ".");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package org.mvplugins.multiverse.inventories.dataimport;

import com.dumptruckman.minecraft.util.Logging;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.jvnet.hk2.annotations.Contract;

/**
* Abstract implementation of {@link DataImporter} without actual import logic.
*/
@Contract
public abstract class AbstractDataImporter implements DataImporter {

protected Plugin importer = null;

public AbstractDataImporter() {
}

/**
* Logic that does the actual importing data.
*
* @throws DataImportException Errors occurred that caused import to fail.
*/
protected abstract void doDataImport() throws DataImportException;

/**
* {@inheritDoc}
*/
@Override
public boolean importData(boolean disableOnSuccess) {
if (!isEnabled()) {
Logging.severe("Data importer %s not enabled. No data is imported.", this.getPluginName());
return false;
}

try {
doDataImport();
} catch (DataImportException e) {
Logging.severe(e.getMessage());
if(e.getCauseException() != null) {
Logging.severe("Cause: %s", e.getCauseException().getMessage());
}
e.printStackTrace();
return false;
}

Logging.info("Successfully imported data from %s!", this.getPluginName());
if (disableOnSuccess) {
Logging.info("Disabling %s...", this.getPluginName());
Bukkit.getPluginManager().disablePlugin(this.importer);
}
return true;
}

/**
* {@inheritDoc}
*/
@Override
public boolean importData() {
return importData(true);
}

/**
* {@inheritDoc}
*/
@Override
public boolean enable(Plugin importerPlugin) {
if (isEnabled()) {
return false;
}
if (!importerPlugin.getClass().equals(this.getPluginClass())) {
Logging.warning("Plugin '%s' is not data importer for '%s'.",
importerPlugin.getClass().getName(), getPluginName());
return false;
}
try {
this.importer = importerPlugin;
} catch (ClassCastException | NoClassDefFoundError e) {
Logging.warning("Error while enabling data importer for '%s'.", getPluginName());
return false;
}
Logging.info("Successfully enabled data importer for '%s'.", getPluginName());
return true;
}

/**
* {@inheritDoc}
*/
@Override
public boolean enable() {
Plugin importerPlugin = Bukkit.getPluginManager().getPlugin(this.getPluginName());
if (importerPlugin == null) {
Logging.finer("Unable to get plugin '%s' for import hook.", this.getPluginName());
return false;
}
return enable(importerPlugin);
}

/**
* {@inheritDoc}
*/
@Override
public boolean disable() {
this.importer = null;
Logging.info("Successfully disabled data importer for '%s'.", getPluginName());
return true;
}

/**
* {@inheritDoc}
*/
@Override
public boolean isEnabled() {
return importer != null;
}

/**
* {@inheritDoc}
*/
@Override
public Plugin getPlugin() {
return importer;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.mvplugins.multiverse.inventories.dataimport;

import org.mvplugins.multiverse.core.exceptions.MultiverseException;
import org.mvplugins.multiverse.core.locale.message.Message;
import org.mvplugins.multiverse.external.jetbrains.annotations.Nullable;

/**
* Exception thrown when migration doesn't go well.
*/
public class DataImportException extends MultiverseException {

private Exception causeException = null;

public DataImportException(@Nullable String message) {
super(message);
}

public DataImportException(@Nullable String message, Exception causeException) {
super(message);
this.causeException = causeException;
}

public DataImportException(@Nullable Message message, Exception causeException) {
super(message);
this.causeException = causeException;
}

public DataImportException(@Nullable String message, @Nullable Throwable cause, Exception causeException) {
super(message, cause);
this.causeException = causeException;
}

public DataImportException(@Nullable Message message, @Nullable Throwable cause, Exception causeException) {
super(message, cause);
this.causeException = causeException;
}

/**
* Sets what the causing exception was, if any.
*
* @param exception The cause exception.
* @return This exception for easy chainability.
*/
public DataImportException setCauseException(Exception exception) {
this.causeException = exception;
return this;
}

/**
* @return The causing exception or null if none.
*/
public Exception getCauseException() {
return this.causeException;
}
}

Loading