]> git.example.dev Git - binbsis50.git/commitdiff
simplified room joining logic
authorLuigi Pinca <luigipinca@gmail.com>
Mon, 4 Apr 2016 13:25:36 +0000 (15:25 +0200)
committerLuigi Pinca <luigipinca@gmail.com>
Tue, 5 Apr 2016 16:28:41 +0000 (18:28 +0200)
lib/rooms.js
lib/sparks.js
public/js/app.js

index 6e859518425f815bd2f30616609541c0a8caa360..d7cca0411c49c5c9fe6a0cf2322311ccb1cd0108 100644 (file)
@@ -168,7 +168,7 @@ Room.prototype.addUser = function(spark, loggedin) {
 
   // Broadcast new user event
   primus.send('updateoverview', this.roomname, this.totusers);
-  spark.send('ready', usersData, this.trackscount, loggedin);
+  spark.send('ready', usersData, this.trackscount, nickname, loggedin);
   primus.room(this.roomname).except(spark.id).send('newuser', nickname, usersData);
 };
 
@@ -396,22 +396,20 @@ Room.prototype.onPair = function(spark, allinone) {
  * nickname is valid.
  */
 
-Room.prototype.onUnauthenticatedJoin = function(spark, nickname) {
+Room.prototype.join = function(spark, nickname) {
   var feedback
     , room = this;
 
   if (nickname === 'binb') {
     feedback = 'That name is reserved.';
-  }
-  else if (!isUsername(nickname)) {
+  } else if (!isUsername(nickname)) {
     feedback = 'Name must contain only alphanumeric characters.';
-  }
-  else if (sparks[nickname]) {
+  } else if (sparks[nickname]) {
     feedback = 'Name already taken.';
   }
 
   if (feedback) {
-    return spark.send('invalidnickname', feedback);
+    return spark.send('nickname', feedback);
   }
 
   // Check if requested nickname belongs to a registered user
@@ -425,19 +423,19 @@ Room.prototype.onUnauthenticatedJoin = function(spark, nickname) {
 
     if (err) {
       console.error(err.message);
-      feedback = 'Could not check name availability.';
-      return spark.send('invalidnickname', feedback);
+      return spark.send('nickname', 'Could not check name availability.');
     }
 
     if (exists) {
-      feedback = 'That name belongs to a registered user.';
-      return spark.send('invalidnickname', feedback);
+      return spark.send('nickname', 'That name belongs to a registered user.');
     }
 
-    spark.nickname = nickname;
-    spark.join(room.roomname, function() {
-      room.addUser(spark, false);
-    });
+    if (!spark.nickname) {
+      spark.nickname = nickname;
+      spark.join(room.roomname, function() {
+        room.addUser(spark, false);
+      });
+    }
   });
 };
 
index 425d91461ed7086c8b83b2707848c320da137668..6d63279d5023551164b6c699cf0d8ff193b85013 100644 (file)
@@ -104,33 +104,39 @@ var authorize = function(req, authorized) {
  */
 
 var connection = function(spark) {
-  var user = spark.request.user;
-  spark.on('joinauthenticated', function(room) {
-    if (user && ~config.rooms.indexOf(room)) {
-      if (sparks[user]) { // User already in a room
-        return spark.send('alreadyinaroom');
-      }
+  var nickname = spark.request.cookies.nickname
+    , user = spark.request.user
+    , room = spark.query.room;
+
+  spark.send('overview', config.rooms.reduce(function(data, room) {
+    data[room] = rooms[room].totusers;
+    return data;
+  }, {}));
+
+  if (!~config.rooms.indexOf(room)) return;
+
+  if (user) {
+    if (sparks[user]) { // User already in a room
+      spark.send('alreadyinaroom');
+    } else {
       spark.nickname = user;
       spark.join(room, function() {
         rooms[room].addUser(spark, true);
       });
     }
-  });
-  spark.on('joinunauthenticated', function(nickname, room) {
-    if (!spark.nickname && isString(nickname) && ~config.rooms.indexOf(room)) {
-      rooms[room].onUnauthenticatedJoin(spark, nickname);
-    }
-  });
-  spark.on('loggedin', function(callback) {
-    if (!isFunction(callback)) {
-      return;
+  } else {
+    if (isString(nickname)) {
+      rooms[room].join(spark, nickname);
+    } else {
+      spark.send('nickname');
     }
-    return user ? callback(true, user) : callback(false);
-  });
-  spark.send('overview', config.rooms.reduce(function(data, room) {
-    data[room] = rooms[room].totusers;
-    return data;
-  }, {}));
+
+    spark.on('nickname', function(nickname) {
+      if (isString(nickname)) {
+        rooms[room].join(spark, nickname);
+      }
+    });
+  }
 };
 
 /**
index b5afeb126b008fe98e66ac9674beb1ae04e50d8b..be798fc09e47f7494c19035de086a272cb375a49 100644 (file)
     timer = setInterval(step, 50);
   };
 
+  // Prompt for name and send it
+  var chooseNickname = function(msg) {
+    msg = msg
+      ? '<span class="label label-important">' + msg + '</span><br/>Try with another one:'
+      : 'What\'s your name?';
+
+    if ($modal.hasClass('in')) {
+      $('.modal-body p').html(msg);
+      return $('#login').focus();
+    }
+
+    var html = [
+      '<div class="modal-header">'
+      , '<h3>You are joining the ' + roomname + ' room</h3>'
+      , '</div>'
+      , '<div class="modal-body">'
+      , '<p>' + msg + '</p>'
+      , '</div>'
+      , '<div class="modal-footer relative">'
+      , '<input id="login" maxlength="15" type="text" name="nickname" />'
+      , '<button id="join" class="btn btn-success">'
+      , '<i class="icon-user icon-white"></i> Join the game'
+      , '</button>'
+      , '<span class="divider">'
+      , '<span>or</span>'
+      , '</span>'
+      , '<a class="btn btn-primary" href="/login?followup=/' + roomname + '">'
+      , '<i class="icon-lock icon-white"></i> Login'
+      , '</a>'
+      , '</div>'
+    ].join('');
+
+    $(html).appendTo($modal);
+
+    var $button = $('#join')
+      , $login = $('#login');
+
+    $button.on('click', function() {
+      var value = $login.val();
+      $login.val('');
+
+      if (value.trim()) {
+        return primus.send('nickname', value);
+      }
+
+      chooseNickname('Nickname can\'t be empty.');
+    });
+
+    $login.on('keyup', function(event) {
+      if (event.keyCode === 13) {
+        $button.click();
+      }
+    });
+
+    $modal.modal('show').on('shown', function() {
+      $login.focus();
+    });
+  };
+
   var clearPrivate = function() {
     var width = $recipient.outerWidth(true) + 1;
     $recipient.css('margin-right', '0');
     });
   };
 
-  // Submitted name was invalid
-  var invalidNickName = function(feedback) {
-    feedback = '<span class="label label-important">' + feedback + '</span>';
-    joinUnauthenticated(feedback + '<br/>Try with another one:');
-  };
-
-  // Prompt for name and send it
-  var joinUnauthenticated = function(msg) {
-    if (/nickname\s*\=/.test(document.cookie) && !msg) {
-      nickname = document.cookie.replace(/.*nickname\s*\=\s*([^;]*);?.*/, '$1');
-      return primus.send('joinunauthenticated', nickname, roomname);
-    }
-
-    if ($modal.hasClass('in')) {
-      $('.modal-body p').html(msg);
-      return $('#login').focus();
-    }
-
-    var html = [
-      '<div class="modal-header">'
-      , '<h3>You are joining the ' + roomname + ' room</h3>'
-      , '</div>'
-      , '<div class="modal-body">'
-      , '<p>' + (msg || 'What\'s your name?') + '</p>'
-      , '</div>'
-      , '<div class="modal-footer relative">'
-      , '<input id="login" maxlength="15" type="text" name="nickname" />'
-      , '<button id="join" class="btn btn-success">'
-      , '<i class="icon-user icon-white"></i> Join the game'
-      , '</button>'
-      , '<span class="divider">'
-      , '<span>or</span>'
-      , '</span>'
-      , '<a class="btn btn-primary" href="/login?followup=/' + roomname + '">'
-      , '<i class="icon-lock icon-white"></i> Login'
-      , '</a>'
-      , '</div>'
-    ].join('');
-
-    $(html).appendTo($modal);
-
-    var $button = $('#join')
-      , $login = $('#login');
-
-    $button.on('click', function() {
-      var value = $login.val();
-      $login.val('');
-
-      if ($.trim(value)) {
-        nickname = value;
-        return primus.send('joinunauthenticated', nickname, roomname);
-      }
-
-      invalidNickName('Nickname can\'t be empty.');
-    });
-
-    $login.on('keyup', function(event) {
-      if (event.keyCode === 13) {
-        $button.click();
-      }
-    });
-
-    $modal.modal('show').on('shown', function() {
-      $login.focus();
-    });
-  };
-
-  var open = function() {
-    primus.send('loggedin', function(isloggedin, loggedinas) {
-      if (isloggedin) {
-        nickname = loggedinas;
-        subscriber = true;
-        return primus.send('joinauthenticated', roomname);
-      }
-
-      joinUnauthenticated();
-    });
-  };
-
   var loadTrack = function(previewUrl) {
     audio.src = previewUrl;
   };
   };
 
   // Successfully joined the room
