package org.rsbot.gui;
import org.rsbot.Configuration;
import org.rsbot.locale.Messages;
import org.rsbot.log.LabelLogHandler;
import org.rsbot.log.LogOutputStream;
import org.rsbot.log.SystemConsoleHandler;
import org.rsbot.util.UpdateChecker;
import org.rsbot.util.io.HttpClient;
import org.rsbot.util.io.IOHelper;
import org.rsbot.util.io.ScriptProvider;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoadScreen extends JFrame {
private final static Logger log = Logger.getLogger(LoadScreen.class.getName());
private static final long serialVersionUID = 5520543482560560389L;
public final boolean error;
public LoadScreen() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (final Exception ignored) {
}
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent e) {
System.exit(1);
}
});
setTitle(Configuration.NAME);
setIconImage(Configuration.getImage(Configuration.Paths.Resources.ICON));
final JPanel panel = new JPanel(new GridLayout(2, 1));
final int pad = 10;
panel.setBorder(BorderFactory.createEmptyBorder(pad, pad, pad, pad));
final JProgressBar progress = new JProgressBar();
progress.setPreferredSize(new Dimension(350, progress.getPreferredSize().height));
progress.setIndeterminate(true);
panel.add(progress);
final LabelLogHandler handler = new LabelLogHandler();
Logger.getLogger("").addHandler(handler);
handler.label.setBorder(BorderFactory.createEmptyBorder(pad, 0, 0, 0));
final Font font = handler.label.getFont();
handler.label.setFont(new Font(font.getFamily(), Font.BOLD, font.getSize()));
handler.label.setPreferredSize(new Dimension(progress.getWidth(), handler.label.getPreferredSize().height + pad));
panel.add(handler.label);
log.info("Loading");
add(panel);
pack();
setLocationRelativeTo(getOwner());
setResizable(false);
setVisible(true);
log.info("Language: " + Messages.LANGUAGE);
log.info("Registering logs");
bootstrap();
log.info("Extracting resources");
extractResources();
log.info("Creating directories");
Configuration.createDirectories();
log.info("Downloading resources");
for (final Entry<String, File> item : Configuration.Paths.getCachableResources().entrySet()) {
try {
HttpClient.download(new URL(item.getKey()), item.getValue());
} catch (final IOException ignored) {
}
}
log.info("Checking for updates");
String error = null;
if (UpdateChecker.isError()) {
error = "Unable to obtain latest version information";
} else if (Configuration.RUNNING_FROM_JAR) {
try {
if (UpdateChecker.isDeprecatedVersion()) {
error = "Please update at " + Configuration.Paths.URLs.DOWNLOAD;
}
} catch (final IOException ignored) {
}
} else {
error = null;
}
if (error == null) {
this.error = false;
log.info("Loading bot");
Configuration.registerLogging();
Logger.getLogger("").removeHandler(handler);
} else {
this.error = true;
progress.setIndeterminate(false);
log.severe(error);
}
}
private static void bootstrap() {
Logger.getLogger("").setLevel(Level.INFO);
Logger.getLogger("").addHandler(new SystemConsoleHandler());
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
private final Logger log = Logger.getLogger("EXCEPTION");
public void uncaughtException(final Thread t, final Throwable e) {
log.logp(Level.SEVERE, "EXCEPTION", "", "Unhandled exception in thread " + t.getName() + ": ", e);
}
});
System.setErr(new PrintStream(new LogOutputStream(Logger.getLogger("STDERR"), Level.SEVERE), true));
}
private static void extractResources() {
final ArrayList<String> extract = new ArrayList<String>(2);
if (Configuration.getCurrentOperatingSystem() == Configuration.OperatingSystem.WINDOWS) {
extract.add(Configuration.Paths.COMPILE_SCRIPTS_BAT);
extract.add(Configuration.Paths.COMPILE_FIND_JDK);
} else {
extract.add(Configuration.Paths.COMPILE_SCRIPTS_SH);
}
ScriptProvider scriptProvider = new ScriptProvider();
scriptProvider.extract();
for (final String item : extract) {
final String path = Configuration.Paths.Resources.ROOT + "/" + item;
final InputStream in;
try {
in = Configuration.getResourceURL(path).openStream();
} catch (final IOException ignored) {
continue;
}
final File output = new File(Configuration.Paths.getHomeDirectory(), item);
IOHelper.write(in, output);
}
}
}