Back

BaseModule.java

java
src/main/java/com/scriptslab/core/module/BaseModule.java
package com.scriptslab.core.module;

import com.scriptslab.api.module.Module;
import com.scriptslab.api.module.ModuleDescriptor;

import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

import java.io.File;
import java.nio.file.Path;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;

/**
 * Abstract base implementation of Module.
 * Provides common functionality for all modules.
 */
public abstract class BaseModule implements Module {
    
    protected final ModuleDescriptor descriptor;
    protected final Path dataFolder;
    protected final Logger logger;
    protected final AtomicBoolean enabled;
    
    private FileConfiguration config;
    
    protected BaseModule(ModuleDescriptor descriptor, Path dataFolder) {
        this.descriptor = descriptor;
        this.dataFolder = dataFolder;
        this.logger = Logger.getLogger(getLoggerName());
        this.enabled = new AtomicBoolean(false);
        
        // Create data folder
        dataFolder.toFile().mkdirs();
    }
    
    @Override
    public String getId() {
        return descriptor.id();
    }
    
    @Override
    public String getName() {
        return descriptor.name();
    }
    
    @Override
    public String getVersion() {
        return descriptor.version();
    }
    
    @Override
    public ModuleDescriptor getDescriptor() {
        return descriptor;
    }
    
    @Override
    public Path getDataFolder() {
        return dataFolder;
    }
    
    @Override
    public FileConfiguration getConfig() {
        if (config == null) {
            loadConfig();
        }
        return config;
    }
    
    @Override
    public boolean isEnabled() {
        return enabled.get();
    }
    
    /**
     * Loads the module configuration.
     */
    protected void loadConfig() {
        File configFile = dataFolder.resolve("config.yml").toFile();
        
        if (!configFile.exists()) {
            // Create default config
            saveDefaultConfig();
        }
        
        config = YamlConfiguration.loadConfiguration(configFile);
    }
    
    /**
     * Saves the default configuration.
     * Override to provide default config values.
     */
    protected void saveDefaultConfig() {
        File configFile = dataFolder.resolve("config.yml").toFile();
        
        if (!configFile.exists()) {
            try {
                configFile.createNewFile();
                FileConfiguration defaultConfig = new YamlConfiguration();
                provideDefaultConfig(defaultConfig);
                defaultConfig.save(configFile);
            } catch (Exception e) {
                logger.warning("Failed to create default config: " + e.getMessage());
            }
        }
    }
    
    /**
     * Override to provide default configuration values.
     * 
     * @param config configuration to populate
     */
    protected void provideDefaultConfig(FileConfiguration config) {
        config.set("enabled", true);
    }
    
    /**
     * Saves the current configuration.
     */
    protected void saveConfig() {
        if (config != null) {
            try {
                File configFile = dataFolder.resolve("config.yml").toFile();
                config.save(configFile);
            } catch (Exception e) {
                logger.warning("Failed to save config: " + e.getMessage());
            }
        }
    }
    
    /**
     * Reloads the configuration.
     */
    protected void reloadConfig() {
        config = null;
        loadConfig();
    }
    
    /**
     * Logs an info message.
     */
    protected void log(String message) {
        logger.info(message);
    }
    
    /**
     * Logs a warning message.
     */
    protected void warn(String message) {
        logger.warning(message);
    }
    
    /**
     * Logs a severe message.
     */
    protected void error(String message) {
        logger.severe(message);
    }
    
    /**
     * Logs an error with exception.
     */
    protected void error(String message, Throwable throwable) {
        logger.severe(message);
        logger.severe(throwable.getMessage());
    }
    
    @Override
    public CompletableFuture<Void> onLoad() {
        return CompletableFuture.runAsync(() -> {
            log("Loading module...");
            loadConfig();
        });
    }
    
    @Override
    public CompletableFuture<Void> onEnable() {
        return CompletableFuture.runAsync(() -> {
            log("Enabling module...");
            enabled.set(true);
        });
    }
    
    @Override
    public CompletableFuture<Void> onDisable() {
        return CompletableFuture.runAsync(() -> {
            log("Disabling module...");
            enabled.set(false);
        });
    }
    
    @Override
    public String toString() {
        return String.format("Module{id=%s, name=%s, version=%s, enabled=%s}",
                getId(), getName(), getVersion(), isEnabled());
    }
}