org.arkhamnetwork.arcade.core.Arcade.java Source code

Java tutorial

Introduction

Here is the source code for org.arkhamnetwork.arcade.core.Arcade.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.arkhamnetwork.arcade.core;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.io.FileUtils;
import org.arkhamnetwork.arcade.commons.configuration.yaml.file.FileConfiguration;
import org.arkhamnetwork.arcade.commons.configuration.yaml.file.YamlConfiguration;
import org.arkhamnetwork.arcade.commons.hooks.BukkitHook;
import org.arkhamnetwork.arcade.commons.hooks.MinecraftServerHook;
import org.arkhamnetwork.arcade.commons.hooks.SpigotHook;
import org.arkhamnetwork.arcade.commons.patches.TileEntityMemoryLeakFixTask;
import org.arkhamnetwork.arcade.commons.plugin.ArcadeMiniPlugin;
import org.arkhamnetwork.arcade.commons.plugin.ArcadePlugin;
import org.arkhamnetwork.arcade.commons.server.ServerType;
import org.arkhamnetwork.arcade.commons.userstorage.UserManager;
import org.arkhamnetwork.arcade.commons.utils.BarUtils;
import org.arkhamnetwork.arcade.commons.utils.ConfigUtils;
import org.arkhamnetwork.arcade.commons.utils.URLUtils;
import org.arkhamnetwork.arcade.core.configuration.ArcadeConfiguration;
import org.arkhamnetwork.arcade.core.configuration.ArcadeWebConfiguration;
import org.arkhamnetwork.arcade.core.configuration.MySQLCredentials;
import org.arkhamnetwork.arcade.core.listener.LobbySignsListener;
import org.arkhamnetwork.arcade.minigame.MinigameType;
import org.arkhamnetwork.arcade.miniplugin.mysqlconnector.mySQLConnector;
import org.arkhamnetwork.arcade.miniplugin.namedatabase.NameDatabase;
import org.bukkit.plugin.PluginManager;

/**
 *
 * @author devan_000
 */
public class Arcade extends ArcadePlugin {

    /**
     * Craft the ArcadePlugin instance
     */
    public Arcade() {
        super("Arcade", "0.1-SNAPSHOT");
    }

    @Getter
    private static Arcade instance;

    @Getter
    @Setter
    private static boolean serverOnline = false;

    @Getter
    private List<ArcadeMiniPlugin> loadedMiniPlugins = new ArrayList<>();

    @Getter
    private final String WEB_CONFIG_LOCATION = "Arcade.yml";

