org.spoutcraft.client.gui.error.GuiUnexpectedError.java Source code

Java tutorial

Introduction

Here is the source code for org.spoutcraft.client.gui.error.GuiUnexpectedError.java

Source

/*
 * This file is part of Spoutcraft.
 *
 * Copyright (c) 2011 Spout LLC <http://www.spout.org/>
 * Spoutcraft is licensed under the GNU Lesser General Public License.
 *
 * Spoutcraft is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Spoutcraft is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.spoutcraft.client.gui.error;

import java.awt.Desktop;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLConnection;

import org.lwjgl.opengl.GL11;
import org.lwjgl.Sys;

import net.minecraft.client.Minecraft;
import net.minecraft.src.GuiScreen;
import net.minecraft.src.TexturePackList;

import org.bukkit.ChatColor;

import org.spoutcraft.api.Spoutcraft;
import org.spoutcraft.api.gui.Button;
import org.spoutcraft.api.gui.Color;
import org.spoutcraft.api.gui.GenericButton;
import org.spoutcraft.api.gui.GenericLabel;
import org.spoutcraft.api.gui.GenericScrollArea;
import org.spoutcraft.api.gui.RenderPriority;
import org.spoutcraft.api.gui.WidgetAnchor;
import org.spoutcraft.client.SpoutClient;

public class GuiUnexpectedError extends GuiScreen {
    private Throwable caused;
    private GenericLabel hastebinLink;

    private String hastebinURL;
    private boolean generated = false;

    public GuiUnexpectedError(Throwable caused) {
        this.caused = caused;
    }

    public void initGui() {

        GenericScrollArea screen = new GenericScrollArea();
        screen.setHeight(height - 16 - 24).setWidth(width).setY(16 + 24).setX(0);
        getScreen().attachWidget("Spoutcraft", screen);

        GenericLabel label = new GenericLabel("Oh noes! An error has occurred!");
        int size = Spoutcraft.getMinecraftFont().getTextWidth(label.getText());
        label.setX((int) (width / 2 - size / 2)).setY(16);
        label.setFixed(true).setPriority(RenderPriority.Lowest);
        getScreen().attachWidget("Spoutcraft", label);

        int top = 60;
        Color grey = new Color(0.80F, 0.80F, 0.80F, 0.65F);

        hastebinLink = new GenericLabel("Generating hastie...");
        hastebinLink.setX(95).setY(top);
        hastebinLink.setTextColor(grey);
        screen.attachWidget("Spoutcraft", hastebinLink);
        generateHastie();

        Button button = new CopyErrorURL(this).setText("Copy Link");
        button.setHeight(20).setWidth(80);
        button.setX((int) (hastebinLink.getWidth() + hastebinLink.getX() + 10.0));
        button.setY(top - 5);
        button.setAlign(WidgetAnchor.TOP_CENTER);
        screen.attachWidget("Spoutcraft", button);

        top += 25;

        button = new ReportErrorButton().setText("Report");
        button.setHeight(20).setWidth(70);
        button.setX((int) (width / 2 - button.getWidth() - button.getWidth() / 2));
        button.setY(top);
        button.setAlign(WidgetAnchor.TOP_CENTER);
        screen.attachWidget("Spoutcraft", button);

        button = new IgnoreErrorButton().setText("Ignore");
        button.setHeight(20).setWidth(70);
        button.setX((int) (width / 2 + button.getWidth() / 2));
        button.setY(top);
        button.setAlign(WidgetAnchor.TOP_CENTER);
        screen.attachWidget("Spoutcraft", button);
        top += 30;
    }

    @Override
    public void drawScreen(int var1, int var2, float var3) {
        drawDefaultBackground();
    }

    private void generateHastie() {
        if (generated) {
            hastebinLink.setText("Error Link: " + ChatColor.GREEN + hastebinURL);
            return;
        }
        try {
            StringBuilder builder = new StringBuilder("Spoutcraft Error Report:\n");
            builder.append("    Build: ").append(SpoutClient.getClientVersion()).append("\n");
            builder.append("-----------------------------------").append("\n");
            builder.append("Stack Trace:").append("\n");
            builder.append("    Exception: ").append(caused.getClass().getSimpleName()).append("\n");
            builder.append("    Message: ").append(caused.getMessage()).append("\n");
            builder.append("    Trace:").append("\n");

            StringWriter sw = new StringWriter();
            caused.printStackTrace(new PrintWriter(sw));
            String causeString = sw.toString();
            builder.append("       ").append(sw).append("\n");

            builder.append("-----------------------------------").append("\n");
            builder.append("Minecraft Information:\n");
            builder.append("    Texture Pack: ").append(
                    Minecraft.theMinecraft.texturePackList.getSelectedTexturePack().getTexturePackFileName())
                    .append("\n");
            //builder.append("    Texture Pack Res: ").append(TileSize.int_size + "x").append("\n");
            builder.append("    LWJGL Version: ").append(Sys.getVersion()).append("\n");

            builder.append("System Information:\n");
            builder.append("    Operating System: ").append(System.getProperty("os.name")).append("\n");
            builder.append("    Operating System Version: ").append(System.getProperty("os.version")).append("\n");
            builder.append("    Operating System Architecture: ").append(System.getProperty("os.arch"))
                    .append("\n");
            builder.append("    Java version: ").append(System.getProperty("java.version")).append(" ")
                    .append(System.getProperty("sun.arch.data.model", "32")).append(" bit").append("\n");
            builder.append("    Total Memory: ").append(Runtime.getRuntime().totalMemory() / 1024L / 1024L)
                    .append(" MB\n");
            builder.append("    Max Memory: ").append(Runtime.getRuntime().maxMemory() / 1024L / 1024L)
                    .append(" MB\n");
            builder.append("    Memory Free: ").append(Runtime.getRuntime().freeMemory() / 1024L / 1024L)
                    .append(" MB\n");
            builder.append("    CPU Cores: ").append(Runtime.getRuntime().availableProcessors()).append("\n");
            builder.append("    OpenGL Version: ").append(GL11.glGetString(GL11.GL_VERSION)).append("\n");
            builder.append("    OpenGL Vendor: ").append(GL11.glGetString(GL11.GL_VENDOR)).append("\n");
            String message = builder.toString();

            PasteBinAPI pastebin = new PasteBinAPI("963f01dd506cb3f607a487bc34b60d16");
            String response = pastebin.makePaste(message, "ser_" + System.currentTimeMillis(), "text");
            System.out.println("pastebin response: " + response);
            if (!response.startsWith("http://pastebin.com")) {
                URL url = new URL("http://www.hastebin.com/documents");
                URLConnection conn = url.openConnection();
                conn.setDoOutput(true);
                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                wr.write(builder.toString());
                wr.flush();

                BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line = rd.readLine();
                hastebinURL = "hastebin.com/" + line.substring(8, line.length() - 2); // Get rid of the JSON stuff
                wr.close();
                rd.close();
            } else {
                hastebinURL = response;
            }
            hastebinLink.setText("Error: " + ChatColor.GREEN + hastebinURL);
            generated = true;
        } catch (Exception e) {
            hastebinLink.setText("Connection error!");
        }
    }

    protected void copyErrorToClipboard() {
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(hastebinURL), null);
    }
}

class CopyErrorURL extends GenericButton {
    private GuiUnexpectedError error;

    CopyErrorURL(GuiUnexpectedError error) {
        this.error = error;
    }

    public void onButtonClick() {
        error.copyErrorToClipboard();
    }
}

class IgnoreErrorButton extends GenericButton {
    public void onButtonClick() {
        Minecraft.theMinecraft.displayGuiScreen(new org.spoutcraft.client.gui.mainmenu.MainMenu());
    }
}

class ReportErrorButton extends GenericButton {
    public void onButtonClick() {
        try {
            URL url = new URL("http://spout.in/issues");
            Desktop.getDesktop().browse(url.toURI());
        } catch (Exception e) {
        }
        Minecraft.theMinecraft.displayGuiScreen(new org.spoutcraft.client.gui.mainmenu.MainMenu());
    }
}

class ExitGameButton extends GenericButton {
    public void onButtonClick() {
        Minecraft.theMinecraft.shutdownMinecraftApplet();
    }
}