From 5ed7bfb4862742c99949ebf7f35576c6b1080bd0 Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris@kearneymail.com>
Date: Sat, 13 May 2017 18:48:10 -0700
Subject: [PATCH] load merchant

---
 .../commands/admin/LoadItemCommand.java       |  2 +-
 .../commands/admin/LoadMerchantCommand.java   | 98 +++++++++++++++++++
 .../commands/admin/LoadNpcCommand.java        |  2 +-
 .../configuration/ConfigureCommands.java      |  1 +
 4 files changed, 101 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/com/comandante/creeper/command/commands/admin/LoadMerchantCommand.java

diff --git a/src/main/java/com/comandante/creeper/command/commands/admin/LoadItemCommand.java b/src/main/java/com/comandante/creeper/command/commands/admin/LoadItemCommand.java
index 7597911d..8a4e1719 100644
--- a/src/main/java/com/comandante/creeper/command/commands/admin/LoadItemCommand.java
+++ b/src/main/java/com/comandante/creeper/command/commands/admin/LoadItemCommand.java
@@ -45,7 +45,7 @@ public class LoadItemCommand extends Command {
 
             String itemJsonUrl = originalMessageParts.get(0);
             if (!isValidURL(itemJsonUrl)) {
-                write("Inavlid HTTP address." + "\r\n");
+                write("Invalid HTTP address." + "\r\n");
                 return;
             }
 
diff --git a/src/main/java/com/comandante/creeper/command/commands/admin/LoadMerchantCommand.java b/src/main/java/com/comandante/creeper/command/commands/admin/LoadMerchantCommand.java
new file mode 100644
index 00000000..a3cb14f9
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/command/commands/admin/LoadMerchantCommand.java
@@ -0,0 +1,98 @@
+package com.comandante.creeper.command.commands.admin;
+
+import com.comandante.creeper.command.commands.Command;
+import com.comandante.creeper.core_game.GameManager;
+import com.comandante.creeper.merchant.MerchantMetadata;
+import com.comandante.creeper.player.PlayerRole;
+import com.google.common.collect.Sets;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.util.EntityUtils;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.MessageEvent;
+
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+public class LoadMerchantCommand extends Command {
+
+    final static List<String> validTriggers = Arrays.asList("loadmerchant");
+    final static String description = "Load a Merchant using JSON over http";
+    final static String correctUsage = "loadmerchant <http url with json for npc>";
+    final static Set<PlayerRole> roles = Sets.newHashSet(PlayerRole.ADMIN);
+
+    public LoadMerchantCommand(GameManager gameManager) {
+        super(gameManager, validTriggers, description, correctUsage, roles);
+    }
+
+    @Override
+    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
+        execCommand(ctx, e, () -> {
+
+            if (originalMessageParts.size() <= 1) {
+                write("Please specify a http url." + "\r\n");
+                return;
+            }
+
+            originalMessageParts.remove(0);
+
+
+            String npcJsonHttpUrl = originalMessageParts.get(0);
+            if (!isValidURL(npcJsonHttpUrl)) {
+                write("Invalid HTTP address." + "\r\n");
+                return;
+            }
+
+            HttpGet httpGet = new HttpGet(npcJsonHttpUrl);
+
+            HttpClient httpclient = gameManager.getHttpclient();
+
+            HttpResponse httpResponse = httpclient.execute(httpGet);
+
+            HttpEntity entity = httpResponse.getEntity();
+
+            if (entity == null) {
+                write("Error retrieving JSON url." + "\r\n");
+                return;
+            }
+
+            String npcJson = EntityUtils.toString(entity);
+
+            MerchantMetadata merchantMetadata = null;
+            try {
+                merchantMetadata = gameManager.getGson().fromJson(npcJson, MerchantMetadata.class);
+            } catch (Exception ex) {
+                write("Retrieved JSON file is malformed. " + ex.getLocalizedMessage() + "\r\n");
+                return;
+            }
+            httpGet.reset();
+
+            gameManager.getMerchantStorage().saveMerchantMetadata(merchantMetadata);
+            write("Merchant Saved. - " + merchantMetadata.getInternalName() + "\r\n");
+
+        });
+    }
+
+    public boolean isValidURL(String url) {
+        URL u = null;
+        try {
+            u = new URL(url);
+        } catch (MalformedURLException e) {
+            return false;
+        }
+        try {
+            u.toURI();
+        } catch (URISyntaxException e) {
+            return false;
+        }
+        return true;
+    }
+
+}
+
diff --git a/src/main/java/com/comandante/creeper/command/commands/admin/LoadNpcCommand.java b/src/main/java/com/comandante/creeper/command/commands/admin/LoadNpcCommand.java
index 82ef7744..f9c13be5 100644
--- a/src/main/java/com/comandante/creeper/command/commands/admin/LoadNpcCommand.java
+++ b/src/main/java/com/comandante/creeper/command/commands/admin/LoadNpcCommand.java
@@ -45,7 +45,7 @@ public class LoadNpcCommand extends Command {
 
             String npcJsonHttpUrl = originalMessageParts.get(0);
             if (!isValidURL(npcJsonHttpUrl)) {
-                write("Inavlid HTTP address." + "\r\n");
+                write("Invalid HTTP address." + "\r\n");
                 return;
             }
 
diff --git a/src/main/java/com/comandante/creeper/configuration/ConfigureCommands.java b/src/main/java/com/comandante/creeper/configuration/ConfigureCommands.java
index e12702d7..1c4b1e0e 100644
--- a/src/main/java/com/comandante/creeper/configuration/ConfigureCommands.java
+++ b/src/main/java/com/comandante/creeper/configuration/ConfigureCommands.java
@@ -103,5 +103,6 @@ public class ConfigureCommands {
         creeperCommandRegistry.addCommand(new ToggleChatCommand(gameManager));
         creeperCommandRegistry.addCommand(new LoadNpcCommand(gameManager));
         creeperCommandRegistry.addCommand(new LoadItemCommand(gameManager));
+        creeperCommandRegistry.addCommand(new LoadMerchantCommand(gameManager));
     }
 }
-- 
GitLab