From 9a4795e90b484fbf40259b7c40c603a8f5d5da77 Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris.kearney@urbanairship.com>
Date: Sat, 6 Sep 2014 03:20:36 -0700
Subject: [PATCH] improved chat stuff, changing where i print the prompt to be
 a netty handler

---
 pom.xml                                       |  6 ++
 .../comandante/creeper/Items/ItemType.java    |  4 +-
 .../creeper/Items/ItemUseHandler.java         |  2 +-
 .../creeper/fight/FightManager.java           |  8 +-
 .../comandante/creeper/fight/FightRun.java    |  7 +-
 .../creeper/managers/GameManager.java         | 26 +++---
 .../com/comandante/creeper/npc/NpcMover.java  |  2 +-
 .../comandante/creeper/npc/StreetHustler.java |  8 +-
 .../creeper/player/PlayerManager.java         |  4 +-
 .../creeper/server/ChannelUtils.java          | 82 +++----------------
 .../server/CreeperAuthenticationHandler.java  |  9 +-
 .../creeper/server/CreeperSession.java        |  9 ++
 .../creeper/server/command/Command.java       |  3 +
 .../creeper/server/command/GossipCommand.java |  2 +-
 .../server/command/InventoryCommand.java      |  2 -
 .../server/command/MovementCommand.java       | 12 +--
 .../creeper/server/command/SayCommand.java    |  2 +-
 .../creeper/server/command/TellCommand.java   |  2 +-
 .../server/command/UnknownCommand.java        |  8 +-
 .../creeper/server/command/WhoCommand.java    |  2 +-
 .../command/admin/DescriptionCommand.java     |  2 +-
 .../server/command/admin/TagRoomCommand.java  |  2 +-
 22 files changed, 87 insertions(+), 117 deletions(-)

diff --git a/pom.xml b/pom.xml
index 52b4842c..09ac228c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,8 +53,14 @@
       <artifactId>metrics-core</artifactId>
       <version>3.0.2</version>
     </dependency>
+    <dependency>
+      <groupId>com.googlecode.concurrentlinkedhashmap</groupId>
+      <artifactId>concurrentlinkedhashmap-lru</artifactId>
+      <version>1.4</version>
+    </dependency>
   </dependencies>
 
+
   <build>
     <plugins>
       <plugin>