    @Override
    public void onEnable() {
        try {
            // Needed - ArcadePlugin.
            super.onEnable();

            instance = this;

            SpigotHook.injectAsyncCatcher(false);
            BukkitHook.disableChunkGC(this);
            MinecraftServerHook.disableAutoSave();

            // Create the data folder and the default configs.
            ConfigUtils.createFolderIfNotExists(getDataFolder());
            ConfigUtils.createConfigWithDefaultsIfNotExists(new File(getDataFolder(), "config.yml"),
                    getResource("config.yml"));
            ConfigUtils.createConfigWithDefaultsIfNotExists(new File(getDataFolder(), "internalData.yml"),
                    getResource("internalData.yml"));
            ConfigUtils.createFolderIfNotExists(new File(getDataFolder(), "cache"));

            // Load the default config.
            YamlConfiguration localConfig = YamlConfiguration
                    .loadConfiguration(new File(getDataFolder(), "config.yml"));
            ArcadeConfiguration
                    .setServerType(ServerType.valueOf(localConfig.getString("SERVER_TYPE").toUpperCase()));
            ArcadeConfiguration.setWebServerURL(URLUtils.toWorkingURL(localConfig.getString("WEBSERVER")));
            ArcadeConfiguration.setMysqlCredentials(new MySQLCredentials(localConfig.getString("MYSQL.HOSTNAME"),
                    localConfig.getInt("MYSQL.PORT"), localConfig.getString("MYSQL.USER"),
                    localConfig.getString("MYSQL.PASSWORD"), localConfig.getString("MYSQL.DATABASENAME")));
            ArcadeConfiguration.setServerName(localConfig.getString("SERVERNAME"));
            ArcadeConfiguration.setGamemodes(localConfig.getStringList("GAMEMODES"));

            // Download the Arcade.yml configuration from the web server.
            log("Attempting to download the web Arcade.yml.");
            File cacheConfigLocation = new File(Arcade.getInstance().getDataFolder() + File.separator + "cache",
                    "Arcade.yml");
            if (cacheConfigLocation.exists()) {
                cacheConfigLocation.delete();
            }
            try {
                FileUtils.copyURLToFile(new URL(ArcadeConfiguration.getWebServerURL() + WEB_CONFIG_LOCATION),
                        cacheConfigLocation);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            log("The web Arcade.yml downloaded successfuly!");

            // Load the webConfiguration.
            FileConfiguration webConfig = YamlConfiguration.loadConfiguration(cacheConfigLocation);
            ArcadeWebConfiguration.setBungeeLobbyServerName(webConfig.getString("bungeeLobbyServer"));
            ArcadeWebConfiguration.setLobbySignLines(webConfig.getStringList("lobbysignligns"));

            // Load all of the mini-plugins.
            log("Attempting to load mini-plugins");

            loadedMiniPlugins.add(new mySQLConnector("mySQL-Connector", "0.1-SNAPSHOT", getServer()));
            loadedMiniPlugins.add(new NameDatabase("NameDatabase", "0.1-SNAPSHOT", getServer()));

            for (ArcadeMiniPlugin miniPlugin : this.loadedMiniPlugins) {
                miniPlugin.onEnable();
                miniPlugin.postEnable();
            }
            log("Finished loading mini-plugins");

            // Register events.
            PluginManager pluginManager = getServer().getPluginManager();
            pluginManager.registerEvents(new LobbySignsListener(), this);
            pluginManager.registerEvents(new UserManager(), this);
            pluginManager.registerEvents(new BarUtils(), this);

            // Hook any messaging channels.
            getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");

            // Register needed tasks.
            getServer().getScheduler().runTaskTimer(this, new TileEntityMemoryLeakFixTask(), 100L, 100L);

            // We have to call this manually.
            postEnable();

            // Needed - ArcadePlugin
            super.postEnable();
        } catch (Exception ex) {
            ex.printStackTrace();
            shutdown("Error caught while starting up.");
            return;
        }
    }

    @Override
    public void onDisable() {
        // Needed - ArcadePlugin
        super.onDisable();

        for (ArcadeMiniPlugin miniPlugin : loadedMiniPlugins) {
            miniPlugin.onDisable();
            miniPlugin.postDisable();
        }

        //Task cleanup
        getServer().getScheduler().cancelTasks(this);

        // We have to call this manually.
        postDisable();

        // Needed - ArcadePlugin
        super.postDisable();
    }

    @Override
    public void postEnable() {
        log("Chosen server type: " + ArcadeConfiguration.getServerType().name());
        switch (ArcadeConfiguration.getServerType()) {
        case SINGLE_GAMEMODE:
            log("Finding the first gamemode from your configuration.");

            if (ArcadeConfiguration.getGamemodes().isEmpty()) {
                shutdown("There are no gamemodes configured.");
                return;
            }

            MinigameType minigameType = MinigameType
                    .valueOf(ArcadeConfiguration.getGamemodes().get(0).toUpperCase());

            if (minigameType == null) {
                shutdown("We could not resolve the minigame from name: "
                        + ArcadeConfiguration.getGamemodes().get(0).toUpperCase());
                return;
            }

            log("Starting the found minigame " + minigameType.name() + " ...");

            loadedMiniPlugins.add(minigameType.start(getServer()));
            break;
        default:
            break;
        }

        setServerOnline(true);
    }

    @Override
    public void postDisable() {
    }
}