diff --git a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java index 4f3ae61076ab5190be134eb30873074e070b983c..8ccce30c38f4ac7cbaf6af40352fc9e01f7db0f3 100644 --- a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java +++ b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java @@ -55,6 +55,9 @@ public class DefaultCommandHandler { case WHOAMI: player.getChannel().write(player.getPlayerName() + "\r\n"); break; + case HELP: + gameManager.getHelpManager().printHelp(player, originalMessage); + break; case UNKNOWN: gameManager.currentRoomLogic(creeperSession, event); break; diff --git a/src/main/java/com/comandante/creeper/command/DefaultCommandType.java b/src/main/java/com/comandante/creeper/command/DefaultCommandType.java index 784f9f344c245cc81cddb47f48e7d86336224b86..6ed5aa439106548730fe334426e4e42f30825063 100644 --- a/src/main/java/com/comandante/creeper/command/DefaultCommandType.java +++ b/src/main/java/com/comandante/creeper/command/DefaultCommandType.java @@ -15,6 +15,7 @@ public enum DefaultCommandType implements CommandType { GOSSIP(new HashSet<String>(Arrays.asList("gossip")), false, "Gossip to the entire server."), WHO(new HashSet<String>(Arrays.asList("who")), false, "List who is logged into the server."), WHOAMI(new HashSet<String>(Arrays.asList("whoami")), false, "Who am I?"), + HELP(new HashSet<String>(Arrays.asList("help")), false, "This is the help."), UNKNOWN(new HashSet<String>(Arrays.asList("")), true, ""); private Set<String> validCommandTriggers; diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index 4877279bf24cb00281ad663f070ee07cdc313c0d..54fa0a2fd8ef7b8f3afac16f7014ee83f19f1898 100644 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -1,6 +1,7 @@ package com.comandante.creeper.managers; +import com.comandante.creeper.command.DefaultCommandType; import com.comandante.creeper.model.Movement; import com.comandante.creeper.model.Player; import com.comandante.creeper.model.Room; @@ -34,6 +35,7 @@ public class GameManager { private final RoomManager roomManager; private final PlayerManager playerManager; + private final HelpManager helpManager; private final NewUserRegistrationManager newUserRegistrationManager; public NewUserRegistrationManager getNewUserRegistrationManager() { @@ -44,6 +46,11 @@ public class GameManager { this.roomManager = roomManager; this.playerManager = playerManager; this.newUserRegistrationManager = new NewUserRegistrationManager(playerManager); + this.helpManager = new HelpManager(); + } + + public HelpManager getHelpManager() { + return helpManager; } public RoomManager getRoomManager() { @@ -156,7 +163,21 @@ public class GameManager { Room destinationRoom = roomManager.getRoom(movement.getDestinationRoomId()); sourceRoom.removePresentPlayer(movement.getPlayer().getPlayerId()); for (Player next : getPresentPlayers(sourceRoom)) { - next.getChannel().write(movement.getPlayer().getPlayerName() + " used exit: " + movement.getOriginalMovementCommand() + ".\r\n"); + StringBuilder sb = new StringBuilder(); + sb.append(movement.getPlayer().getPlayerName()); + if (movement.getOriginalMovementCommand().equals(DefaultCommandType.MOVE_NORTH)) { + sb.append(" exited to the north."); + } else if (movement.getOriginalMovementCommand().equals(DefaultCommandType.MOVE_EAST)) { + sb.append(" exited to the east."); + } else if (movement.getOriginalMovementCommand().equals(DefaultCommandType.MOVE_SOUTH)) { + sb.append(" exited to the south."); + } else if (movement.getOriginalMovementCommand().equals(DefaultCommandType.MOVE_WEST)) { + sb.append(" exited to the west."); + } else { + sb.append(" exited."); + } + sb.append("\r\n"); + next.getChannel().write(sb.toString()); } for (Player next : getPresentPlayers(destinationRoom)) { next.getChannel().write(movement.getPlayer().getPlayerName() + " arrived.\r\n"); @@ -216,7 +237,7 @@ public class GameManager { private void printExits(Room room, Channel channel) { StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("move: "); + stringBuilder.append("exits: "); stringBuilder.append(new Ansi().fg(Ansi.Color.BLUE).toString()); if (room.getNorthId().isPresent()) { stringBuilder.append("north "); diff --git a/src/main/java/com/comandante/creeper/managers/HelpManager.java b/src/main/java/com/comandante/creeper/managers/HelpManager.java index 65ebb3c0d103c216dc610651af732de1958095ae..2a5c4c9790d15c81640a02257cf82945d19b47c3 100644 --- a/src/main/java/com/comandante/creeper/managers/HelpManager.java +++ b/src/main/java/com/comandante/creeper/managers/HelpManager.java @@ -1,7 +1,23 @@ package com.comandante.creeper.managers; -public class HelpManager { +import com.comandante.creeper.command.DefaultCommandType; +import com.comandante.creeper.model.Player; +import org.fusesource.jansi.Ansi; +public class HelpManager { + public void printHelp(Player player, String originalMessage) { + StringBuilder sb = new StringBuilder(); + DefaultCommandType[] values = DefaultCommandType.values(); + sb.append(new Ansi().bg(Ansi.Color.RED).toString()); + for (DefaultCommandType defaultCommandType : values) { + if (defaultCommandType.equals(DefaultCommandType.UNKNOWN)) { + continue; + } + sb.append(defaultCommandType.getValidCommandTriggers()).append(" ").append(defaultCommandType.getDescription()).append("\r\n"); + } + sb.append(new Ansi().reset().toString()).append("\r\n"); + player.getChannel().write(sb.toString()); + } } diff --git a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java index 642c242010c6394f2b3874941733a46921ebfc09..5910c44606c906aaa2748df14deef87d07c84935 100644 --- a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java +++ b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java @@ -50,7 +50,13 @@ public class NewUserRegistrationManager { } private void createUser(CreeperSession session, MessageEvent e) { - session.setPassword(Optional.of((String) e.getMessage())); + String password = (String) e.getMessage(); + if (password.length() < 8) { + e.getChannel().write("Passwords must be at least 8 characters.\r\n"); + newUserRegistrationFlow(session, e); + return; + } + session.setPassword(Optional.of(password)); PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), new Player(session.getUsername().get()).getPlayerId()); playerManager.savePlayerMetadata(playerMetadata); e.getChannel().write("User created.\r\n"); diff --git a/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java b/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java index cd282fbe14d659f80f6d50ac7a43f7c05cee3ee5..f9c9d18ea5b12c952b552f0bf64d21d4dc3109cf 100644 --- a/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java +++ b/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java @@ -4,6 +4,7 @@ import com.comandante.creeper.command.DefaultCommandHandler; import com.comandante.creeper.command.DefaultCommandType; import com.comandante.creeper.managers.GameManager; import com.google.common.base.Optional; +import org.fusesource.jansi.Ansi; import org.jboss.netty.channel.ChannelEvent; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; @@ -31,9 +32,15 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler { @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { -// e.getChannel().write("\r\n\r\n\r\n\r\n" + GameManager.LOGO + "\r\n" + GameManager.VERSION + "\r\n\r\n\r\n\r\n"); - e.getChannel().write("First time here? Type \"new\".\r\n"); - e.getChannel().write("username: "); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder + .append(new Ansi().bg(Ansi.Color.GREEN).toString()) + .append(new Ansi().fg(Ansi.Color.BLACK)) + .append("\r\n\r\n\r\n\r\n" + GameManager.LOGO + "\r\n" + GameManager.VERSION + "\r\n\r\n\r\n\r\n") + .append(new Ansi().reset().toString() + "\r\n") + .append("First time here? Type \"new\".\r\n") + .append("username: "); + e.getChannel().write(stringBuilder.toString()); CreeperSession creeperSession = new CreeperSession(); creeperSession.setState(CreeperSession.State.promptedForUsername); ctx.setAttachment(creeperSession);