package xyz.etztech.core.web; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitScheduler; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.logging.Logger; public class CoreWeb { private static BukkitScheduler schedule = null; private static final Logger logger = Logger.getLogger("Minecraft"); static { try { schedule = Bukkit.getScheduler(); } catch (Exception ex) { logger.warning("Could not get scheduler. Is this running outside Minecraft?"); } } /** * @param plugin The calling plugin * @param url The URL to call * @param data A map of parameters */ public static void asyncGet(final Plugin plugin, final String url, final Map data) { schedule.runTaskAsynchronously(plugin, () -> { try { HTTP(url, HttpMethod.GET, data); } catch (Exception ex) { logger.warning("GET request failed. (" + url + ")"); } }); } /** * @param plugin The calling plugin * @param url The URL to call * @param data A map of parameters * @param callback A class implementing an ICallBack to run upon completion * @see ICallback */ public static void asyncGetCallback(final Plugin plugin, final String url, final Map data, final ICallback callback) { schedule.runTaskAsynchronously(plugin, () -> { try { String result = HTTP(url, HttpMethod.GET, data); callback.invoke(result); } catch (Exception ex) { logger.warning("GET request failed. (" + url + ")"); } }); } /** * @param plugin The calling plugin * @param url The URL to call * @param data A map of parameters */ public static void asyncPost(final Plugin plugin, final String url, final Map data) { schedule.runTaskAsynchronously(plugin, () -> { try { HTTP(url, HttpMethod.POST, data); } catch (Exception ex) { logger.warning("POST request failed. (" + url + ")"); } }); } /** * @param plugin The calling plugin * @param url The URL to call * @param data A map of parameters * @param callback A class implementing an ICallBack to run upon completion * @see ICallback */ public static void asyncPostCallback(final Plugin plugin, final String url, final Map data, final ICallback callback) { schedule.runTaskAsynchronously(plugin, () -> { try { String result = HTTP(url, HttpMethod.POST, data); callback.invoke(result); } catch (Exception ex) { logger.warning("POST request failed. (" + url + ")"); } }); } public enum HttpMethod { GET, POST } public static String HTTP(String endpoint, HttpMethod method, Map data) throws Exception { if (method == HttpMethod.POST) { MultipartUtility request = new MultipartUtility(endpoint, "utf-8"); for (String key : data.keySet()) { request.addFormField(key, data.get(key)); } return request.finish(); } // Set up data StringJoiner sj = new StringJoiner("&"); for(Map.Entry entry : data.entrySet()) sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue(), "UTF-8")); // Set up URL endpoint += "?" + sj.toString(); URL url = new URL(endpoint); HttpURLConnection http = (HttpURLConnection) url.openConnection(); StringBuilder result = new StringBuilder(); BufferedReader in = new BufferedReader(new InputStreamReader(http.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { result.append(inputLine); } http.disconnect(); return result.toString(); } }