package fi.flexplex.connect; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Set; import java.util.UUID; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.bukkit.OfflinePlayer; public final class FlexPlexGraphQLApi { private final String graphqlEndpoint; private final FlexConnect flexConnect; public FlexPlexGraphQLApi(final FlexConnect flexConnect, final String graphQLEndpoint) { this.flexConnect = flexConnect; this.graphqlEndpoint = graphQLEndpoint; } public Set getProxyAddresses() { final Set output = new HashSet<>(); try { final URL url = new URL(graphqlEndpoint); final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setConnectTimeout(10000); conn.setReadTimeout(10000); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); final DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); wr.writeBytes("{\"query\":\"query { proxyAddresses }\"}"); wr.flush(); wr.close(); final JsonObject response = (JsonObject) new JsonParser().parse(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); if (response.get("data").getAsJsonObject().has("proxyAddresses")) { final JsonArray array = response.get("data").getAsJsonObject().get("proxyAddresses").getAsJsonArray(); for (int i = 0; i < array.size(); i++) { output.add(array.get(i).getAsString()); } } conn.disconnect(); } catch (final IOException e) { this.flexConnect.getLogger().warning("Updating whitelist data failed, propably connection to FlexPlex API server is down."); } return output; } public void updateWhitelist() { this.updateWhitelist(this.flexConnect.getServer().hasWhitelist()); } public void updateWhitelist(final boolean whitelistEnabled) { final Set whitelist = new HashSet<>(); for (final OfflinePlayer player : this.flexConnect.getServer().getWhitelistedPlayers()) { whitelist.add(player.getUniqueId()); } for (final OfflinePlayer player : this.flexConnect.getServer().getOperators()) { whitelist.add(player.getUniqueId()); } this.updateWhitelist(whitelistEnabled, whitelist); } private void updateWhitelist(final boolean whitelistEnabled, final Set whitelist) { final StringBuilder whitelistString = new StringBuilder(" "); for (final UUID uuid : whitelist) { whitelistString.append("\\\"" + uuid.toString() + "\\\" "); } try { final URL url = new URL(graphqlEndpoint); final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setConnectTimeout(10000); conn.setReadTimeout(10000); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); final DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); wr.writeBytes("{\"query\":\"mutation { updateCommunityServerWhitelist ( token: \\\"" + this.flexConnect.getToken() + "\\\" enabled: " + whitelistEnabled + " whitelist: [" + whitelistString + "] )}\"}"); wr.flush(); wr.close(); final JsonObject response = (JsonObject) new JsonParser().parse(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); if (!response.get("data").getAsJsonObject().get("updateCommunityServerWhitelist").getAsBoolean()) { this.flexConnect.getLogger().warning("Updating whitelist data failed, propably invalid token."); } conn.disconnect(); } catch (final IOException e) { this.flexConnect.getLogger().warning("Updating whitelist data failed, propably connection to FlexPlex API server is down."); } } }