-  var ready = function(usersData, trackscount, loggedin) {
-    if (!loggedin && !/nickname\s*\=/.test(document.cookie)) {
+  var ready = function(usersData, trackscount, username, loggedin) {
+    nickname = username;
+
+    if (!loggedin) {
       document.cookie = 'nickname=' + nickname + ';path=/;';
+    } else {
+      subscriber = true;
     }
 
     $modal.modal('hide').empty();
 
     $messagebox.on('keydown', function(event) {
       if (event.keyCode === 13) {
-        var value = $.trim($messagebox.val());
+        var value = $messagebox.val().trim();
         $messagebox.val('');
 
         if (value) {
     $guessbox.on('keydown', function(event) {
       switch (event.keyCode) {
         case 13: // return
-          var guess = $.trim($guessbox.val());
+          var guess = $guessbox.val().trim();
           $guessbox.val('');
 
           if (guess) {
     ? addCassetteBackdrop()
     : addVolumeControl();
 
-  primus = new Primus({ strategy: false });
+  primus = new Primus({
+    url: location.protocol + '//' + location.host + '?room=' + roomname,
+    strategy: false
+  });
 
   primus.on('updateoverview', updateRoomsOverview);
-  primus.on('invalidnickname', invalidNickName);
   primus.on('alreadyinaroom', alreadyInARoom);
+  primus.on('nickname', chooseNickname);
   primus.on('overview', roomsOverview);
   primus.on('end', disconnect);
   primus.on('ready', ready);
-  primus.on('open', open);
 })();