From 22021a10917626370d9dfa3eb32ef3f7ec22dd07 Mon Sep 17 00:00:00 2001 From: rozhur Date: Fri, 11 Aug 2023 19:36:35 +0500 Subject: [PATCH] Refactor to BukkitPreparedPlugin --- .../zhdev/varioutil/BukkitPreparedPlugin.java | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 bukkit/src/main/java/org/zhdev/varioutil/BukkitPreparedPlugin.java diff --git a/bukkit/src/main/java/org/zhdev/varioutil/BukkitPreparedPlugin.java b/bukkit/src/main/java/org/zhdev/varioutil/BukkitPreparedPlugin.java new file mode 100644 index 0000000..a254498 --- /dev/null +++ b/bukkit/src/main/java/org/zhdev/varioutil/BukkitPreparedPlugin.java @@ -0,0 +1,200 @@ +package org.zhdev.varioutil; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.TabCompleter; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.event.Listener; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.java.JavaPluginLoader; +import org.jetbrains.annotations.NotNull; +import org.zhdev.varioutil.bukkit.command.PreparedPluginCommand; +import org.zhdev.varioutil.config.BukkitYamlConfig; +import org.zhdev.varioutil.config.Config; +import org.zhdev.varioutil.config.ConfigSection; +import org.zhdev.varioutil.language.Language; +import org.zhdev.varioutil.sql.SqlAdapter; +import org.zhdev.varioutil.util.BukkitUtils; +import org.zhdev.varioutil.util.CollectionUtils; +import org.zhdev.varioutil.util.ColorUtils; +import org.zhdev.varioutil.util.ConfigUtils; + +import java.io.File; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.logging.Level; + +public abstract class BukkitPreparedPlugin extends BukkitPlugin implements Listener, PreparedPlugin { + protected final Path dataDirectory; + protected final Config defaultConfig = new BukkitYamlConfig(); + protected final Language language = new Language(); + protected final SqlAdapter sqlAdapter = createSqlAdapter(); + + private ExecutorService singleThreadExecutor; + + public BukkitPreparedPlugin() { + super(); + dataDirectory = getDataFolder().toPath(); + } + + protected BukkitPreparedPlugin(@NotNull JavaPluginLoader loader, @NotNull PluginDescriptionFile description, @NotNull File dataFolder, @NotNull File file) { + super(loader, description, dataFolder, file); + dataDirectory = getDataFolder().toPath(); + } + + protected SqlAdapter createSqlAdapter() { + return new SqlAdapter(); + } + + protected void closeSqlAdapter() { + sqlAdapter.close(); + } + + public Command registerPreparedCommand(CommandExecutor executor, TabCompleter completer, String permission, String label, String... aliases) { + Command command = super.registerCommand(executor, completer, label); + if (command == null) { + command = new PreparedPluginCommand(label, this, executor, completer); + command.setPermission(permission); + command.setAliases(Arrays.asList(aliases)); + ConfigSection commandsSection = defaultConfig.getSection("commands"); + if (commandsSection != null) { + Object rawSection = commandsSection.get(label.toLowerCase()); + if (rawSection instanceof Boolean && !((Boolean) rawSection)) { + return command; + } + if (rawSection instanceof ConfigSection) { + ConfigSection commandSection = (ConfigSection) rawSection; + command.setAliases(CollectionUtils.mapToString(commandSection.getList("aliases", command.getAliases()), ArrayList::new)); + command.setDescription(commandSection.getString("description")); + command.setUsage(commandSection.getString("usage")); + String configPermission = commandSection.getString("permission", permission); + command.setPermission(configPermission == null || configPermission.isEmpty() || configPermission.equals("false") ? null : configPermission); + command.setPermissionMessage(commandSection.getString("permission-message")); + } + } + BukkitUtils.registerCommand(getName(), label, command); + } else { + if (command.getPermission() == null) command.setPermission(permission); + if (command.getAliases().isEmpty()) command.setAliases(Arrays.asList(aliases)); + } + return command; + } + + public Command registerPreparedCommand(CommandExecutor executor, String permission, String label, String... aliases) { + return registerPreparedCommand(executor, this, permission, label, aliases); + } + + @Override + public Command registerCommand(CommandExecutor executor, TabCompleter completer, String label) { + return registerPreparedCommand(executor, completer, null, label); + } + + @Override + public Path getDataDirectory() { + return dataDirectory; + } + + @Deprecated + @NotNull + @Override + public final FileConfiguration getConfig() { + throw new UnsupportedOperationException("You should use PreparedBukkitPlugin#getConfiguration"); + } + + public Config getDefaultConfig() { + return defaultConfig; + } + + public void loadDefaultConfig() { + loadConfig(defaultConfig); + } + + public Language getLanguage() { + return language; + } + + public SqlAdapter getSqlAdapter() { + return sqlAdapter; + } + + protected void loadPhrases() { + ConfigSection languageSection = defaultConfig.getOrCreateSection("language"); + String locale = languageSection.getString("locale", "default"); + Config languageConfig = new BukkitYamlConfig("language/" + locale + ".yml"); + loadConfig(languageConfig, "language.yml"); + loadConfig(languageConfig, "language/default.yml"); + loadConfig(languageConfig); + ConfigUtils.addPhrases(language, languageConfig, ColorUtils::translateAlternateColorCodes); + } + + protected void establishSqlConnection() { + Config databaseConfig = new BukkitYamlConfig("database.yml"); + loadConfig(databaseConfig); + sqlAdapter.setProvider(ConfigUtils.createSqlConnectionProvider(databaseConfig, getDataFolder().getPath())); + } + + protected void onLoading() {} + + protected void onEnabling() {} + + protected void onDisabling() {} + + private void load() { + loadDefaultConfig(); + loadPhrases(); + establishSqlConnection(); + } + + @Override + public final void onLoad() { + load(); + onLoading(); + } + + private void enable() { + registerEvents(this); + } + + @Override + public final void onEnable() { + enable(); + onEnabling(); + } + + private void disable() { + closeSqlAdapter(); + defaultConfig.clear(); + + if (singleThreadExecutor != null) { + singleThreadExecutor.shutdownNow(); + } + } + + @Override + public final void onDisable() { + try { + onDisabling(); + disable(); + } catch (Exception e) { + disable(); + throw e; + } + } + + public void runTaskSeparately(Runnable runnable) { + if (singleThreadExecutor == null) { + singleThreadExecutor = Executors.newSingleThreadExecutor(); + } + + singleThreadExecutor.execute(() -> { + try { + runnable.run(); + } catch (Throwable throwable) { + getLogger().log(Level.SEVERE, "Unhandled exception while running separated task", throwable); + } + }); + } +}