diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java index b81534fffda9397e46ce1584ee1845d7332cc1e9..87a6b65e0f0c1bf4c9afb81199354c2b070eca75 100644 --- a/src/main/java/com/comandante/creeper/Main.java +++ b/src/main/java/com/comandante/creeper/Main.java @@ -2,10 +2,18 @@ package com.comandante.creeper; import com.comandante.creeper.managers.GameManager; import com.comandante.creeper.managers.PlayerManager; +import com.comandante.creeper.managers.PlayerManagerMapDB; import com.comandante.creeper.managers.RoomManager; +import com.comandante.creeper.model.Player; +import com.comandante.creeper.model.PlayerMetadata; import com.comandante.creeper.model.Room; import com.comandante.creeper.server.CreeperServer; import com.google.common.base.Optional; +import org.apache.commons.codec.binary.Base64; +import org.mapdb.DB; +import org.mapdb.DBMaker; + +import java.io.File; public class Main { @@ -24,10 +32,26 @@ public class Main { roomManager.addRoom(hallway); roomManager.addRoom(intake); roomManager.addRoom(janitorialCloset); - PlayerManager playerManager = new PlayerManager(); + + DB db = DBMaker.newFileDB(new File("creeperDb")) + .closeOnJvmShutdown() + .encryptionEnable("creepandicrawl") + .make(); + + PlayerManager playerManager = new PlayerManagerMapDB(db); + if (playerManager.getPlayerMetadata(new Player("chris").getPlayerId()) == null) { + System.out.println("Creating Chris User."); + playerManager.savePlayerMetadata(new PlayerMetadata("chris", "poop", new String(Base64.encodeBase64("chris".getBytes())))); + } + + if (playerManager.getPlayerMetadata(new Player("brian").getPlayerId()) == null) { + System.out.println("Creating Brian User."); + playerManager.savePlayerMetadata(new PlayerMetadata("brian", "poop", new String(Base64.encodeBase64("brian".getBytes())))); + } + GameManager gameManager = new GameManager(roomManager, playerManager); - CreeperServer creeperServer = new CreeperServer(8080); + CreeperServer creeperServer = new CreeperServer(8080, db); creeperServer.run(gameManager); System.out.println("Creeper started."); diff --git a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java index ae5a02d351c26ab96079a72466060a9b94246c56..4f3ae61076ab5190be134eb30873074e070b983c 100644 --- a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java +++ b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java @@ -12,9 +12,9 @@ import org.jboss.netty.channel.MessageEvent; public class DefaultCommandHandler { - GameManager gameManager; - CreeperSession creeperSession; - MessageEvent event; + private final GameManager gameManager; + private final CreeperSession creeperSession; + private final MessageEvent event; public DefaultCommandHandler(GameManager gameManager, CreeperSession creeperSession, MessageEvent event) { this.gameManager = gameManager; diff --git a/src/main/java/com/comandante/creeper/managers/PlayerManager.java b/src/main/java/com/comandante/creeper/managers/PlayerManager.java index 411b3264df7e78275d4868d9e9cb4fb80adffa24..c147bce5adcc49447831b348e778bb28ca79aeb9 100644 --- a/src/main/java/com/comandante/creeper/managers/PlayerManager.java +++ b/src/main/java/com/comandante/creeper/managers/PlayerManager.java @@ -1,43 +1,25 @@ package com.comandante.creeper.managers; - import com.comandante.creeper.model.Player; -import org.apache.commons.codec.binary.Base64; +import com.comandante.creeper.model.PlayerMetadata; import java.util.Iterator; -import java.util.concurrent.ConcurrentHashMap; - -public class PlayerManager { +import java.util.Map; - private ConcurrentHashMap<String, Player> players = new ConcurrentHashMap<String, Player>(); +public interface PlayerManager { + PlayerMetadata getPlayerMetadata(String playerId); - public Player addPlayer(Player player) { - return players.putIfAbsent(player.getPlayerId(), player); - } + void savePlayerMetadata(PlayerMetadata playerMetadata); - public Player getPlayerByUsername(String username) { - // HTreeMap<String, Player> objectObjectHTreeMap = DBMaker.newTempHashMap(); + Player addPlayer(Player player); - return getPlayer(new String(Base64.encodeBase64(username.getBytes()))); - } + Player getPlayerByUsername(String username); - public Player getPlayer(String playerId) { - return players.get(playerId); - } + Player getPlayer(String playerId); - public Iterator<java.util.Map.Entry<String, Player>> getPlayers() { - return players.entrySet().iterator(); - } + Iterator<Map.Entry<String, Player>> getPlayers(); - public void removePlayer(String username) { - Player player = getPlayerByUsername(username); - if (player.getChannel() != null && player.getChannel().isConnected()) { - player.getChannel().disconnect(); - } - players.remove(player.getPlayerId()); - } + void removePlayer(String username); - public boolean doesPlayerExist(String username) { - return players.containsKey(new String(Base64.encodeBase64(username.getBytes()))); - } + boolean doesPlayerExist(String username); } diff --git a/src/main/java/com/comandante/creeper/managers/PlayerManagerMapDB.java b/src/main/java/com/comandante/creeper/managers/PlayerManagerMapDB.java new file mode 100644 index 0000000000000000000000000000000000000000..2dc61e42570259dd37f113bc1e1f71adade56292 --- /dev/null +++ b/src/main/java/com/comandante/creeper/managers/PlayerManagerMapDB.java @@ -0,0 +1,74 @@ +package com.comandante.creeper.managers; + + +import com.comandante.creeper.model.PlayerMetadataSerializer; +import com.comandante.creeper.model.Player; +import com.comandante.creeper.model.PlayerMetadata; +import org.apache.commons.codec.binary.Base64; +import org.mapdb.DB; +import org.mapdb.HTreeMap; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +public class PlayerManagerMapDB implements PlayerManager { + + private ConcurrentHashMap<String, Player> players = new ConcurrentHashMap<String, Player>(); + private HTreeMap<String, PlayerMetadata> playerMetadataStore; + private final DB db; + + public PlayerManagerMapDB(DB db) { + this.db = db; + if (db.exists("playerMetadata")) { + this.playerMetadataStore = db.get("playerMetadata"); + } else { + this.playerMetadataStore = db.createHashMap("playerMetadata").valueSerializer(new PlayerMetadataSerializer()).make(); + } + } + + @Override + public PlayerMetadata getPlayerMetadata(String playerId) { + return playerMetadataStore.get(playerId); + } + + @Override + public void savePlayerMetadata(PlayerMetadata playerMetadata) { + playerMetadataStore.put(playerMetadata.getPlayerId(), playerMetadata); + db.commit(); + } + + @Override + public Player addPlayer(Player player) { + return players.putIfAbsent(player.getPlayerId(), player); + } + + @Override + public Player getPlayerByUsername(String username) { + return getPlayer(new String(Base64.encodeBase64(username.getBytes()))); + } + + @Override + public Player getPlayer(String playerId) { + return players.get(playerId); + } + + @Override + public Iterator<java.util.Map.Entry<String, Player>> getPlayers() { + return players.entrySet().iterator(); + } + + @Override + public void removePlayer(String username) { + Player player = getPlayerByUsername(username); + if (player.getChannel() != null && player.getChannel().isConnected()) { + player.getChannel().disconnect(); + } + players.remove(player.getPlayerId()); + } + + @Override + public boolean doesPlayerExist(String username) { + return players.containsKey(new String(Base64.encodeBase64(username.getBytes()))); + } + +} diff --git a/src/main/java/com/comandante/creeper/model/PlayerMetadata.java b/src/main/java/com/comandante/creeper/model/PlayerMetadata.java new file mode 100644 index 0000000000000000000000000000000000000000..9a2e8d074b4eb91438687f44c5acf7a716eb9fc6 --- /dev/null +++ b/src/main/java/com/comandante/creeper/model/PlayerMetadata.java @@ -0,0 +1,108 @@ +package com.comandante.creeper.model; + + +import java.io.Serializable; + +public class PlayerMetadata implements Serializable { + + String playerName; + String password; + String playerId; + int health; + int stamina; + int strength; + int dexterity; + + public PlayerMetadata(String playerName, String password, String playerId) { + this.playerName = playerName; + this.password = password; + this.playerId = playerId; + } + + public String getPassword() { + return password; + } + + public String getPlayerId() { + return playerId; + } + + public String getPlayerName() { + return playerName; + } + + public int getHealth() { + return health; + } + + public int getStamina() { + return stamina; + } + + public int getStrength() { + return strength; + } + + public int getDexterity() { + return dexterity; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PlayerMetadata that = (PlayerMetadata) o; + + if (dexterity != that.dexterity) return false; + if (health != that.health) return false; + if (stamina != that.stamina) return false; + if (strength != that.strength) return false; + if (!password.equals(that.password)) return false; + if (!playerId.equals(that.playerId)) return false; + if (!playerName.equals(that.playerName)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = playerName.hashCode(); + result = 31 * result + password.hashCode(); + result = 31 * result + playerId.hashCode(); + result = 31 * result + health; + result = 31 * result + stamina; + result = 31 * result + strength; + result = 31 * result + dexterity; + return result; + } + + public void setPlayerName(String playerName) { + this.playerName = playerName; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setPlayerId(String playerId) { + this.playerId = playerId; + } + + public void setHealth(int health) { + this.health = health; + } + + public void setStamina(int stamina) { + this.stamina = stamina; + } + + public void setStrength(int strength) { + this.strength = strength; + } + + public void setDexterity(int dexterity) { + this.dexterity = dexterity; + } + +} diff --git a/src/main/java/com/comandante/creeper/model/PlayerMetadataSerializer.java b/src/main/java/com/comandante/creeper/model/PlayerMetadataSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..b1a01c99f6149102ce1dcf3bae3d5f9f8d3997cc --- /dev/null +++ b/src/main/java/com/comandante/creeper/model/PlayerMetadataSerializer.java @@ -0,0 +1,38 @@ +package com.comandante.creeper.model; + +import org.mapdb.Serializer; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.io.Serializable; + +public class PlayerMetadataSerializer implements Serializer<PlayerMetadata>, Serializable { + + @Override + public void serialize(DataOutput out, PlayerMetadata value) throws IOException { + out.writeUTF(value.getPlayerName()); + out.writeUTF(value.getPassword()); + out.writeUTF(value.getPlayerId()); + out.writeInt(value.getDexterity()); + out.writeInt(value.getHealth()); + out.writeInt(value.getStamina()); + out.writeInt(value.getStrength()); + } + + @Override + public PlayerMetadata deserialize(DataInput in, int available) throws IOException { + PlayerMetadata playerMetadata = new PlayerMetadata(in.readUTF(), in.readUTF(), in.readUTF()); + playerMetadata.setDexterity(in.readInt()); + playerMetadata.setHealth(in.readInt()); + playerMetadata.setStamina(in.readInt()); + playerMetadata.setStrength(in.readInt()); + return playerMetadata; + } + + @Override + public int fixedSize() { + return -1; + } +} + diff --git a/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java new file mode 100644 index 0000000000000000000000000000000000000000..17b9076602b43ecae6ce486c68b01a29c2a6c945 --- /dev/null +++ b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java @@ -0,0 +1,36 @@ +package com.comandante.creeper.server; + +import com.comandante.creeper.managers.GameManager; +import com.comandante.creeper.model.Player; +import com.comandante.creeper.model.PlayerMetadata; +import org.jboss.netty.channel.Channel; + +public class CreeperMapDBAuthenticator implements CreeperAuthenticator { + + private final GameManager gameManager; + + public CreeperMapDBAuthenticator(GameManager gameManager) { + this.gameManager = gameManager; + } + + @Override + public boolean authenticateAndRegisterPlayer(String username, String password, Channel channel) { + PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(new Player(username).getPlayerId()); + if (playerMetadata == null) { + return false; + } + if (!playerMetadata.getPassword().equals(password)) { + return false; + } + if (gameManager.getPlayerManager().doesPlayerExist(username)) { + gameManager.getPlayerManager().removePlayer(username); + } + Player player = new Player(username); + player.setChannel(channel); + gameManager.getPlayerManager().addPlayer(player); + if (!gameManager.getPlayerCurrentRoom(player).isPresent()) { + gameManager.placePlayerInLobby(player); + } + return true; + } +} diff --git a/src/main/java/com/comandante/creeper/server/CreeperServer.java b/src/main/java/com/comandante/creeper/server/CreeperServer.java index 0004dfd44af9e2c7d0c7070f40aaadcb93c20545..a881d5f15feba2f33c7754cba37b58ca1ca69e63 100644 --- a/src/main/java/com/comandante/creeper/server/CreeperServer.java +++ b/src/main/java/com/comandante/creeper/server/CreeperServer.java @@ -4,6 +4,7 @@ package com.comandante.creeper.server; import com.comandante.creeper.managers.GameManager; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; +import org.mapdb.DB; import java.net.InetSocketAddress; import java.util.concurrent.Executors; @@ -11,14 +12,16 @@ import java.util.concurrent.Executors; public class CreeperServer { private final int port; + private final DB db; - public CreeperServer(int port) { + public CreeperServer(int port, DB db) { this.port = port; + this.db = db; } public void run(GameManager gameManager) throws Exception { ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); - CreeperServerHandler handler = new CreeperServerHandler(new CreeperSimpleAuthenticator(gameManager), gameManager); + CreeperServerHandler handler = new CreeperServerHandler(new CreeperMapDBAuthenticator(gameManager), gameManager); bootstrap.setPipelineFactory(new CreeperServerPipelineFactory(handler)); bootstrap.bind(new InetSocketAddress(8080)); } diff --git a/src/main/java/com/comandante/creeper/server/CreeperSimpleAuthenticator.java b/src/main/java/com/comandante/creeper/server/CreeperSimpleAuthenticator.java deleted file mode 100644 index 3af0e7d06f6bfa69ee3a9f36205cb738530afdad..0000000000000000000000000000000000000000 --- a/src/main/java/com/comandante/creeper/server/CreeperSimpleAuthenticator.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.comandante.creeper.server; - -import com.comandante.creeper.managers.GameManager; -import com.comandante.creeper.model.Player; -import org.jboss.netty.channel.Channel; - -import java.util.HashMap; -import java.util.Map; - -public class CreeperSimpleAuthenticator implements CreeperAuthenticator { - - GameManager gameManager; - - public CreeperSimpleAuthenticator(GameManager gameManager) { - this.gameManager = gameManager; - } - - private static final Map<String, String> userMap; - static { - userMap = new HashMap<String, String>(); - userMap.put("chris", "poop"); - userMap.put("brian", "poop"); - userMap.put("sean", "poop"); - } - - @Override - public boolean authenticateAndRegisterPlayer(String userName, String passWord, Channel channel) { - String userPassword = userMap.get(userName); - if (userPassword == null) { - return false; - } - if (!userPassword.equals(passWord)) { - return false; - } - if (gameManager.getPlayerManager().doesPlayerExist(userName)) { - gameManager.getPlayerManager().removePlayer(userName); - } - Player player = new Player(userName); - player.setChannel(channel); - gameManager.getPlayerManager().addPlayer(player); - if (!gameManager.getPlayerCurrentRoom(player).isPresent()) { - gameManager.placePlayerInLobby(player); - } - return true; - } -}