/*
* 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() {
}
}