ovh.tgrhavoc.aibot.RealmsUtil.java Source code

Java tutorial

Introduction

Here is the source code for ovh.tgrhavoc.aibot.RealmsUtil.java

Source

/*******************************************************************************
 *     Copyright (C) 2015 Jordan Dalton (jordan.8474@gmail.com)
 *
 *     This program is free software; you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation; either version 2 of the License, or
 *     (at your option) any later version.
 *
 *     This program 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 General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License along
 *     with this program; if not, write to the Free Software Foundation, Inc.,
 *     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *******************************************************************************/
package ovh.tgrhavoc.aibot;

import java.io.*;
import java.net.*;

import javax.net.ssl.HttpsURLConnection;

import org.json.simple.*;
import org.json.simple.parser.*;

import ovh.tgrhavoc.aibot.auth.YggdrasilSession;

public final class RealmsUtil {
    private static final String REALMS_URL = "https://mcoapi.minecraft.net/";
    private static final String REALMS_WORLD_URL = REALMS_URL + "worlds";
    private static final String REALMS_WORLD_JOIN_URL = REALMS_URL + "worlds/%s/join";

    private RealmsUtil() {
        throw new UnsupportedOperationException();
    }

    public static Server[] requestServers(YggdrasilSession session) throws IOException {
        return requestServers(session, null);
    }

    public static Server[] requestServers(YggdrasilSession session, ProxyData proxy) throws IOException {
        if (!session.isValidForAuthentication())
            throw new IllegalArgumentException("Session must be valid for authentication");

        String response = mcoapiGet(REALMS_WORLD_URL, session, proxy);
        JSONObject json;
        try {
            json = (JSONObject) new JSONParser().parse(response);
        } catch (ParseException exception) {
            throw new IOException("Non-JSON response: " + response, exception);
        }
        JSONArray serverJson = (JSONArray) json.get("servers");
        Server[] servers = new Server[serverJson.size()];
        for (int i = 0; i < servers.length; i++)
            servers[i] = new Server((JSONObject) serverJson.get(i));
        return servers;
    }

    public static String requestAddress(Server server, YggdrasilSession session) throws IOException {
        return requestAddress(server, session, null);
    }

    public static String requestAddress(Server server, YggdrasilSession session, ProxyData proxy)
            throws IOException {
        if (!session.isValidForAuthentication())
            throw new IllegalArgumentException("Session must be valid for authentication");

        String response = mcoapiGet(String.format(REALMS_WORLD_JOIN_URL, server.getId()), session, proxy);
        JSONObject json;
        try {
            json = (JSONObject) new JSONParser().parse(response);
        } catch (ParseException exception) {
            throw new IOException("Non-JSON response: " + response, exception);
        }
        return (String) json.get("address");
    }

    private static String mcoapiGet(String address, YggdrasilSession session, ProxyData proxy) throws IOException {
        Proxy wrappedProxy = wrapProxy(proxy);
        HttpsURLConnection connection;
        if (wrappedProxy != null)
            connection = (HttpsURLConnection) new URL(address).openConnection(wrappedProxy);
        else
            connection = (HttpsURLConnection) new URL(address).openConnection();

        connection.addRequestProperty("Cookie", "user=" + session.getUsername() + ";version=1.7.2;sid=token:"
                + session.getAccessToken().toString(16) + ":" + session.getSelectedProfile().getId());
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setDoOutput(true);
        connection.setRequestMethod("GET");

        connection.connect();

        InputStream in = connection.getInputStream();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1)
            out.write(buffer, 0, read);

        return new String(out.toByteArray());
    }

    private static Proxy wrapProxy(ProxyData proxy) {
        if (proxy == null
                || (proxy.getType() != ProxyData.ProxyType.HTTP && proxy.getType() != ProxyData.ProxyType.SOCKS))
            return null;
        return new Proxy(proxy.getType() == ProxyData.ProxyType.HTTP ? Proxy.Type.HTTP : Proxy.Type.SOCKS,
                new InetSocketAddress(proxy.getHostName(), proxy.getPort()));
    }

    public static final class Server {
        private final String owner, name, motd, address, state, invited;
        private final int id, difficulty, gameMode, daysLeft;
        private final boolean expired;

        private Server(JSONObject data) {
            id = ((Number) data.get("id")).intValue();
            owner = (String) data.get("owner");
            name = (String) data.get("name");
            motd = (String) data.get("motd");
            address = (String) data.get("ip");
            state = (String) data.get("state");
            difficulty = ((Number) data.get("difficulty")).intValue();
            gameMode = ((Number) data.get("gameMode")).intValue();
            daysLeft = ((Number) data.get("daysLeft")).intValue();
            expired = (Boolean) data.get("expired");
            invited = (String) data.get("invited");
        }

        public int getId() {
            return id;
        }

        public String getOwner() {
            return owner;
        }

        public String getName() {
            return name;
        }

        public String getMotd() {
            return motd;
        }

        public String getAddress() {
            return address;
        }

        public String getState() {
            return state;
        }

        public int getDifficulty() {
            return difficulty;
        }

        public int getGameMode() {
            return gameMode;
        }

        public int getDaysLeft() {
            return daysLeft;
        }

        public boolean isExpired() {
            return expired;
        }

        public String getInvited() {
            return invited;
        }
    }
}