package com.nicewuerfel.blockown;
import com.nicewuerfel.blockown.command.CE_AddFriend;
import com.nicewuerfel.blockown.command.CE_Ignore;
import com.nicewuerfel.blockown.command.CE_Import;
import com.nicewuerfel.blockown.command.CE_List;
import com.nicewuerfel.blockown.command.CE_Lock;
import com.nicewuerfel.blockown.command.CE_Own;
import com.nicewuerfel.blockown.command.CE_OwnOther;
import com.nicewuerfel.blockown.command.CE_Owning;
import com.nicewuerfel.blockown.command.CE_Protect;
import com.nicewuerfel.blockown.command.CE_RemFriend;
import com.nicewuerfel.blockown.command.CE_ShowOwner;
import com.nicewuerfel.blockown.command.CE_Unlock;
import com.nicewuerfel.blockown.command.CE_Unown;
import com.nicewuerfel.blockown.command.CE_UnownPlayer;
import com.nicewuerfel.blockown.command.CE_Unprotect;
import com.nicewuerfel.blockown.command.CE_UnprotectPlayer;
import com.nicewuerfel.blockown.database.Database;
import com.nicewuerfel.blockown.database.MySqlDatabase;
import com.nicewuerfel.blockown.database.SqliteDatabase;
import com.nicewuerfel.blockown.event.L_BlockBreak;
import com.nicewuerfel.blockown.event.L_BlockPlace;
import com.nicewuerfel.blockown.event.L_EnvironmentDamage;
import com.nicewuerfel.blockown.event.L_PlayerInteract;
import com.nicewuerfel.blockown.output.DebugOutput;
import com.nicewuerfel.blockown.output.DefaultOutput;
import com.nicewuerfel.blockown.output.Output;
import com.nicewuerfel.blockown.protection.Protection;
import org.bukkit.Bukkit;
import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
public class BlockOwn extends JavaPlugin {
private Setting setting;
private Database database;
private Protection protection;
private File messageFile;
private File configFile;
private File importerFolder;
@Override
public void onDisable() {
if (database != null) {
database.disable();
}
if (protection != null) {
protection.disable();
}
super.onDisable();
}
@Override
public void onEnable() {
super.onEnable();
configFile = new File(getDataFolder(), "config.yml");
messageFile = new File(getDataFolder(), "messages.yml");
importerFolder = new File(getDataFolder(), "Importer");
if (!createDataStructure()) {
getOutput().printError("Error creating data structure.");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
setting = Setting.load(new DebugOutput(), configFile);
getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
@Override
public void run() {
setting.loadEnabledWorlds(getServer().getWorlds());
try {
setting.save();
} catch (IOException e) {
getOutput().printError("Could not save config!");
}
}
}, 1);
if (!setting.DEBUG_MODE) {
setting.setOutput(new DefaultOutput());
}
getOutput().debugMessage("Debug mode enabled");
setting.updateDeprecatedSettings();
User.initialize(this);
if (!Message.loadMessages(getOutput(), getMessageFile())) {
getOutput().printError("Error loading messages.");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
if (!initializeDatabase()) {
getOutput().printError("Couldn't connect to database.");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
if (!initializeProtection()) {
getOutput().printError("Couldn't initialize Protection.");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
registerListeners();
registerCommands();
setting.VERSION = new PluginVersion(getVersion(), getReleaseChannel());
getProtection().getDecayer(this).start();
}
private boolean createDataStructure() {
File dataFolder = getDataFolder();
if (!dataFolder.exists()) {
if (!dataFolder.mkdir()) {
return false;
}
}
getConfig().options().copyDefaults(true);
if (!configFile.exists()) {
saveDefaultConfig();
}
if (!importerFolder.exists()) {
if (!importerFolder.mkdir()) {
return false;
}
}
return true;
}
private boolean initializeDatabase() {
if (setting.DATABASE.MYSQL.ENABLE) {
try {
database = new MySqlDatabase.Builder(getOutput()).database(setting.DATABASE.MYSQL.DATABASE)
.pluginFolder(getDataFolder()).host(setting.DATABASE.MYSQL.HOST)
.port(setting.DATABASE.MYSQL.PORT).user(setting.DATABASE.MYSQL.USER)
.password(setting.DATABASE.MYSQL.PASSWORD).build();
return true;
} catch (ClassNotFoundException e) {
getOutput().printError("MySQL driver class not found", e);
return false;
} catch (SQLException e) {
getOutput().printError("Exception during MySQL initialization", e);
return false;
}
} else {
try {
database = new SqliteDatabase(getOutput(), getDataFolder());
return true;
} catch (ClassNotFoundException e) {
getOutput().printError("SQLite driver class not found", e);
return false;
} catch (SQLException e) {
getOutput().printError("Exception during SQLite initialization", e);
return false;
}
}
}
private boolean initializeProtection() {
try {
protection = new Protection(setting, getDataFolder());
return true;
} catch (IOException e) {
getOutput().printError("Exception while loading protections file", e);
return false;
}
}
private void registerListeners() {
getServer().getPluginManager()
.registerEvents(new L_BlockPlace(setting, getOwningDatabase(), getProtection()), this);
getServer().getPluginManager().registerEvents(
new L_EnvironmentDamage(setting, getOwningDatabase(), getProtection()), this);
getServer().getPluginManager()
.registerEvents(new L_PlayerInteract(setting, getOwningDatabase(), getProtection()), this);
getServer().getPluginManager()
.registerEvents(new L_BlockBreak(setting, getOwningDatabase(), getProtection()), this);
}
private void registerCommands() {
PluginCommand cmd;
cmd = getCommand(Command.ADDFRIEND.toString());
cmd.setExecutor(new CE_AddFriend(setting, database, protection));
cmd.setUsage("/<command> <player>");
cmd.setPermission(Permission.PROTECTION_ADDFRIEND.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.IGNORE.toString());
cmd.setExecutor(new CE_Ignore(setting, database, protection));
cmd.setUsage("/<command> [on | off | <player>]");
cmd.setPermission(Permission.ADMIN_IGNORE.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.IMPORT.toString());
cmd.setExecutor(new CE_Import(setting, database, protection, getImporterFolder()));
cmd.setUsage("/<command> <importer-name>");
cmd = getCommand(Command.LIST.toString());
cmd.setExecutor(new CE_List(setting, database, protection));
cmd.setUsage("/<command> [protected | locked | friends]");
cmd.setPermission(Permission.PROTECTION_LIST.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.LOCK.toString());
cmd.setExecutor(new CE_Lock(setting, database, protection));
cmd.setUsage("/<command> (opt.)[e | b | <material-name>]");
cmd.setPermission(Permission.PROTECTION_LOCK.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.OWN.toString());
cmd.setExecutor(new CE_Own(setting, database, protection));
cmd.setUsage("/<command> (opt.)[e | b | selection]");
cmd.setPermission(Permission.OWN_OWN.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.OWNOTHER.toString());
cmd.setExecutor(new CE_OwnOther(setting, database, protection));
cmd.setUsage("/<command> <player> (opt.)[selection]");
cmd.setPermission(Permission.OWN_OWNING_OWNOTHER.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.OWNING.toString());
cmd.setExecutor(new CE_Owning(setting, database, protection));
cmd.setUsage("/<command> (opt.)[on | off]");
cmd.setPermission(Permission.OWN_SWITCH_OWNING.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.PROTECT.toString());
cmd.setExecutor(new CE_Protect(setting, database, protection));
cmd.setUsage("/<command> (opt.)[e | b | <material-name>]");
cmd.setPermission(Permission.PROTECTION_PROTECT.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.REMFRIEND.toString());
cmd.setExecutor(new CE_RemFriend(setting, database, protection));
cmd.setUsage("/<command> <player>");
cmd.setPermission(Permission.PROTECTION_REMFRIEND.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.SHOWOWNER.toString());
cmd.setExecutor(new CE_ShowOwner(setting, database, protection));
cmd.setUsage("/<command> (opt.)[e | b]");
cmd.setPermission(Permission.OWN_SHOWOWNER.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.UNLOCK.toString());
cmd.setExecutor(new CE_Unlock(setting, database, protection));
cmd.setUsage("/<command> (opt.)[e | b | <material-name>]");
cmd.setPermission(Permission.PROTECTION_UNLOCK.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.UNOWN.toString());
cmd.setExecutor(new CE_Unown(setting, database, protection));
cmd.setUsage("/<command> (opt.)[e | b | selection]");
cmd.setPermission(Permission.OWN_UNOWN.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.UNOWNPLAYER.toString());
cmd.setExecutor(new CE_UnownPlayer(setting, database, protection));
cmd.setUsage("/<command> <player>");
cmd.setPermission(Permission.ADMIN_UNOWNPLAYER.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.UNPROTECT.toString());
cmd.setExecutor(new CE_Unprotect(setting, database, protection));
cmd.setUsage("/<command> (opt.)[e | b | <material-name>]");
cmd.setPermission(Permission.PROTECTION_UNPROTECT.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
cmd = getCommand(Command.UNPROTECTPLAYER.toString());
cmd.setExecutor(new CE_UnprotectPlayer(setting, database, protection));
cmd.setUsage("/<command> <player>");
cmd.setPermission(Permission.ADMIN_UNPROTECTPLAYER.toString());
cmd.setPermissionMessage(Message.COMMAND_NO_PERMISSION.getMessage(cmd.getPermission()));
}
public Database getOwningDatabase() {
return database;
}
public Setting getSettings() {
return setting;
}
public Protection getProtection() {
return protection;
}
public ReleaseChannel getReleaseChannel() {
return setting.VERSION.getReleaseChannel();
}
public Output getOutput() {
return setting.getOutput();
}
public File getMessageFile() {
return messageFile;
}
private File getImporterFolder() {
return importerFolder;
}
public String getVersion() {
return getDescription().getVersion();
}
@Override
public File getFile() {
return super.getFile();
}
}