Add Registration functionality and tidy up
[WeStealzYourDataz.git] / src / uk / ac / ntu / n0521366 / wsyd / server / ServerSocial.java
index 45c5412..639c482 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * The MIT License
  *
- * Copyright 2015 TJ <hacker@iam.tj>.
+ * Copyright 2015 Eddie Berrisford-Lynch <dev@fun2be.me>.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -57,6 +57,7 @@ import javax.swing.Timer;
 import uk.ac.ntu.n0521366.wsyd.libs.WSYD_Member;
 import uk.ac.ntu.n0521366.wsyd.libs.WSYD_Member_Comparator_UserID;
 import uk.ac.ntu.n0521366.wsyd.libs.message.MessageLogin;
+import uk.ac.ntu.n0521366.wsyd.libs.message.MessageMember;
 import uk.ac.ntu.n0521366.wsyd.libs.message.MessageMemberState;
 import uk.ac.ntu.n0521366.wsyd.libs.message.MessagePresence;
 import uk.ac.ntu.n0521366.wsyd.libs.message.MessageServerControl;
@@ -83,7 +84,7 @@ import uk.ac.ntu.n0521366.wsyd.libs.net.ServiceAddressMap.LastSeenHost;
  * exitRequested and restartRequested. This can be done by an optional
  * Management GUI application.
  *
- * @author TJ <hacker@iam.tj>
+ * @author Eddie Berrisford-Lynch <dev@fun2be.me>
  */
 public final class ServerSocial implements NetworkMessageEventListener, ConnectionEstablishedEventListener {
     /**
@@ -441,19 +442,47 @@ public final class ServerSocial implements NetworkMessageEventListener, Connecti
         return result;
     }
     
+    private void notifyMemberPrescence(long userID, boolean state) {
+        NetworkMessage message = new NetworkMessage("MemberNotification", null, new MessageMemberState(userID, state));
+        for (long ID : _membersOnline) {
+            _tcpStreamManager._tcpStreams.get(ID).write(message);
+        }
+    }
+    
+    private void memberOnline (long userID) {
+        if (!_membersOnline.contains(userID)) {
+            notifyMemberPrescence(userID, true);
+            _membersOnline.add(userID);
+        }
+    }
+    
+    private void memberOffline (long userID) {
+        if (_membersOnline.contains(userID)) {
+            _membersOnline.remove(userID);
+            notifyMemberPrescence(userID, false);
+        }
+    }
+
+    @Override
+    public void connectionEstablished(ConnectionEstablishedEvent event) {
+        System.err.println("connectionEstablished()");
+        event.getStream().getEventManager().addNetworkMessageEventListener(this);
+    }
+    /**
+     * Process received network messages.
+     * 
+     * @param event the network message event
+     */
     @Override
     public void NetworkMessageReceived(NetworkMessageEvent event)
     {
-        System.err.println("NetworkMessage received");
-        //TODO: NetworkMessageReceived: Handle Messages
         NetworkMessage nm = event.getNetworkMessage();
         if (nm == null)
             return;
-        //Exit or Restart?
-        System.err.println("Packet Received for intent " + nm.getIntent());
+        System.err.println("NetworkMessage received for intent " + nm.getIntent());
         String type = nm.getMessage().getMessageType();
         switch (nm.getIntent()) {
-            case "Control":
+            case "Control": // Exit or Restart?
                 if (type.equals(MessageServerControl.getType())) { // ServerControl
                     if ("ServerManagement".equals(nm.getSender())) {
                         MessageServerControl mp = (MessageServerControl)nm.getMessage();
@@ -464,6 +493,7 @@ public final class ServerSocial implements NetworkMessageEventListener, Connecti
                 break;
             case "Login":
                 if (type.equals(MessageLogin.getType())) {
+                    NetworkStream ns = _tcpStreamManager._tcpStreams.get(nm.getKey());
                     MessageLogin ml = (MessageLogin)nm.getMessage();
                     
                     Set<Map.Entry<Long, WSYD_Member>> tempSet = _members.entrySet();
@@ -475,34 +505,54 @@ public final class ServerSocial implements NetworkMessageEventListener, Connecti
                             ml._loggedIn = true;
                             _tcpStreamManager.updateKey(nm.getKey(), element.getKey()); // replace temp key in stream manager
                             _membersOnline.add(element.getKey()); // make the member online
+                            break;
+                        }
+                    }
+                    if (ns != null)
+                        ns.write(nm);
+                    else
+                        System.err.println("Login: cannot find stream for ID:" + nm.getKey());
+                }
+            case "Register":
+                if (type.equals(MessageMember.getType())) {
+                    NetworkStream ns = _tcpStreamManager._tcpStreams.get(nm.getKey());
+                    MessageMember mm = (MessageMember)nm.getMessage();
+                    // assume username can be registered unless username found
+                    mm.setRegistered(MessageMember.STATE.REGISTERED);
+                    
+                    Set<Map.Entry<Long, WSYD_Member>> tempSet = _members.entrySet();
+                    Iterator<Map.Entry<Long, WSYD_Member>> tempIter = tempSet.iterator();
+                    while (tempIter.hasNext()) {
+                        Map.Entry<Long, WSYD_Member> element = tempIter.next();
+                        if (element.getValue()._userName.equals(mm.getMember()._userName)) {
+                            mm.setRegistered(MessageMember.STATE.UNREGISTERED);
+                            mm.setStatus("Member already registered: " + mm.getMember()._userName);
+                            break;
                         }
                     }
-                    _tcpStreamManager._tcpStreams.get(nm.getKey()).write(nm);
+                    // register the new member
+                    if (mm.getRegistered() == MessageMember.STATE.REGISTERED) {
+                        // get the next unallocated user ID
+                        long newUserID = _members.lastKey().longValue() + 1;
+                        _members.put(newUserID, mm.getMember());
+                        // update the object so the ID can be returned to the client
+                        mm.getMember()._userID = newUserID;
+                        // update the on-disk membership data
+                        writeMembers(_membersFile);
+                    }
+                    if (ns != null)
+                        ns.write(nm);
+                    else
+                        System.err.println("Login: cannot find stream for ID:" + nm.getKey());
+                    
                 }
+                break;
+            default:
+                System.err.println("Unhandled NetworkMessage received for intent " + nm.getIntent());
         }
         
     }
     
-    private void notifyMemberPrescence(long userID, boolean state) {
-        NetworkMessage message = new NetworkMessage("MemberNotification", null, new MessageMemberState(userID, state));
-        for (long ID : _membersOnline) {
-            _tcpStreamManager._tcpStreams.get(ID).write(message);
-        }
-    }
-    
-    private void memberOnline (long userID) {
-        if (!_membersOnline.contains(userID)) {
-            notifyMemberPrescence(userID, true);
-            _membersOnline.add(userID);
-        }
-    }
-    
-    private void memberOffline (long userID) {
-        if (_membersOnline.contains(userID)) {
-            _membersOnline.remove(userID);
-            notifyMemberPrescence(userID, false);
-        }
-    }
 
     /**
      * Entry point which starts, restarts, and exits the application.
@@ -520,12 +570,4 @@ public final class ServerSocial implements NetworkMessageEventListener, Connecti
             }
         }
     }
-
-    @Override
-    public void connectionEstablished(ConnectionEstablishedEvent event) {
-        System.err.println("connectionEstablished()");
-        event.getStream().getEventManager().addNetworkMessageEventListener(this);
-    }
 }
-    
-