diff --git a/src/main/java/com/comandante/creeper/Items/ItemType.java b/src/main/java/com/comandante/creeper/Items/ItemType.java
index c5a7e8c4..2d8c566b 100644
--- a/src/main/java/com/comandante/creeper/Items/ItemType.java
+++ b/src/main/java/com/comandante/creeper/Items/ItemType.java
@@ -18,8 +18,8 @@ public enum ItemType {
             60),
 
     BEER(2, Arrays.asList("beer", "can of beer", "b"),
-            CYAN + "a dented can of beer" + RESET,
-            CYAN + "a beer" + RESET + " lies on the ground, unopened",
+            "a dented can of " + CYAN + "beer" + RESET,
+            "a " + CYAN + "beer" + RESET + " lies on the ground, unopened",
             "This beer looks sketch but you'll probably drink it anyways.",
             true,
             2,
diff --git a/src/main/java/com/comandante/creeper/Items/ItemUseHandler.java b/src/main/java/com/comandante/creeper/Items/ItemUseHandler.java
index e0793446..ccdd84d9 100644
--- a/src/main/java/com/comandante/creeper/Items/ItemUseHandler.java
+++ b/src/main/java/com/comandante/creeper/Items/ItemUseHandler.java
@@ -63,7 +63,7 @@ public class ItemUseHandler {
     }
 
     private void writeToPlayer(String message) {
-        gameManager.getChannelUtils().writeNoPrompt(playerId, message);
+        gameManager.getChannelUtils().write(playerId, message);
     }
 
     private void incrementUses(Item item) {
diff --git a/src/main/java/com/comandante/creeper/fight/FightManager.java b/src/main/java/com/comandante/creeper/fight/FightManager.java
index b70fa3a3..b188db0f 100644
--- a/src/main/java/com/comandante/creeper/fight/FightManager.java
+++ b/src/main/java/com/comandante/creeper/fight/FightManager.java
@@ -52,9 +52,9 @@ public class FightManager {
         }
         if (damageToVictim > 0) {
             doNpcDamage(npc.getEntityId(), damageToVictim);
-            channelUtils.writeNoPromptNoAfterSpace(player.getPlayerId(), damageToVictim + Color.BOLD_ON + Color.RED + " damage" + Color.RESET + " done to " + npc.getColorName());
+            channelUtils.write(player.getPlayerId(), damageToVictim + Color.BOLD_ON + Color.RED + " DAMAGE" + Color.RESET + " done to " + npc.getColorName(), true);
         } else {
-            channelUtils.writeNoPromptNoAfterSpace(player.getPlayerId(), "You miss " + npc.getName());
+            channelUtils.write(player.getPlayerId(), "You MISS " + npc.getName() + "!", true);
         }
         try {
             Thread.sleep(600);
@@ -68,9 +68,9 @@ public class FightManager {
         int damageBack = getAttack(victim, challenger);
         if (randInt(0, 100) < chanceToHitBack) {
             doPlayerDamage(player.getPlayerId(), damageBack);
-            channelUtils.writeNoPromptNoAfterSpace(player.getPlayerId(), npc.getColorName() + Color.BOLD_ON + Color.RED + " damages" + Color.RESET + " you for " + damageBack);
+            channelUtils.write(player.getPlayerId(), npc.getColorName() + Color.BOLD_ON + Color.RED + " DAMAGES" + Color.RESET + " you for " + damageBack, true);
         } else {
-            channelUtils.writeNoPromptNoAfterSpace(player.getPlayerId(), npc.getColorName() + " misses you");
+            channelUtils.write(player.getPlayerId(), npc.getColorName() + " MISSES you!", true);
         }
         try {
             Thread.sleep(600);
diff --git a/src/main/java/com/comandante/creeper/fight/FightRun.java b/src/main/java/com/comandante/creeper/fight/FightRun.java
index 4d0c5759..b9caaea1 100644
--- a/src/main/java/com/comandante/creeper/fight/FightRun.java
+++ b/src/main/java/com/comandante/creeper/fight/FightRun.java
@@ -32,7 +32,7 @@ public class FightRun implements Callable<FightResults> {
                 break;
             }
             gameManager.getFightManager().fightTurn(playerStats, npcStats, 3, player, npc);
-            gameManager.getChannelUtils().write(player.getPlayerId(), "Use an ability!");
+            gameManager.getChannelUtils().write(player.getPlayerId(), "Use an ability!", true);
             gameManager.getPlayerManager().getSessionManager().getSession(player.getPlayerId()).setIsAbleToDoAbility(true);
             try {
                 Thread.sleep(2200);
@@ -48,19 +48,18 @@ public class FightRun implements Callable<FightResults> {
 
 
         if (playerStats.getCurrentHealth() <= 0) {
-            gameManager.getChannelUtils().write(player.getPlayerId(), "You died.");
+            gameManager.getChannelUtils().write(player.getPlayerId(), "You died.", true);
             gameManager.getChannelUtils().writeToRoom(player.getPlayerId(), player.getPlayerName() + " is now dead.");
             npc.setIsInFight(false);
             fightResults = new FightResultsBuilder().setNpcWon(true).setPlayerWon(false).createFightResults();
         }
 
         if (npcStats.getCurrentHealth() <= 0) {
-            gameManager.getChannelUtils().writeNoPrompt(player.getPlayerId(), "You killed " + npc.getName());
+            gameManager.getChannelUtils().write(player.getPlayerId(), "You killed " + npc.getName(), true);
             gameManager.getChannelUtils().writeToRoom(player.getPlayerId(), npc.getDieMessage());
             gameManager.getEntityManager().deleteNpcEntity(npc.getEntityId());
             fightResults = new FightResultsBuilder().setNpcWon(false).setPlayerWon(true).createFightResults();
         }
-        gameManager.getChannelUtils().writeOnlyPrompt(player.getPlayerId());
         return fightResults;
     }
 }
diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java
index de1e8529..aef12391 100644
--- a/src/main/java/com/comandante/creeper/managers/GameManager.java
+++ b/src/main/java/com/comandante/creeper/managers/GameManager.java
@@ -139,10 +139,10 @@ public class GameManager {
                 StringBuilder sb = new StringBuilder();
                 sb.append(playerMovement.getPlayer().getPlayerName());
                 sb.append(" ").append(playerMovement.getRoomExitMessage());
-                channelUtils.writeNoPrompt(next.getPlayerId(), sb.toString());
+                channelUtils.write(next.getPlayerId(), sb.toString(), true);
             }
             for (Player next : playerManager.getPresentPlayers(destinationRoom)) {
-                channelUtils.writeNoPrompt(next.getPlayerId(), playerMovement.getPlayer().getPlayerName() + " arrived.");
+                channelUtils.write(next.getPlayerId(), playerMovement.getPlayer().getPlayerName() + " arrived.", true);
             }
             destinationRoom.addPresentPlayer(playerMovement.getPlayer().getPlayerId());
         }
@@ -155,7 +155,7 @@ public class GameManager {
             if (next.getPlayerId().equals(player.getPlayerId())) {
                 continue;
             }
-            channelUtils.write(next.getPlayerId(), player.getPlayerName() + " arrived.");
+            channelUtils.write(next.getPlayerId(), player.getPlayerName() + " arrived.", true);
         }
     }
 
@@ -246,17 +246,17 @@ public class GameManager {
         sb.append(playerCurrentRoom.getRoomTitle()).append("\r\n\r\n");
         sb.append(RESET);
         //java.lang.String wrap(java.lang.String str, int wrapLength, java.lang.String newLineStr, boolean wrapLongWords)
-        sb.append(WordUtils.wrap(playerCurrentRoom.getRoomDescription(), 80, "\r\n", true)).append("\r\n");
+        sb.append(WordUtils.wrap(playerCurrentRoom.getRoomDescription(), 80, "\r\n", true)).append("\r\n").append("\r\n");
         if (playerCurrentRoom.getMapData().isPresent()) {
             sb.append(playerCurrentRoom.getMapData().get()).append("\r\n");
         }
-        sb.append(getExits(playerCurrentRoom, player));
+        sb.append(getExits(playerCurrentRoom, player)).append("\r\n");
         for (String searchPlayerId : playerCurrentRoom.getPresentPlayerIds()) {
             if (searchPlayerId.equals(player.getPlayerId())) {
                 continue;
             }
             Player searchPlayer = playerManager.getPlayer(searchPlayerId);
-            sb.append(searchPlayer.getPlayerName()).append(" is here.\r\n").append(RESET);
+            sb.append(searchPlayer.getPlayerName()).append(" is here.").append(RESET).append("\r\n");
         }
 
         for (String itemId : playerCurrentRoom.getItemIds()) {
@@ -272,8 +272,14 @@ public class GameManager {
             Npc npcEntity = entityManager.getNpcEntity(npcId);
             sb.append("a ").append(npcEntity.getColorName()).append(" is here.\r\n");
         }
-        sb.append("\r\n");
-        channelUtils.write(player.getPlayerId(), sb.toString());
+        String msg = null;
+        if (sb.toString().substring(sb.toString().length() - 2).equals("\r\n")) {
+            CharSequence charSequence = sb.toString().subSequence(0, sb.toString().length() - 2);
+            msg = charSequence.toString();
+        } else {
+            msg = sb.toString();
+        }
+        channelUtils.write(player.getPlayerId(), msg);
     }
 
     public void currentRoomLogic(CreeperSession creeperSession, MessageEvent e) {
@@ -299,10 +305,10 @@ public class GameManager {
         for (String playerId : presentPlayerIds) {
             Player player = playerManager.getPlayer(playerId);
             if (player.getPlayerId().equals(sourcePlayerId)) {
-                channelUtils.writeNoPrompt(playerId, message);
+                channelUtils.write(playerId, message, true);
                 continue;
             }
-            channelUtils.write(player.getPlayerId(), message);
+            channelUtils.write(player.getPlayerId(), message, true);
         }
     }
 }
diff --git a/src/main/java/com/comandante/creeper/npc/NpcMover.java b/src/main/java/com/comandante/creeper/npc/NpcMover.java
index 162843aa..aa247535 100644
--- a/src/main/java/com/comandante/creeper/npc/NpcMover.java
+++ b/src/main/java/com/comandante/creeper/npc/NpcMover.java
@@ -39,7 +39,7 @@ public class NpcMover {
         npcCurrentRoom.getNpcIds().remove(npcId);
         gameManager.roomSay(npcCurrentRoom.getRoomId(), npcEntity.getColorName() + " " + exitMessage, "");
         gameManager.getRoomManager().getRoom(destinationRoomId).getNpcIds().add(npcId);
-        gameManager.roomSay(destinationRoomId, npcEntity.getColorName() + " has arrived.", "");
+        gameManager.roomSay(destinationRoomId, npcEntity.getColorName() + " has arrived." , "");
     }
 
     public String getExitMessage(Room room, Integer exitRoomId) {
diff --git a/src/main/java/com/comandante/creeper/npc/StreetHustler.java b/src/main/java/com/comandante/creeper/npc/StreetHustler.java
index 965a739f..b147bb89 100644
--- a/src/main/java/com/comandante/creeper/npc/StreetHustler.java
+++ b/src/main/java/com/comandante/creeper/npc/StreetHustler.java
@@ -13,15 +13,15 @@ import java.util.Set;
 import static com.comandante.creeper.server.Color.BOLD_ON;
 import static com.comandante.creeper.server.Color.RESET;
 
-public class StreetHustler extends Npc {
+public class
+        StreetHustler extends Npc {
     private final static long phraseIntervalMs = 300000;
     private final static String NAME = "street hustler";
     private final static Set<String> validTriggers = new HashSet<String>(Arrays.asList(new String[]
-            {"s", "street", "hustler", NAME}
+            {"s", "street", "hustler","h", NAME}
     ));
 
-    private final static String colorName = Color.BOLD_ON + Color.MAGENTA  + "s" + Color.YELLOW + "t" + Color.BLUE + "r" + Color.MAGENTA + "e" + Color.WHITE + "e" + Color.RED + "t" + Color.GREEN + " " +
-            Color.BOLD_ON + Color.YELLOW + "hustler" + RESET;
+    private final static String colorName = "street" + BOLD_ON + Color.MAGENTA + " hustler"  + Color.RESET ;
     private final static String dieMessage = "a " + colorName + " breathes his last breath in a pool of " + BOLD_ON + Color.RED + "blood" + RESET;
 
     public StreetHustler(GameManager gameManager) {
diff --git a/src/main/java/com/comandante/creeper/player/PlayerManager.java b/src/main/java/com/comandante/creeper/player/PlayerManager.java
index e9de66f2..76b95495 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerManager.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerManager.java
@@ -113,7 +113,7 @@ public class PlayerManager {
         PlayerMetadata playerMetadata = getPlayerMetadata(player.getPlayerId());
         Stats playerStats = playerMetadata.getStats();
 
-        Table t = new Table(2, BorderStyle.UNICODE_BOX,
+        Table t = new Table(2, BorderStyle.CLASSIC_COMPATIBLE,
                 ShownBorders.HEADER_AND_FOOTER);
 
         t.setColumnWidth(0, 14, 14);
@@ -157,7 +157,7 @@ public class PlayerManager {
     }
 
 
-    public String buildPrompt(String playerId, Integer roomId) {
+    public String buildPrompt(String playerId) {
         boolean isFight = FightManager.isActiveFight(sessionManager.getSession(playerId));
         Player player = getPlayer(playerId);
         PlayerMetadata playerMetadata = getPlayerMetadata(playerId);
diff --git a/src/main/java/com/comandante/creeper/server/ChannelUtils.java b/src/main/java/com/comandante/creeper/server/ChannelUtils.java
index 65319636..85487f08 100644
--- a/src/main/java/com/comandante/creeper/server/ChannelUtils.java
+++ b/src/main/java/com/comandante/creeper/server/ChannelUtils.java
@@ -17,29 +17,6 @@ public class ChannelUtils {
         this.roomManager = roomManager;
     }
 
-    public void writeNoPrompt(String playerId, String message) {
-        if (playerManager.getSessionManager().getSession(playerId).getGrabMultiLineInput().isPresent()) {
-            return;
-        }
-        write(playerId, message, false, true);
-    }
-
-    public void writeNoPromptNoAfterSpace(String playerId, String message) {
-        if (playerManager.getSessionManager().getSession(playerId).getGrabMultiLineInput().isPresent()) {
-            return;
-        }
-        write(playerId, message, false, false);
-    }
-
-    public void writeOnlyPrompt(String playerId) {
-        if (playerManager.getSessionManager().getSession(playerId).getGrabMultiLineInput().isPresent()) {
-            return;
-        }
-        Player player = playerManager.getPlayer(playerId);
-        Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(player).get();
-        player.getChannel().write(playerManager.buildPrompt(playerId, playerCurrentRoom.getRoomId()));
-    }
-
     public void writeToRoom(String playerId, String message) {
         if (playerManager.getSessionManager().getSession(playerId).getGrabMultiLineInput().isPresent()) {
             return;
@@ -48,66 +25,29 @@ public class ChannelUtils {
         Set<String> presentPlayerIds = playerCurrentRoom.getPresentPlayerIds();
         for (String id : presentPlayerIds) {
             Player presentPlayer = playerManager.getPlayer(id);
-                writeNoPrompt(presentPlayer.getPlayerId(), message);
-            }
+            write(presentPlayer.getPlayerId(), message);
         }
-
+    }
 
     public void write(String playerId, String message) {
-        if (playerManager.getSessionManager().getSession(playerId).getGrabMultiLineInput().isPresent()) {
-            return;
-        }
-        write(playerId, message, true, true);
+        write(playerId, message, false);
     }
 
-    public void write(String playerId, String message, boolean isPrompt, boolean isAfterSpace) {
+    public void write(String playerId, String message, boolean leadingBlankLine) {
         if (playerManager.getSessionManager().getSession(playerId).getGrabMultiLineInput().isPresent()) {
             return;
         }
         Player player = playerManager.getPlayer(playerId);
-        Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(player).get();
+        String lastMessage = playerManager.getSessionManager().getSession(playerId).getLastMessage();
         StringBuilder sb = new StringBuilder();
-        sb.append(message);
-        if (isAfterSpace) {
-            sb.append(("\r\n"));
-        }
-        if (isPrompt) {
-            sb.append(playerManager.buildPrompt(playerId, playerCurrentRoom.getRoomId()));
-        }
-        player.getChannel().write(sb.toString());
-    }
-
-    public static String sanitze(String msg) {
-        byte[] data = msg.getBytes();
-        byte groomedData[] = new byte[data.length];
-        int bytesCopied = 0;
-
-        for (int i = 0; i < data.length; i++) {
-            switch (data[i]) {
-                case (byte) '\n':
-                    if (i == 0 || i == 1) {
-                        break;
-                    }
-                    if (i == data.length - 1 || i == data.length - 2) {
-                        break;
-                    }
-                case (byte) '\r':
-                    if (i == 0 || i == 1) {
-                        break;
-                    }
-                    if (i == data.length - 1 || i == data.length - 2) {
-                        break;
-                    }
-                default:
-                    groomedData[bytesCopied++] = data[i];
+        if (lastMessage != null && !lastMessage.substring(lastMessage.length() - 2).equals("\r\n")) {
+            if (leadingBlankLine) {
+                sb.append("\r\n");
             }
         }
-
-        byte packedData[] = new byte[bytesCopied];
-
-        System.arraycopy(groomedData, 0, packedData, 0, bytesCopied);
-
-        return new String(packedData);
+        sb.append(message);
+        playerManager.getSessionManager().getSession(playerId).setLastMessage(sb.toString());
+        player.getChannel().write(sb.toString());
     }
 }
 
diff --git a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java
index 65e7a2f3..11b726cf 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java
@@ -1,5 +1,6 @@
 package com.comandante.creeper.server;
 
+import com.comandante.creeper.Main;
 import com.comandante.creeper.managers.GameManager;
 import com.google.common.base.Optional;
 import org.jboss.netty.channel.ChannelEvent;
@@ -58,10 +59,14 @@ public class CreeperAuthenticationHandler extends SimpleChannelUpstreamHandler {
             doAuthentication(ctx, e);
             if (creeperSession.isAuthed()) {
                 gameManager.getPlayerManager().getSessionManager().putSession(creeperSession);
-                gameManager.currentRoomLogic(creeperSession, e);
+                e.getChannel().getPipeline().remove(this);
+                e.getChannel().getPipeline().addLast("server_handler", new CreeperCommandHandler(gameManager));
+                e.getChannel().setAttachment(creeperSession);
+                gameManager.currentRoomLogic(Main.createPlayerId(creeperSession.getUsername().get()));
+                gameManager.getChannelUtils().write(Main.createPlayerId(creeperSession.getUsername().get()), "\r\n" + gameManager.getPlayerManager().buildPrompt(Main.createPlayerId(creeperSession.getUsername().get())));
             }
         } else {
-            gameManager.getPlayerManager().getSessionManager().putSession(creeperSession);
+            //gameManager.getPlayerManager().getSessionManager().putSession(creeperSession);
             e.getChannel().getPipeline().addLast("server_handler", new CreeperCommandHandler(gameManager));
             e.getChannel().getPipeline().remove(this);
             e.getChannel().setAttachment(creeperSession);
diff --git a/src/main/java/com/comandante/creeper/server/CreeperSession.java b/src/main/java/com/comandante/creeper/server/CreeperSession.java
index dccd6a4e..cfeba11e 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperSession.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperSession.java
@@ -20,6 +20,7 @@ public class CreeperSession {
     private AtomicBoolean isAbleToDoAbility = new AtomicBoolean(false);
     private Optional<CreeperEntry<UUID, Command>> grabMultiLineInput = Optional.absent();
     private final long sessionCreationTimestamp = System.currentTimeMillis();
+    private String lastMessage;
 
     State state;
 
@@ -32,6 +33,14 @@ public class CreeperSession {
         authed
     }
 
+    public String getLastMessage() {
+        return lastMessage;
+    }
+
+    public void setLastMessage(String lastMessage) {
+        this.lastMessage = lastMessage;
+    }
+
     public long getSessionCreationTimestamp() {
         return sessionCreationTimestamp;
     }
diff --git a/src/main/java/com/comandante/creeper/server/command/Command.java b/src/main/java/com/comandante/creeper/server/command/Command.java
index 299bc0c6..97836e56 100644
--- a/src/main/java/com/comandante/creeper/server/command/Command.java
+++ b/src/main/java/com/comandante/creeper/server/command/Command.java
@@ -36,6 +36,9 @@ public abstract class Command extends SimpleChannelUpstreamHandler {
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         e.getChannel().getPipeline().remove(ctx.getHandler());
+        String playerId = getPlayerId(extractCreeperSession(e.getChannel()));
+        String prompt = gameManager.getPlayerManager().buildPrompt(playerId);
+        gameManager.getChannelUtils().write(playerId, "\r\n" + prompt);
         super.messageReceived(ctx, e);
     }
 
diff --git a/src/main/java/com/comandante/creeper/server/command/GossipCommand.java b/src/main/java/com/comandante/creeper/server/command/GossipCommand.java
index 5f5448ba..2149afaa 100644
--- a/src/main/java/com/comandante/creeper/server/command/GossipCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/GossipCommand.java
@@ -48,7 +48,7 @@ public class GossipCommand extends Command {
                 if (player.getPlayerId().equals(sourcePlayer.getPlayerId())) {
                     getGameManager().getChannelUtils().write(playerId, stringBuilder.toString());
                 } else {
-                    getGameManager().getChannelUtils().writeNoPrompt(player.getPlayerId(), stringBuilder.toString());
+                    getGameManager().getChannelUtils().write(player.getPlayerId(), stringBuilder.toString());
                 }
             }
         } finally {
diff --git a/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java b/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java
index fcc83a9b..3c2dec26 100644
--- a/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/InventoryCommand.java
@@ -51,9 +51,7 @@ public class InventoryCommand extends Command {
                         sb.append(" uses left.");
                     }
                 }
-                sb.append("\r\n");
             }
-            sb.append("\r\n");
             getGameManager().getChannelUtils().write(getPlayerId(session), sb.toString());
         } finally {
             super.messageReceived(ctx, e);
diff --git a/src/main/java/com/comandante/creeper/server/command/MovementCommand.java b/src/main/java/com/comandante/creeper/server/command/MovementCommand.java
index 81af7973..d475d187 100644
--- a/src/main/java/com/comandante/creeper/server/command/MovementCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/MovementCommand.java
@@ -65,7 +65,7 @@ public class MovementCommand extends Command {
             if (northTriggers.contains(command.toLowerCase())) {
                 if (!currentRoom.getNorthId().isPresent()) {
                     channelUtils.write(getPlayerId(session), gameManager.getMapsManager().drawMap(currentRoom.getRoomId(), new Coords(9,9)));
-                    channelUtils.write(getPlayerId(session), "There's no northern exit.");
+                    channelUtils.write(getPlayerId(session), "There's no northern exit.\r\n");
                     return;
                 }
                 Room destinationRoom = gameManager.getRoomManager().getRoom(currentRoom.getNorthId().get());
@@ -74,7 +74,7 @@ public class MovementCommand extends Command {
             if (southTriggers.contains(command.toLowerCase())) {
                 if (!currentRoom.getSouthId().isPresent()) {
                     channelUtils.write(getPlayerId(session), gameManager.getMapsManager().drawMap(currentRoom.getRoomId(), new Coords(9,9)));
-                    channelUtils.write(getPlayerId(session), "There's no southern exit.");
+                    channelUtils.write(getPlayerId(session), "There's no southern exit.\r\n");
                     return;
                 }
                 Room destinationRoom = gameManager.getRoomManager().getRoom(currentRoom.getSouthId().get());
@@ -84,7 +84,7 @@ public class MovementCommand extends Command {
             if (eastTriggers.contains(command.toLowerCase())) {
                 if (!currentRoom.getEastId().isPresent()) {
                     channelUtils.write(getPlayerId(session), gameManager.getMapsManager().drawMap(currentRoom.getRoomId(), new Coords(9,9)));
-                    channelUtils.write(getPlayerId(session), "There's no eastern exit.");
+                    channelUtils.write(getPlayerId(session), "There's no eastern exit.\r\n");
                     return;
                 }
                 Room destinationRoom = gameManager.getRoomManager().getRoom(currentRoom.getEastId().get());
@@ -93,7 +93,7 @@ public class MovementCommand extends Command {
             if (westTriggers.contains(command.toLowerCase())) {
                 if (!currentRoom.getWestId().isPresent()) {
                     channelUtils.write(getPlayerId(session), gameManager.getMapsManager().drawMap(currentRoom.getRoomId(), new Coords(9,9)));
-                    channelUtils.write(getPlayerId(session), "There's no western exit.");
+                    channelUtils.write(getPlayerId(session), "There's no western exit.\r\n");
                     return;
                 }
                 Room destinationRoom = gameManager.getRoomManager().getRoom(currentRoom.getWestId().get());
@@ -102,7 +102,7 @@ public class MovementCommand extends Command {
             if (upTriggers.contains(command.toLowerCase())) {
                 if (!currentRoom.getUpId().isPresent()) {
                     channelUtils.write(getPlayerId(session), gameManager.getMapsManager().drawMap(currentRoom.getRoomId(), new Coords(9,9)));
-                    channelUtils.write(getPlayerId(session), "There's no up exit.");
+                    channelUtils.write(getPlayerId(session), "There's no up exit.\r\n");
                     return;
                 }
                 Room destinationRoom = gameManager.getRoomManager().getRoom(currentRoom.getUpId().get());
@@ -111,7 +111,7 @@ public class MovementCommand extends Command {
             if (downTriggers.contains(command.toLowerCase())) {
                 if (!currentRoom.getDownId().isPresent()) {
                     channelUtils.write(getPlayerId(session), gameManager.getMapsManager().drawMap(currentRoom.getRoomId(), new Coords(9,9)));
-                    channelUtils.write(getPlayerId(session), "There's no down exit.");
+                    channelUtils.write(getPlayerId(session), "There's no down exit.\r\n");
                     return;
                 }
                 Room destinationRoom = gameManager.getRoomManager().getRoom(currentRoom.getDownId().get());
diff --git a/src/main/java/com/comandante/creeper/server/command/SayCommand.java b/src/main/java/com/comandante/creeper/server/command/SayCommand.java
index bdc82d21..8c4d6868 100644
--- a/src/main/java/com/comandante/creeper/server/command/SayCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/SayCommand.java
@@ -47,7 +47,7 @@ public class SayCommand extends Command {
                 if (presentPlayer.getPlayerId().equals(sourcePlayer.getPlayerId())) {
                     getGameManager().getChannelUtils().write(sourcePlayer.getPlayerId(), stringBuilder.toString());
                 } else {
-                    getGameManager().getChannelUtils().writeNoPrompt(presentPlayer.getPlayerId(), stringBuilder.toString());
+                    getGameManager().getChannelUtils().write(presentPlayer.getPlayerId(), stringBuilder.toString());
                 }
             }
         } finally {
diff --git a/src/main/java/com/comandante/creeper/server/command/TellCommand.java b/src/main/java/com/comandante/creeper/server/command/TellCommand.java
index ee2ea0fb..fce91e3a 100644
--- a/src/main/java/com/comandante/creeper/server/command/TellCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/TellCommand.java
@@ -51,7 +51,7 @@ public class TellCommand extends Command {
             stringBuilder.append("*").append(sourcePlayer.getPlayerName()).append("* ");
             stringBuilder.append(tellMessage);
             stringBuilder.append(RESET);
-            getGameManager().getChannelUtils().writeNoPrompt(desintationPlayer.getPlayerId(), destinationPlayercolor + stringBuilder.toString());
+            getGameManager().getChannelUtils().write(desintationPlayer.getPlayerId(), destinationPlayercolor + stringBuilder.toString());
             getGameManager().getChannelUtils().write(sourcePlayer.getPlayerId(), stringBuilder.toString());
         } finally {
             super.messageReceived(ctx, e);
diff --git a/src/main/java/com/comandante/creeper/server/command/UnknownCommand.java b/src/main/java/com/comandante/creeper/server/command/UnknownCommand.java
index f5a6ba3e..bf406a49 100644
--- a/src/main/java/com/comandante/creeper/server/command/UnknownCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/UnknownCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.server.command;
 
 import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.server.CreeperSession;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
@@ -13,9 +14,12 @@ public class UnknownCommand extends Command {
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         try {
-            getGameManager().getChannelUtils().writeOnlyPrompt(getPlayerId(extractCreeperSession(e.getChannel())));
+            CreeperSession creeperSession = extractCreeperSession(e.getChannel());
+            String playerId = getPlayerId(creeperSession);
+            getGameManager().getChannelUtils().write(playerId, getGameManager().getPlayerManager().buildPrompt(playerId), false);
+            e.getChannel().getPipeline().remove(ctx.getHandler());
         } finally {
-            super.messageReceived(ctx, e);
+            //super.messageReceived(ctx, e);
         }
     }
 }
diff --git a/src/main/java/com/comandante/creeper/server/command/WhoCommand.java b/src/main/java/com/comandante/creeper/server/command/WhoCommand.java
index ddf8e4a0..0573e1f3 100644
--- a/src/main/java/com/comandante/creeper/server/command/WhoCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/WhoCommand.java
@@ -25,7 +25,7 @@ public class WhoCommand extends Command {
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         try {
-            Table t = new Table(3, BorderStyle.UNICODE_BOX,
+            Table t = new Table(3, BorderStyle.CLASSIC_COMPATIBLE,
                     ShownBorders.HEADER_AND_FIRST_COLLUMN);
 
             t.setColumnWidth(0, 8, 14);
diff --git a/src/main/java/com/comandante/creeper/server/command/admin/DescriptionCommand.java b/src/main/java/com/comandante/creeper/server/command/admin/DescriptionCommand.java
index c9fc1550..d0b989fb 100644
--- a/src/main/java/com/comandante/creeper/server/command/admin/DescriptionCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/admin/DescriptionCommand.java
@@ -41,7 +41,7 @@ public class DescriptionCommand extends Command {
                 return;
             }
             final String playerId = getPlayerId(session);
-            gameManager.getChannelUtils().writeNoPrompt(playerId, "\n\n ENTERING MULTI LINE INPUT MODE.  TYPE \"DONE\" ON AN EMPTY LINE TO EXIT");
+            gameManager.getChannelUtils().write(playerId, "\n\n ENTERING MULTI LINE INPUT MODE.  TYPE \"DONE\" ON AN EMPTY LINE TO EXIT");
             session.setGrabMultiLineInput(Optional.of(
                     new CreeperEntry<UUID, Command>(gameManager.getMultiLineInputManager().createNewMultiLineInput(), this)));
             //e.getChannel().getPipeline().addLast("multi_line", new MultiLineInputHandler(gameManager));
diff --git a/src/main/java/com/comandante/creeper/server/command/admin/TagRoomCommand.java b/src/main/java/com/comandante/creeper/server/command/admin/TagRoomCommand.java
index c4084273..d61b84f0 100644
--- a/src/main/java/com/comandante/creeper/server/command/admin/TagRoomCommand.java
+++ b/src/main/java/com/comandante/creeper/server/command/admin/TagRoomCommand.java
@@ -36,7 +36,7 @@ public class TagRoomCommand extends Command {
                     String tag = iterator.next();
                     sb.append(tag).append("\n");
                 }
-                gameManager.getChannelUtils().writeNoPromptNoAfterSpace(player.getPlayerId(), "tag\n---");
+                gameManager.getChannelUtils().write(player.getPlayerId(), "tag\n---");
                 gameManager.getChannelUtils().write(player.getPlayerId(), sb.toString());
                 return;
             }
-- 
GitLab