diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java index 1fd932d57640dc26798ccad7eb44d83daee17c0c..4877279bf24cb00281ad663f070ee07cdc313c0d 100644 --- a/src/main/java/com/comandante/creeper/managers/GameManager.java +++ b/src/main/java/com/comandante/creeper/managers/GameManager.java @@ -34,10 +34,16 @@ public class GameManager { private final RoomManager roomManager; private final PlayerManager playerManager; + private final NewUserRegistrationManager newUserRegistrationManager; + + public NewUserRegistrationManager getNewUserRegistrationManager() { + return newUserRegistrationManager; + } public GameManager(RoomManager roomManager, PlayerManager playerManager) { this.roomManager = roomManager; this.playerManager = playerManager; + this.newUserRegistrationManager = new NewUserRegistrationManager(playerManager); } public RoomManager getRoomManager() { diff --git a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java new file mode 100644 index 0000000000000000000000000000000000000000..642c242010c6394f2b3874941733a46921ebfc09 --- /dev/null +++ b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java @@ -0,0 +1,60 @@ +package com.comandante.creeper.managers; + + +import com.comandante.creeper.model.Player; +import com.comandante.creeper.model.PlayerMetadata; +import com.comandante.creeper.server.CreeperSession; +import com.google.common.base.Optional; +import org.jboss.netty.channel.MessageEvent; + +public class NewUserRegistrationManager { + + private final PlayerManager playerManager; + + public NewUserRegistrationManager(PlayerManager playerManager) { + this.playerManager = playerManager; + } + + public void handle(CreeperSession session, MessageEvent e) { + switch (session.getState()) { + case newUserPromptedForUsername: + if (setDesiredUsername(session, e)) { + promptForDesirePassword(session, e); + } + break; + case newUserPromptedForPassword: + createUser(session, e); + break; + } + } + + public void newUserRegistrationFlow(CreeperSession session, MessageEvent e) { + e.getChannel().write("desired username: "); + session.setState(CreeperSession.State.newUserPromptedForUsername); + } + + private boolean setDesiredUsername(CreeperSession session, MessageEvent e) { + PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(new Player((String) e.getMessage()).getPlayerId()); + if (playerMetadata != null) { + e.getChannel().write("Username is in use.\r\n"); + newUserRegistrationFlow(session, e); + return false; + } + session.setUsername(Optional.of((String)e.getMessage())); + return true; + } + + private void promptForDesirePassword(CreeperSession session, MessageEvent e) { + e.getChannel().write("desired password: "); + session.setState(CreeperSession.State.newUserPromptedForPassword); + } + + private void createUser(CreeperSession session, MessageEvent e) { + session.setPassword(Optional.of((String) e.getMessage())); + 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"); + session.setState(CreeperSession.State.newUserRegCompleted); + } + +} diff --git a/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java b/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java index 4f74191a3fc61c97801f8ec890efc14c23abce77..cd282fbe14d659f80f6d50ac7a43f7c05cee3ee5 100644 --- a/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java +++ b/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java @@ -31,7 +31,8 @@ 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("\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: "); CreeperSession creeperSession = new CreeperSession(); creeperSession.setState(CreeperSession.State.promptedForUsername); @@ -42,6 +43,12 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler { public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws InterruptedException { CreeperSession creeperSession = (CreeperSession) ctx.getAttachment(); if (!creeperSession.isAuthed()) { + if (creeperSession.state.equals(CreeperSession.State.newUserPromptedForUsername) || creeperSession.state.equals(CreeperSession.State.newUserPromptedForPassword)) { + gameManager.getNewUserRegistrationManager().handle(creeperSession, e); + if (!creeperSession.state.equals(CreeperSession.State.newUserRegCompleted)) { + return; + } + } doAuthentication(ctx, e); if (creeperSession.isAuthed()) { gameManager.currentRoomLogic(creeperSession, e); @@ -59,6 +66,10 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler { CreeperSession creeperSession = (CreeperSession) ctx.getAttachment(); if (creeperSession.getState().equals(CreeperSession.State.promptedForUsername)) { creeperSession.setUsername(Optional.of(message)); + if (creeperSession.getUsername().isPresent() && creeperSession.getUsername().get().equals("new")) { + gameManager.getNewUserRegistrationManager().newUserRegistrationFlow(creeperSession, e); + return; + } creeperSession.setState(CreeperSession.State.promptedForPassword); e.getChannel().write("password: "); return; @@ -74,7 +85,7 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler { } else { creeperSession.setAuthed(true); creeperSession.setState(CreeperSession.State.authed); - e.getChannel().write("Welcome back.\r\n"); + e.getChannel().write("Welcome to creeper.\r\n"); } } diff --git a/src/main/java/com/comandante/creeper/server/CreeperSession.java b/src/main/java/com/comandante/creeper/server/CreeperSession.java index 20a79908a4d4c4209b6ad6f3980bb058dd15edf9..0e0520363f3713747dc8422898e92cadd1dd44a3 100644 --- a/src/main/java/com/comandante/creeper/server/CreeperSession.java +++ b/src/main/java/com/comandante/creeper/server/CreeperSession.java @@ -9,9 +9,12 @@ public class CreeperSession { private boolean isAuthed = false; State state; - enum State { + public enum State { promptedForPassword, promptedForUsername, + newUserPromptedForUsername, + newUserPromptedForPassword, + newUserRegCompleted, authed }