diff --git a/src/main/java/com/kuba6000/ae2webintegration/AE2JobTracker.java b/src/main/java/com/kuba6000/ae2webintegration/AE2JobTracker.java index dc864e4..53f0899 100644 --- a/src/main/java/com/kuba6000/ae2webintegration/AE2JobTracker.java +++ b/src/main/java/com/kuba6000/ae2webintegration/AE2JobTracker.java @@ -9,6 +9,7 @@ import org.apache.commons.lang3.tuple.Pair; +import com.kuba6000.ae2webintegration.discord.DiscordManager; import com.kuba6000.ae2webintegration.mixins.AE2.CraftingCPUClusterAccessor; import com.kuba6000.ae2webintegration.mixins.AE2.CraftingLinkAccessor; @@ -241,13 +242,28 @@ public static void completeCrafting(ICraftingCPU cpu) { info.isDone = true; info.timeDone = System.currentTimeMillis(); trackingInfos.put(nextFreeTrackingInfoID++, info); + double took = info.timeDone - info.timeStarted; + took /= 1000d; + DiscordManager.postMessageNonBlocking( + new DiscordManager.DiscordEmbed( + "AE2 Job Tracker", + "Crafting for `" + info.finalOutput.getItemStack() + .getDisplayName() + + " x" + + info.finalOutput.getStackSize() + + "` " + + (info.wasCancelled ? "cancelled" : "completed") + + "!\nIt took " + + took + + "s", + info.wasCancelled ? 15548997 : 5763719)); } public static void cancelCrafting(ICraftingCPU cpu) { JobTrackingInfo info = trackingInfoMap.get(cpu); if (info == null) return; - completeCrafting(cpu); info.wasCancelled = true; + completeCrafting(cpu); } } diff --git a/src/main/java/com/kuba6000/ae2webintegration/CommonProxy.java b/src/main/java/com/kuba6000/ae2webintegration/CommonProxy.java index cbfe500..841780b 100644 --- a/src/main/java/com/kuba6000/ae2webintegration/CommonProxy.java +++ b/src/main/java/com/kuba6000/ae2webintegration/CommonProxy.java @@ -1,6 +1,7 @@ package com.kuba6000.ae2webintegration; import com.kuba6000.ae2webintegration.commands.ReloadCommandHandler; +import com.kuba6000.ae2webintegration.discord.DiscordManager; import com.kuba6000.ae2webintegration.utils.VersionChecker; import cpw.mods.fml.common.FMLCommonHandler; @@ -44,6 +45,9 @@ public void serverStarting(FMLServerStartingEvent event) { public void serverStarted(FMLServerStartedEvent event) { AE2Controller.init(); + DiscordManager.init(); + DiscordManager.postMessageNonBlocking( + new DiscordManager.DiscordEmbed("AE2 Web Integration", "Discord integration started!")); } public void serverStopping(FMLServerStoppingEvent event) { diff --git a/src/main/java/com/kuba6000/ae2webintegration/Config.java b/src/main/java/com/kuba6000/ae2webintegration/Config.java index 8cc638f..83961d0 100644 --- a/src/main/java/com/kuba6000/ae2webintegration/Config.java +++ b/src/main/java/com/kuba6000/ae2webintegration/Config.java @@ -16,12 +16,22 @@ public class Config { .toString(); public static int AE_PORT = 2324; + // discord + public static String DISCORD_WEBHOOK = ""; + public static String DISCORD_ROLE_ID = ""; + public static void synchronizeConfiguration() { Configuration configuration = new Configuration(configFile); AE_PORT = configuration .getInt("port", Configuration.CATEGORY_GENERAL, AE_PORT, 1, 65535, "Port for the hosted website"); AE_PASSWORD = configuration .getString("password", Configuration.CATEGORY_GENERAL, AE_PASSWORD, "Password for the hosted website"); + + DISCORD_WEBHOOK = configuration + .getString("discord_webhook", "discord", "", "Discord webhook url (OPTIONAL, leave empty to ignore)"); + DISCORD_ROLE_ID = configuration + .getString("discord_role_id", "discord", "", "Role to ping on message (OPTIONAL, leave empty to ignore)"); + if (configuration.hasChanged()) { configuration.save(); } diff --git a/src/main/java/com/kuba6000/ae2webintegration/discord/DiscordManager.java b/src/main/java/com/kuba6000/ae2webintegration/discord/DiscordManager.java new file mode 100644 index 0000000..427f629 --- /dev/null +++ b/src/main/java/com/kuba6000/ae2webintegration/discord/DiscordManager.java @@ -0,0 +1,114 @@ +package com.kuba6000.ae2webintegration.discord; + +import static com.kuba6000.ae2webintegration.AE2WebIntegration.MODID; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.URL; +import java.util.concurrent.ConcurrentLinkedQueue; + +import javax.net.ssl.HttpsURLConnection; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.kuba6000.ae2webintegration.Config; + +public class DiscordManager extends Thread { + + private static final Logger LOG = LogManager.getLogger(MODID + " - DISCORD INTEGRATION"); + + private static DiscordManager thread; + + private static ConcurrentLinkedQueue toPush = new ConcurrentLinkedQueue<>(); + + public static void init() { + if (thread != null) return; + thread = new DiscordManager(); + thread.start(); + } + + public static void postMessageNonBlocking(DiscordEmbed message) { + toPush.offer(message); + } + + public static class DiscordEmbed { + + String title; + String description; + int color; + + public DiscordEmbed(String title, String description, int color) { + this.title = title; + this.description = description; + this.color = color; + } + + public DiscordEmbed(String title, String description) { + this(title, description, 1752220); + } + } + + private static void postMessage(DiscordEmbed message) { + if (Config.DISCORD_WEBHOOK.isEmpty()) return; + + String roleID = Config.DISCORD_ROLE_ID; + + JsonObject json = new JsonObject(); + json.addProperty("username", "AE2 Web Integration"); + json.addProperty("content", !roleID.isEmpty() ? "<@&" + roleID + ">" : ""); + JsonArray embeds = new JsonArray(); + JsonObject embed = new JsonObject(); + embed.addProperty("title", message.title); + embed.addProperty("description", message.description); + embed.addProperty("color", message.color); + embeds.add(embed); + json.add("embeds", embeds); + json.add("attachments", new JsonArray()); + + URL url = null; + try { + url = new URL(Config.DISCORD_WEBHOOK); + + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("User-Agent", "AE2-Web-Integration"); + connection.setDoOutput(true); + connection.setRequestMethod("POST"); + + OutputStream stream = connection.getOutputStream(); + stream.write( + json.toString() + .getBytes()); + stream.flush(); + stream.close(); + + int code; + if ((code = connection.getResponseCode()) != 200) { + LOG.error("Error, response code: {}", code); + } + } catch (IOException e) { + // throw new RuntimeException(e); + } + } + + @Override + public void run() { + while (true) { + if (toPush.peek() != null) { + DiscordEmbed message; + while ((message = toPush.poll()) != null) { + postMessage(message); + } + } + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // throw new RuntimeException(e); + } + } + } +}