/*
* Copyright (C) 2022 NotEnoughUpdates contributors
*
* This file is part of NotEnoughUpdates.
*
* NotEnoughUpdates 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.
*
* NotEnoughUpdates 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 NotEnoughUpdates. If not, see .
*/
package io.github.moulberry.notenoughupdates.util;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Consumer;
import java.util.zip.GZIPInputStream;
public class HypixelApi {
private final Gson gson = new Gson();
private final ExecutorService es = Executors.newFixedThreadPool(3);
public CompletableFuture getHypixelApiAsync(String apiKey, String method, HashMap args) {
return getApiAsync(generateApiUrl(apiKey, method, args));
}
public void getHypixelApiAsync(
String apiKey,
String method,
HashMap args,
Consumer consumer
) {
getHypixelApiAsync(apiKey, method, args, consumer, () -> {
});
}
public void getHypixelApiAsync(
String apiKey,
String method,
HashMap args,
Consumer consumer,
Runnable error
) {
getApiAsync(generateApiUrl(apiKey, method, args), consumer, error);
}
private String getMyApiURL() {
return String.format("https://%s/", NotEnoughUpdates.INSTANCE.config.apiData.moulberryCodesApi);
}
public CompletableFuture getApiAsync(String urlS) {
CompletableFuture result = new CompletableFuture<>();
es.submit(() -> {
try {
result.complete(getApiSync(urlS));
} catch (Exception e) {
result.completeExceptionally(e);
}
});
return result;
}
public void getApiAsync(String urlS, Consumer consumer, Runnable error) {
es.submit(() -> {
try {
consumer.accept(getApiSync(urlS));
} catch (Exception e) {
error.run();
}
});
}
public void getMyApiAsync(String urlS, Consumer consumer, Runnable error) {
es.submit(() -> {
try {
consumer.accept(getApiSync(getMyApiURL() + urlS));
} catch (Exception e) {
if (NotEnoughUpdates.INSTANCE.config.hidden.dev) {
e.printStackTrace();
}
error.run();
}
});
}
public void getMyApiGZIPAsync(String urlS, Consumer consumer, Runnable error) {
es.submit(() -> {
try {
consumer.accept(getApiGZIPSync(getMyApiURL() + urlS));
} catch (Exception e) {
error.run();
}
});
}
public void getApiGZIPAsync(String urlS, Consumer consumer, Runnable error) {
es.submit(() -> {
try {
consumer.accept(getApiGZIPSync(urlS));
} catch (Exception e) {
error.run();
}
});
}
public JsonObject getApiSync(String urlS) throws IOException {
URL url = new URL(urlS);
URLConnection connection = url.openConnection();
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
String response = IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8);
JsonObject json = gson.fromJson(response, JsonObject.class);
if (json == null) throw new ConnectException("Invalid JSON");
return json;
}
public JsonObject getApiGZIPSync(String urlS) throws IOException {
URL url = new URL(urlS);
URLConnection connection = url.openConnection();
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
String response = IOUtils.toString(new GZIPInputStream(connection.getInputStream()), StandardCharsets.UTF_8);
JsonObject json = gson.fromJson(response, JsonObject.class);
return json;
}
public String generateApiUrl(String apiKey, String method, HashMap args) {
if (apiKey != null)
args.put("key", apiKey.trim());
StringBuilder url = new StringBuilder("https://api.hypixel.net/" + method);
boolean first = true;
for (Map.Entry entry : args.entrySet()) {
if (first) {
url.append("?");
first = false;
} else {
url.append("&");
}
try {
url.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8.name())).append("=")
.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.name()));
} catch (UnsupportedEncodingException e) {
}
}
return url.toString();
}
}