272 lines
9.4 KiB
Java
272 lines
9.4 KiB
Java
package com.songoda.core;
|
|
|
|
import com.songoda.core.configuration.songoda.SongodaYamlConfig;
|
|
import com.songoda.core.database.DataManagerAbstract;
|
|
import com.songoda.core.utils.Metrics;
|
|
import com.songoda.core.utils.SongodaAuth;
|
|
import de.tr7zw.changeme.nbtapi.utils.MinecraftVersion;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.command.CommandSender;
|
|
import org.bukkit.configuration.file.FileConfiguration;
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import java.util.List;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.logging.Level;
|
|
|
|
/**
|
|
* REMINDER: When converting plugins to use this, REMOVE METRICS <br>
|
|
* Must not have two instances of Metrics enabled!
|
|
*/
|
|
public abstract class SongodaPlugin extends JavaPlugin {
|
|
// protected Locale locale;
|
|
protected long dataLoadDelay = 20L;
|
|
|
|
private boolean emergencyStop = false;
|
|
|
|
static {
|
|
/* NBT-API */
|
|
MinecraftVersion.getLogger().setLevel(Level.WARNING);
|
|
MinecraftVersion.disableUpdateCheck();
|
|
}
|
|
|
|
public abstract void onPluginLoad();
|
|
|
|
public abstract void onPluginEnable();
|
|
|
|
public abstract void onPluginDisable();
|
|
|
|
public abstract void onDataLoad();
|
|
|
|
/**
|
|
* All the configuration files belonging to the plugin.<br>
|
|
* This might for example be used for the ingame config editor.<br>
|
|
* <br>
|
|
* Do not include *storage* files here or anything similar that does not intend external modification and access.<br>
|
|
* <br>
|
|
* Do not include language files if you are using the Core's localization system.
|
|
*/
|
|
public abstract @NotNull List<SongodaYamlConfig> getConfigs();
|
|
|
|
@Override
|
|
public final void onLoad() {
|
|
try {
|
|
onPluginLoad();
|
|
} catch (Throwable th) {
|
|
criticalErrorOnPluginStartup(th);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public final void onEnable() {
|
|
if (this.emergencyStop) {
|
|
setEnabled(false);
|
|
|
|
return;
|
|
}
|
|
|
|
CommandSender console = Bukkit.getConsoleSender();
|
|
|
|
// Check plugin access, don't load plugin if user don't have access
|
|
if (!SongodaAuth.isAuthorized(true)) {
|
|
String pluginName = getDescription().getName();
|
|
|
|
new Thread(() -> {
|
|
String externalIP = SongodaAuth.getIP();
|
|
String serverUuid = SongodaAuth.getUUID().toString();
|
|
|
|
String message = "\n" +
|
|
ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +
|
|
ChatColor.RED + "You do not have access to the " + pluginName + " plugin.\n" +
|
|
ChatColor.YELLOW + "Please purchase a license at https://sngda.to/marketplace\n" +
|
|
ChatColor.YELLOW + "or set up your license at https://sngda.to/licenses\n" +
|
|
ChatColor.YELLOW + "License setup steps:\n" +
|
|
ChatColor.YELLOW + "Visit the link mentioned above and click the 'Create License' button.\n" +
|
|
ChatColor.YELLOW + "Copy the following IP address and UUID and click create.\n" +
|
|
ChatColor.YELLOW + "UUID: " + serverUuid + "\n" +
|
|
ChatColor.YELLOW + "IP: " + externalIP + "\n" +
|
|
ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
|
|
console.sendMessage(message);
|
|
}).start();
|
|
|
|
emergencyStop();
|
|
return;
|
|
}
|
|
|
|
console.sendMessage(" "); // blank line to separate chatter
|
|
console.sendMessage(ChatColor.GREEN + "=============================");
|
|
console.sendMessage(String.format("%s%s %s by %sCraftaro <3!", ChatColor.GRAY,
|
|
getDescription().getName(), getDescription().getVersion(), ChatColor.DARK_PURPLE));
|
|
console.sendMessage(String.format("%sAction: %s%s%s...", ChatColor.GRAY,
|
|
ChatColor.GREEN, "Enabling", ChatColor.GRAY));
|
|
|
|
try {
|
|
// this.locale = Locale.loadDefaultLocale(this, "en_US");
|
|
|
|
// plugin setup
|
|
onPluginEnable();
|
|
|
|
if (this.emergencyStop) {
|
|
return;
|
|
}
|
|
|
|
// Load Data.
|
|
Bukkit.getScheduler().runTaskLater(this, this::onDataLoad, this.dataLoadDelay);
|
|
|
|
if (this.emergencyStop) {
|
|
console.sendMessage(ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
|
|
console.sendMessage(" ");
|
|
return;
|
|
}
|
|
|
|
// Start Metrics
|
|
Metrics.start(this);
|
|
} catch (Throwable th) {
|
|
criticalErrorOnPluginStartup(th);
|
|
|
|
console.sendMessage(ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
|
|
console.sendMessage(" ");
|
|
|
|
return;
|
|
}
|
|
|
|
console.sendMessage(ChatColor.GREEN + "=============================");
|
|
console.sendMessage(" "); // blank line to separate chatter
|
|
}
|
|
|
|
@Override
|
|
public final void onDisable() {
|
|
if (this.emergencyStop) {
|
|
return;
|
|
}
|
|
|
|
CommandSender console = Bukkit.getConsoleSender();
|
|
|
|
console.sendMessage(" "); // blank line to separate chatter
|
|
console.sendMessage(ChatColor.GREEN + "=============================");
|
|
console.sendMessage(String.format("%s%s %s by %sCraftaro <3!", ChatColor.GRAY,
|
|
getDescription().getName(), getDescription().getVersion(), ChatColor.DARK_PURPLE));
|
|
console.sendMessage(String.format("%sAction: %s%s%s...", ChatColor.GRAY,
|
|
ChatColor.RED, "Disabling", ChatColor.GRAY));
|
|
|
|
onPluginDisable();
|
|
|
|
console.sendMessage(ChatColor.GREEN + "=============================");
|
|
console.sendMessage(" "); // blank line to separate chatter
|
|
}
|
|
|
|
// public Locale getLocale() {
|
|
// return this.locale;
|
|
// }
|
|
|
|
// /**
|
|
// * Set the plugin's locale to a specific language
|
|
// *
|
|
// * @param localeName locale to use, eg "en_US"
|
|
// * @param reload optionally reload the loaded locale if the locale didn't
|
|
// * change
|
|
// *
|
|
// * @return true if the locale exists and was loaded successfully
|
|
// */
|
|
// public boolean setLocale(String localeName, boolean reload) {
|
|
// if (this.locale != null && this.locale.getName().equals(localeName)) {
|
|
// return !reload || this.locale.reloadMessages();
|
|
// }
|
|
//
|
|
// Locale l = Locale.loadLocale(this, localeName);
|
|
// if (l != null) {
|
|
// this.locale = l;
|
|
// return true;
|
|
// }
|
|
//
|
|
// return false;
|
|
// }
|
|
|
|
protected void shutdownDataManager(DataManagerAbstract dataManager) {
|
|
// 3 minutes is overkill, but we just want to make sure
|
|
shutdownDataManager(dataManager, 15, TimeUnit.MINUTES.toSeconds(3));
|
|
}
|
|
|
|
protected void shutdownDataManager(DataManagerAbstract dataManager, int reportInterval, long secondsUntilForceShutdown) {
|
|
dataManager.shutdownTaskQueue();
|
|
|
|
while (!dataManager.isTaskQueueTerminated() && secondsUntilForceShutdown > 0) {
|
|
long secondsToWait = Math.min(reportInterval, secondsUntilForceShutdown);
|
|
|
|
try {
|
|
if (dataManager.waitForShutdown(secondsToWait, TimeUnit.SECONDS)) {
|
|
break;
|
|
}
|
|
|
|
getLogger().info(String.format("A DataManager is currently working on %d tasks... " +
|
|
"We are giving him another %d seconds until we forcefully shut him down " +
|
|
"(continuing to report in %d second intervals)",
|
|
dataManager.getTaskQueueSize(), secondsUntilForceShutdown, reportInterval));
|
|
} catch (InterruptedException ignore) {
|
|
} finally {
|
|
secondsUntilForceShutdown -= secondsToWait;
|
|
}
|
|
}
|
|
|
|
if (!dataManager.isTaskQueueTerminated()) {
|
|
int unfinishedTasks = dataManager.forceShutdownTaskQueue().size();
|
|
|
|
if (unfinishedTasks > 0) {
|
|
getLogger().log(Level.WARNING,
|
|
String.format("A DataManager has been forcefully terminated with %d unfinished tasks - " +
|
|
"This can be a serious problem, please report it to us (Craftaro / Songoda)!", unfinishedTasks));
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void emergencyStop() {
|
|
this.emergencyStop = true;
|
|
|
|
Bukkit.getPluginManager().disablePlugin(this);
|
|
}
|
|
|
|
/**
|
|
* Logs one or multiple errors that occurred during plugin startup and calls {@link #emergencyStop()} afterwards
|
|
*
|
|
* @param th The error(s) that occurred
|
|
*/
|
|
protected void criticalErrorOnPluginStartup(Throwable th) {
|
|
Bukkit.getLogger().log(Level.SEVERE,
|
|
String.format(
|
|
"Unexpected error while loading %s v%s (core v%s): Disabling plugin!",
|
|
getDescription().getName(),
|
|
getDescription().getVersion(),
|
|
SongodaCore.getVersion()
|
|
), th);
|
|
|
|
emergencyStop();
|
|
}
|
|
|
|
/**
|
|
* Use {@link SongodaYamlConfig} instead.
|
|
*/
|
|
@Deprecated
|
|
@Override
|
|
public @NotNull FileConfiguration getConfig() {
|
|
return super.getConfig();
|
|
}
|
|
|
|
/**
|
|
* Use {@link SongodaYamlConfig} instead.
|
|
*/
|
|
@Deprecated
|
|
@Override
|
|
public void reloadConfig() {
|
|
}
|
|
|
|
/**
|
|
* Use {@link SongodaYamlConfig} instead.
|
|
*/
|
|
@Deprecated
|
|
@Override
|
|
public void saveConfig() {
|
|
}
|
|
}
|