FlexConnect/src/main/java/fi/flexplex/connect/FlexPlexGraphQLApi.java

113 lines
4.4 KiB
Java

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<String> getProxyAddresses() {
final Set<String> 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<UUID> 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<UUID> 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.");
}
}
}