diff --git a/src/main/java/arcanitor/civilengineering/CivilEngineering.java b/src/main/java/arcanitor/civilengineering/CivilEngineering.java index 6e41b91..e62cd74 100644 --- a/src/main/java/arcanitor/civilengineering/CivilEngineering.java +++ b/src/main/java/arcanitor/civilengineering/CivilEngineering.java @@ -1,7 +1,8 @@ package arcanitor.civilengineering; +import arcanitor.civilengineering.bridge.OutgoingMessageHandler; import arcanitor.civilengineering.eventhandlers.FMLEventHandler; -import arcanitor.civilengineering.bridge.MessageHandler; +import arcanitor.civilengineering.bridge.IncomingMessageHandler; import arcanitor.civilengineering.server.ServerChatWriter; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; @@ -25,7 +26,8 @@ public class CivilEngineering { public static CivilEngineering instance; public static Logger logger; - public static Thread networkThread = new Thread(new MessageHandler()); + public static Thread incomingMessageThread = new Thread(new IncomingMessageHandler()); + public static Thread outgoingMessageThread = new Thread(new OutgoingMessageHandler()); @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { diff --git a/src/main/java/arcanitor/civilengineering/bridge/ApiMessage.java b/src/main/java/arcanitor/civilengineering/bridge/ApiMessage.java index 5c770fa..76d7107 100644 --- a/src/main/java/arcanitor/civilengineering/bridge/ApiMessage.java +++ b/src/main/java/arcanitor/civilengineering/bridge/ApiMessage.java @@ -19,6 +19,11 @@ public class ApiMessage { this.gateway = Config.gateway; } + public ApiMessage(String user, String msg, String event) { + this.username = user; + this.text = msg; + this.event = event; + } public static ApiMessage decode(String json) { Gson gson = new Gson(); @@ -44,4 +49,6 @@ public class ApiMessage { return this.event; } + + } diff --git a/src/main/java/arcanitor/civilengineering/bridge/MessageHandler.java b/src/main/java/arcanitor/civilengineering/bridge/IncomingMessageHandler.java similarity index 82% rename from src/main/java/arcanitor/civilengineering/bridge/MessageHandler.java rename to src/main/java/arcanitor/civilengineering/bridge/IncomingMessageHandler.java index efb259e..6ab13dc 100644 --- a/src/main/java/arcanitor/civilengineering/bridge/MessageHandler.java +++ b/src/main/java/arcanitor/civilengineering/bridge/IncomingMessageHandler.java @@ -11,11 +11,11 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; -public class MessageHandler implements Runnable { +public class IncomingMessageHandler implements Runnable { private HttpURLConnection connection = null; public void run() { - CivilEngineering.logger.info("Network Thread starting."); + CivilEngineering.logger.info("Receiving Network Thread starting."); try { connect(Config.connectURL,Config.authToken); BufferedReader input = @@ -31,9 +31,10 @@ public class MessageHandler implements Runnable { if (e instanceof InterruptedException) { connection.disconnect(); //close the connection - CivilEngineering.logger.info("Bridge demolished!"); + CivilEngineering.logger.info("Receiving connection closed."); } else if (e instanceof IOException) { - CivilEngineering.logger.error("Bridge construction failed!"); + CivilEngineering.outgoingMessageThread.interrupt(); + CivilEngineering.logger.error("Error connecting to bridge server!"); CivilEngineering.logger.error(e.getMessage()); } } diff --git a/src/main/java/arcanitor/civilengineering/bridge/OutgoingMessageHandler.java b/src/main/java/arcanitor/civilengineering/bridge/OutgoingMessageHandler.java new file mode 100644 index 0000000..917e45a --- /dev/null +++ b/src/main/java/arcanitor/civilengineering/bridge/OutgoingMessageHandler.java @@ -0,0 +1,77 @@ +package arcanitor.civilengineering.bridge; + +import arcanitor.civilengineering.CivilEngineering; +import arcanitor.civilengineering.Config; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.concurrent.ConcurrentLinkedQueue; + +import static java.lang.Thread.sleep; + +public class OutgoingMessageHandler implements Runnable { + public static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); + + public void run() { + CivilEngineering.logger.info("Sending network thread starting"); + try { + while(true) { + ApiMessage nextMessage = queue.poll(); + if (nextMessage!=null) { + int response = postMessage(nextMessage); + if (response != 200) { + CivilEngineering.logger.error("Server returned error "+response); + break; + } + sleep(50); + } + } + } catch (Exception e) { + if (e instanceof InterruptedException) { + CivilEngineering.logger.info("Sending connection closed."); + } else if (e instanceof IOException) { + CivilEngineering.incomingMessageThread.interrupt(); + CivilEngineering.logger.error("Error connecting to bridge server!"); + CivilEngineering.logger.error(e.getMessage()); + } + + } + } + + public int postMessage(ApiMessage message) throws IOException { + + //open a connection + URL url = new URL(Config.connectURL + "api/messages"); + URLConnection urlConnection = url.openConnection(); + HttpURLConnection connection = (HttpURLConnection)urlConnection; + + //configure the connection + connection.setAllowUserInteraction(false); + connection.setInstanceFollowRedirects(true); + connection.setRequestProperty("Content-Type","application/json"); + connection.setRequestMethod("POST"); + if (Config.authToken != null) { + connection.setRequestProperty ("Authorization", "Bearer " + Config.authToken); + } + + //encode the ApiMessage for sending + String json = message.encode(); + + //send the message + connection.setDoOutput(true); + DataOutputStream post = new DataOutputStream(connection.getOutputStream()); + post.writeBytes(json); + post.flush(); + post.close(); + + int response = connection.getResponseCode(); + CivilEngineering.logger.info(response); + + connection.disconnect(); + + return response; + } +} diff --git a/src/main/java/arcanitor/civilengineering/eventhandlers/ChatMessageHandler.java b/src/main/java/arcanitor/civilengineering/eventhandlers/ChatMessageHandler.java index 8c906eb..35055fd 100644 --- a/src/main/java/arcanitor/civilengineering/eventhandlers/ChatMessageHandler.java +++ b/src/main/java/arcanitor/civilengineering/eventhandlers/ChatMessageHandler.java @@ -1,6 +1,8 @@ package arcanitor.civilengineering.eventhandlers; import arcanitor.civilengineering.CivilEngineering; +import arcanitor.civilengineering.bridge.ApiMessage; +import arcanitor.civilengineering.bridge.OutgoingMessageHandler; import net.minecraftforge.event.ServerChatEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -9,6 +11,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class ChatMessageHandler { @SubscribeEvent public static void handleServerChatEvent (ServerChatEvent event) { - CivilEngineering.logger.info("Message on server: "+event.getMessage()+" sent by "+event.getUsername()); + String message = event.getMessage().trim(); + if (!message.isEmpty()) + OutgoingMessageHandler.queue.add(new ApiMessage(event.getUsername(),message)); } } diff --git a/src/main/java/arcanitor/civilengineering/eventhandlers/DeathEventHandler.java b/src/main/java/arcanitor/civilengineering/eventhandlers/DeathEventHandler.java index fc1b817..fdf65b6 100644 --- a/src/main/java/arcanitor/civilengineering/eventhandlers/DeathEventHandler.java +++ b/src/main/java/arcanitor/civilengineering/eventhandlers/DeathEventHandler.java @@ -2,6 +2,8 @@ package arcanitor.civilengineering.eventhandlers; import arcanitor.civilengineering.CivilEngineering; import arcanitor.civilengineering.Config; +import arcanitor.civilengineering.bridge.ApiMessage; +import arcanitor.civilengineering.bridge.OutgoingMessageHandler; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.event.entity.living.LivingDeathEvent; @@ -16,11 +18,8 @@ public class DeathEventHandler { EntityLivingBase entity = event.getEntityLiving(); if (entity instanceof EntityPlayer) { String message = entity.getCombatTracker().getDeathMessage().getUnformattedText(); - CivilEngineering.logger.info(message); + OutgoingMessageHandler.queue.add(new ApiMessage("Server",message)); } } - } - - } diff --git a/src/main/java/arcanitor/civilengineering/eventhandlers/FMLEventHandler.java b/src/main/java/arcanitor/civilengineering/eventhandlers/FMLEventHandler.java index 57c2332..ca63bd7 100644 --- a/src/main/java/arcanitor/civilengineering/eventhandlers/FMLEventHandler.java +++ b/src/main/java/arcanitor/civilengineering/eventhandlers/FMLEventHandler.java @@ -26,9 +26,11 @@ public class FMLEventHandler { } } public static void serverStarting(FMLServerStartingEvent event) { - CivilEngineering.networkThread.start(); + CivilEngineering.incomingMessageThread.start(); + CivilEngineering.outgoingMessageThread.start(); } public static void serverStopping(FMLServerStoppingEvent event) { - CivilEngineering.networkThread.interrupt(); + CivilEngineering.incomingMessageThread.interrupt(); + CivilEngineering.outgoingMessageThread.interrupt(); } } diff --git a/src/main/java/arcanitor/civilengineering/eventhandlers/UserActionHandler.java b/src/main/java/arcanitor/civilengineering/eventhandlers/UserActionHandler.java new file mode 100644 index 0000000..4a278fa --- /dev/null +++ b/src/main/java/arcanitor/civilengineering/eventhandlers/UserActionHandler.java @@ -0,0 +1,30 @@ +package arcanitor.civilengineering.eventhandlers; + +import arcanitor.civilengineering.CivilEngineering; +import arcanitor.civilengineering.bridge.ApiMessage; +import arcanitor.civilengineering.bridge.OutgoingMessageHandler; +import net.minecraft.command.server.CommandEmote; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraftforge.event.CommandEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +@Mod.EventBusSubscriber +public class UserActionHandler { + @SubscribeEvent + public static void handleCommandEvent(CommandEvent event) { + if(event.getCommand() instanceof CommandEmote && event.getSender() instanceof EntityPlayer) { + String[] args = event.getParameters(); + + String user = event.getSender().getName(); + String message = ""; + + for(String word:args) { + message = message + " " + word; + } + + OutgoingMessageHandler.queue.add(new ApiMessage(user,message,"user_action")); + } + } +} diff --git a/src/main/java/arcanitor/civilengineering/server/ServerChatWriter.java b/src/main/java/arcanitor/civilengineering/server/ServerChatWriter.java index 3f92232..372ddc2 100644 --- a/src/main/java/arcanitor/civilengineering/server/ServerChatWriter.java +++ b/src/main/java/arcanitor/civilengineering/server/ServerChatWriter.java @@ -17,14 +17,13 @@ public class ServerChatWriter { ApiMessage nextMessage = messages.poll(); if (nextMessage != null) { - CivilEngineering.logger.info("Processing message"); String user = nextMessage.getUsername(); String text = nextMessage.getMessage().trim(); String message; if (!text.isEmpty()) { - if (nextMessage.getEvent() == "user_action") { + if (nextMessage.getEvent().equals("user_action")) { message = "* " + user + " " + text; } else { message = "<" + user + "> " + text;