William
William

Reputation: 1175

Socket.io function only working once, then stops

So... I decided for some reason to completely go for a socket.io server sided handling, instead of having route post. However I have ran into the issue where a function will only work once. The second time, everything works great, except the database doesn't update. (There might be other things wrong going on in the background but I can't seem to find it)... oh! And the client side value emitting only always emits 1, and will not get 2, 3, 4 etc etc.

Client side emit:

  $('#battle-wrapper').on('click', 'button#battlebutton', function (event) {
    event.preventDefault();
    socket.emit('fight mob', $('#mobs').val());
    console.log($('#mobs').val());
  });

Socket.io code:

socket.on('fight mob', function () {
var session = socket.handshake.session;

// Player Variables
var userMhp = session.userdata.tough;
var userHp = 10;
var userDmg = session.userdata.str;
var userDef = session.userdata.tough;

//  Mob Variables
var mobid = 1;
var mobMhp = Math.floor(mobid * 50);
var mobHp = 100;
var mobDmg = 5;
var mobDef = 5;

// Statistic variables
var dmgdeltmob = 0;
var dmgdeltuser = 0;
var rounds = 0;

// Strings
// var userVictory = '';
// var mobVictory = '';
// var userDefeat = '';
// var mobDefeat = '';

// Turn Variables
var userTurn = true;

//start battle loop
while (userHp > 0 && mobHp > 0) {

  // Start BATTLE
  if (userTurn === true) {
    dmgdeltmob = userDmg;

    // mobHp = mobHp - dmgdeltmob;
    rounds += 1;
    userTurn = false;
  } else if (userTurn === false) {
    dmgdeltuser =  mobDmg;
    userHp = userHp - 10;
    rounds += 1;
    userTurn = true;
  }
}

// Start end of battle Calculations
if (userHp <= 0) { // Defeat
  console.log('Lost');
  let sql = 'UPDATE users SET ? WHERE id = ?';
  let post = {
    silver: session.userdata.silver + 1,
  };
  db.query(sql, [post, session.userdata.id], function (err) {
    console.log('1 Silver Success');
    var data = post.silver;
    socket.emit('mob test', data);
    return;
  });

} else {
  console.log('Won');
}

});

Upvotes: 1

Views: 64

Answers (1)

William
William

Reputation: 1175

I have found an answer, maybe not the best solution, actually it probably isn't. But here is what I did, I made a session handler function that calls on login, and on refresh:

 function sessionHandler() {
    // Adding the logged in user to session
    var userId = session.passport.user;
    var sql = 'SELECT * FROM users WHERE id = ?';
    var query = db.query(sql, userId, function (err, rows) {
      session.userdata = rows[0];
      session.save();
      var dataObj = session.userdata;
      socket.emit('start up', dataObj);
      usersConnected++;
      io.emit('users online', usersConnected);
      console.log(usersConnected);
    });
  }

Here is a basic logic to handle the login/refresh. It seems I will need to add all of the logic into the function itself, sadly. Because everything returns undefined outside of the function, but inside the same block.

// User logs in
  if (session.passport === undefined) {
    socket.emit('not logged', destination);
  } else {
    if (session.userdata === undefined) {
      sessionHandler();

      // console.log(session.userdata.username + ' logged in');
    } else {
      if (session.userdata) {
        delete session.userdata;
        session.save();
        sessionHandler();
      }

      // console.log(session.userdata.username + ' refreshed their session');
    }
  }

Upvotes: 1

Related Questions