public boolean onCommand(final @Nullable CommandSender sender, final @Nullable Command command, final @Nullable String label, final @Nullable String[] args) {
if (sender == null || command == null || label == null || args == null)
throw new IllegalArgumentException();
if (!skriptCommandHelp.test(sender, args))
return true;
final RedirectingLogHandler r = SkriptLogger.startLogHandler(new RedirectingLogHandler(sender, ""));
try {
if (args[0].equalsIgnoreCase("reload")) {
if (args[1].equalsIgnoreCase("all")) {
reloading(sender, "config and scripts");
Skript.reload();
reloaded(sender, r, "config and scripts");
} else if (args[1].equalsIgnoreCase("scripts")) {
reloading(sender, "scripts");
Skript.reloadScripts();
reloaded(sender, r, "scripts");
} else if (args[1].equalsIgnoreCase("config")) {
reloading(sender, "main config");
Skript.reloadMainConfig();
reloaded(sender, r, "main config");
} else if (args[1].equalsIgnoreCase("aliases")) {
reloading(sender, "aliases");
Skript.reloadAliases();
reloaded(sender, r, "aliases");
} else {
final File f = getScriptFromArgs(sender, args, 1);
if (f == null)
return true;
if (!f.isDirectory()) {
if (f.getName().startsWith("-")) {
info(sender, "reload.script disabled", f.getName().substring(1));
return true;
}
reloading(sender, "script", f.getName());
ScriptLoader.unloadScript(f);
ScriptLoader.loadScripts(new File[] {f});
reloaded(sender, r, "script", f.getName());
} else {
reloading(sender, "scripts in folder", f.getName());
final int disabled = ScriptLoader.unloadScripts(f).files;
final int enabled = ScriptLoader.loadScripts(f).files;
if (Math.max(disabled, enabled) == 0)
info(sender, "reload.empty folder", f.getName());
else
reloaded(sender, r, "x scripts in folder", f.getName(), Math.max(disabled, enabled));
}
}
} else if (args[0].equalsIgnoreCase("enable")) {
if (args[1].equals("all")) {
try {
info(sender, "enable.all.enabling");
final File[] files = toggleScripts(new File(Skript.getInstance().getDataFolder(), Skript.SCRIPTSFOLDER), true).toArray(new File[0]);
assert files != null;
ScriptLoader.loadScripts(files);
if (r.numErrors() == 0) {
info(sender, "enable.all.enabled");
} else {
error(sender, "enable.all.error", r.numErrors());
}
} catch (final IOException e) {
error(sender, "enable.all.io error", ExceptionUtils.toString(e));
}
} else {
File f = getScriptFromArgs(sender, args, 1);
if (f == null)
return true;
if (!f.isDirectory()) {
if (!f.getName().startsWith("-")) {
info(sender, "enable.single.already enabled", f.getName(), StringUtils.join(args, " ", 1, args.length));
return true;
}
try {
f = FileUtils.move(f, new File(f.getParentFile(), f.getName().substring(1)), false);
} catch (final IOException e) {
error(sender, "enable.single.io error", f.getName().substring(1), ExceptionUtils.toString(e));
return true;
}
info(sender, "enable.single.enabling", f.getName());
ScriptLoader.loadScripts(new File[] {f});
if (r.numErrors() == 0) {
info(sender, "enable.single.enabled", f.getName());
} else {
error(sender, "enable.single.error", f.getName(), r.numErrors());
}
return true;
} else {
final Collection<File> scripts;
try {
scripts = toggleScripts(f, true);
} catch (final IOException e) {
error(sender, "enable.folder.io error", f.getName(), ExceptionUtils.toString(e));
return true;
}
if (scripts.isEmpty()) {
info(sender, "enable.folder.empty", f.getName());
return true;
}
info(sender, "enable.folder.enabling", f.getName(), scripts.size());
final File[] ss = scripts.toArray(new File[scripts.size()]);
assert ss != null;
final ScriptInfo i = ScriptLoader.loadScripts(ss);
assert i.files == scripts.size();
if (r.numErrors() == 0) {
info(sender, "enable.folder.enabled", f.getName(), i.files);
} else {
error(sender, "enable.folder.error", f.getName(), r.numErrors());
}
return true;
}
}
} else if (args[0].equalsIgnoreCase("disable")) {
if (args[1].equals("all")) {
Skript.disableScripts();
try {
toggleScripts(new File(Skript.getInstance().getDataFolder(), Skript.SCRIPTSFOLDER), false);
info(sender, "disable.all.disabled");
} catch (final IOException e) {
error(sender, "disable.all.io error", ExceptionUtils.toString(e));
}
} else {
final File f = getScriptFromArgs(sender, args, 1);
if (f == null) // TODO allow disabling deleted/renamed scripts
return true;
if (!f.isDirectory()) {
if (f.getName().startsWith("-")) {
info(sender, "disable.single.already disabled", f.getName().substring(1));
return true;
}
ScriptLoader.unloadScript(f);
try {
FileUtils.move(f, new File(f.getParentFile(), "-" + f.getName()), false);
} catch (final IOException e) {
error(sender, "disable.single.io error", f.getName(), ExceptionUtils.toString(e));
return true;
}
info(sender, "disable.single.disabled", f.getName());
return true;
} else {
final Collection<File> scripts;
try {
scripts = toggleScripts(f, false);
} catch (final IOException e) {
error(sender, "disable.folder.io error", f.getName(), ExceptionUtils.toString(e));
return true;
}
if (scripts.isEmpty()) {
info(sender, "disable.folder.empty", f.getName());
return true;
}
for (final File script : scripts)
ScriptLoader.unloadScript(new File(script.getParentFile(), script.getName().substring(1)));
info(sender, "disable.folder.disabled", f.getName(), scripts.size());
return true;
}
}
} else if (args[0].equalsIgnoreCase("update")) {
Updater.stateLock.writeLock().lock();
try {
final UpdateState state = Updater.state;
if (args[1].equals("check")) {
switch (state) {
case NOT_STARTED:
Updater.check(sender, false, false);
break;
case CHECK_IN_PROGRESS:
Skript.info(sender, "" + Updater.m_check_in_progress);
break;
case CHECK_ERROR:
Updater.check(sender, false, false);
break;
case CHECKED_FOR_UPDATE:
if (Updater.latest.get() == null)
Skript.info(sender, Skript.getVersion().isStable() ? "" + Updater.m_running_latest_version : "" + Updater.m_running_latest_version_beta);
else
Skript.info(sender, "" + Updater.m_update_available);
break;
case DOWNLOAD_IN_PROGRESS:
Skript.info(sender, "" + Updater.m_download_in_progress);
break;
case DOWNLOAD_ERROR:
Skript.info(sender, "" + Updater.m_download_error);
break;
case DOWNLOADED:
Skript.info(sender, "" + Updater.m_downloaded);
break;
}
} else if (args[1].equalsIgnoreCase("changes")) {
if (state == UpdateState.NOT_STARTED) {
Skript.info(sender, "" + Updater.m_not_started);
} else if (state == UpdateState.CHECK_IN_PROGRESS) {
Skript.info(sender, "" + Updater.m_check_in_progress);
} else if (state == UpdateState.CHECK_ERROR) {
Skript.info(sender, "" + Updater.m_check_error);
} else if (Updater.latest.get() == null) {
Skript.info(sender, Skript.getVersion().isStable() ? "" + Updater.m_running_latest_version : "" + Updater.m_running_latest_version_beta);
// } else if (args.length == 2 && Updater.infos.size() != 1) {
// info(sender, "update.changes.multiple versions.title", Updater.infos.size(), Skript.getVersion());
// String versions = Updater.infos.get(0).version.toString();
// for (int i = Updater.infos.size() - 1; i >= 0; i--)
// versions += ", " + Updater.infos.get(i).version.toString();
// Skript.message(sender, " " + versions);
// message(sender, "update.changes.multiple versions.footer");
} else {
// VersionInfo info = null;
int pageNum = 1;
// if (Updater.infos.size() == 1) {
// info = Updater.latest.get();
if (args.length >= 3 && args[2].matches("\\d+")) {
final String a2 = args[2];
assert a2 != null;
pageNum = Utils.parseInt(a2); // Eclipse complains about null here, not where args[2] is dereferenced above...
}
// } else {
// final String version = args[2];
// for (final VersionInfo i : Updater.infos) {
// if (i.version.toString().equals(version)) {
// info = i;
// break;
// }
// }
// if (info == null) {
// error(sender, "update.changes.invalid version", version);
// return true;
// }
// if (args.length >= 4 && args[3].matches("\\d+"))
// pageNum = Utils.parseInt(args[3]);
// }
final StringBuilder changes = new StringBuilder();
for (final VersionInfo i : Updater.infos) {
if (changes.length() != 0)
changes.append("\n");
changes.append(Skript.SKRIPT_PREFIX + Utils.replaceEnglishChatStyles(m_changes_title.toString(i.version, i.date)));
changes.append("\n");
changes.append(i.changelog);
}
final ChatPage page = ChatPaginator.paginate(changes.toString(), pageNum, ChatPaginator.GUARANTEED_NO_WRAP_CHAT_PAGE_WIDTH, ChatPaginator.OPEN_CHAT_PAGE_HEIGHT - 2);
sender.sendMessage(page.getLines());
if (pageNum < page.getTotalPages())
message(sender, "update.changes.next page", pageNum, page.getTotalPages(), pageNum + 1);
}
} else if (args[1].equalsIgnoreCase("download")) {
switch (state) {
case NOT_STARTED:
Updater.check(sender, true, false);
break;
case CHECK_IN_PROGRESS:
Skript.info(sender, "" + Updater.m_check_in_progress);
break;
case CHECK_ERROR:
Updater.check(sender, true, false);
// info(sender, Language.format("updater.check_error", updater.error));
break;
case CHECKED_FOR_UPDATE:
if (Updater.latest.get() == null) {
Skript.info(sender, Skript.getVersion().isStable() ? "" + Updater.m_running_latest_version : "" + Updater.m_running_latest_version_beta);
} else {
Updater.download(sender, false);
}
break;
case DOWNLOAD_IN_PROGRESS:
Skript.info(sender, "" + Updater.m_download_in_progress);
break;
case DOWNLOADED:
Skript.info(sender, "" + Updater.m_downloaded);
break;
case DOWNLOAD_ERROR:
// Skript.info(sender, "" + Updater.m_download_error);
Updater.download(sender, false);
break;
}
}
} finally {
Updater.stateLock.writeLock().unlock();
}
} else if (args[0].equalsIgnoreCase("help")) {
skriptCommandHelp.showHelp(sender);
}
} catch (final Exception e) {
Skript.exception(e, "Exception occurred in Skript's main command", "Used command: /" + label + " " + StringUtils.join(args, " "));
} finally {
r.stop();
}
return true;
}