Bonjour à tous,
Encore une fois, je vous demande de l'aide, car je ne m'en sors pas !
Cela fait 2 semaines que j'essaie de faire fonctionner mes rooms dans mon tchat.
J'ai suivi les 2 tutos sur le tchat avec socket.io et la persistance des messages dans le tchat.
Ca fonctionnait correctement, jusqu'à ce que j'essaie d'ajouter des rooms.
En effet, je veux que des utilisateurs qui appartiennent un même projet, accède au Tchat.
J'ai donc essayé d'ajouter des rooms, ce qui semblait être simple à l'origine.
Mais manque de peau, plus rien ne fonctionne.
ex. un user récupère les derniers messages de la room sans soucis, mais lorsque je fais un post, et bien, même en debug *DEBUG= node server.js** , je ne vois rien passer concernant le message.
J'ai cherché sur Internet tout ce qui pouvait m'aider à comprendre les room.
Je n'utilise pas express, car je n'ai pas réussi à le faire fonctionner avec cakephp
Du coup, voici le code de mon fichier server.js
io.sockets.on("connection", function (socket) {
socket.on('login', function (user) {
// on quitte la room qui nous a été attribuée au début
socket.leave(socket.id);
// on rejoins la nouvelle room
room = user.team_token;
socket.join(room);
//console.log(io.sockets.adapter.sids[socket.id]);
if (io.sockets.adapter.sids[socket.id][room]) {
// dans ce cas on renvoit logged
console.log("========> on a rejoint la room <======");
// on vérifie que l'utilisateur est bien autorisé à rejoindre la room
bddMain.query(' ' +
'bla bla bla......',
[user.login_token, user.project_token],
function (err, rows, fields) {
//console.log("\n========== rows")
//console.log(rows);
//console.log("\n========== fields")
//console.log(fields);
if (err) {
console.log(err);
socket.in(room).emit('error', err.code)
} else if (rows.length === 1) { // si on on un enregistrement de trouvé
// on lance la connexion à la room
socket.broadcast.in(room).emit("logged");
// on récupère toutes les informations de notre user
bddMain.query('' +
'bla bla bla.....',
[user.project_token, room],
function (err, rows, fields) {
if (err) {
console.log(err);
socket.in(room).emit('error', err.code)
} else {
//console.log("\n========== rows")
//console.log(rows);
me = {
username: rows[0].username,
id: user.project_token,
avatar: "/img/bla bla bla..../" + rows[0].photo,
roomid: room
};
console.log("\n===> " + me.username + " a rejoint la room : " + room + " <===\n");
// on stock les données du user dans la variables des users
users[socket.id] = me;
// on récupère les anciens messages
getLastComments();
}
});
} else { // on renvoi une erreur
socket.in(room).emit('error', {
message: __("Vous n'êtes pas autorisé à accéder à ce Tchat")
})
}
});
} else {
// on renvoi une erreur
console.log("\n\n pas dans la room \n\n")
}
});
// on entre dans la room
var getLastComments = function () {
//console.log("\n anciens messages");
bddMain.query('' +
'bla bla bla........ ' +
'LIMIT 10',
[room],
function (err, rows) {
if (err) {
console.log(err);
socket.in(room).emit('error', err.code)
} else {
//console.log("\n========== rows 10 comments from bdd")
//console.log(rows);
var messages = [];
rows.reverse(); // On veut les plus vieux en premier
for (k in rows) {
var row = rows[k];
var message = {
message: row.content,
created: row.created,
user: {
id: row.user_token,
username: row.username,
avatar: "/img/bla bla bla..../" + row.photo
}
};
messages.push(message)
}
//console.log("\n========== rows 10 comments from bdd formated")
//console.log(messages);
// on envoi les messages au user et pas à la room entière
socket.emit('newmsg', messages);
}
}
);
};
// définition des variables
socket.on('newmsg', function (message) {
//console.log("=======> message <========")
//console.log(message);
//console.log("=======> me <========")
//console.log(me);
if (message.message === '' || me.id === undefined) {
socket.to(room).emit('error', 'Vous ne pouvez pas envoyer un message vide')
} else if (me.id === undefined) {
socket.to(room).emit('error', 'Vous devez être identifié pour envoyer un message')
} else {
message.user = me;
//console.log(message);
bddTchat.query('INSERT INTO bla bla bla....', [
message.user.id,
message.message,
room,
message.created
], function (err) {
if (err) {
console.log(err);
socket.to(room).emit('error', err.code)
} else {
messages[0] = message;
//console.log("=======> message <========")
console.log(messages);
console.log("\n\n"+room+"\n\n")
io.sockets.to(room).emit('newmsg', messages)
}
})
}
});
// on va vérifier les utilisateurs qui se sont déconnectés pour mettre à jour la liste des données
socket.on('disconnect', function () {
socket.leave(room);
delete users[socket.id];
console.log("\n===> " + me.username + " a quitté la room : " + room + " <===\n");
});
});
Je ne comprends pas ce qu'il se passe !
Mes users ne semblent plus être dans la même room à moins qu'ils ne l'aient jamais été !
Du coup je bloque.
Si vous aviez une idée, je suis preneur.
Merci à tous
Alors j'avance un peu.
J'ai trouvé un début de réponse, qui fait que mes messages sont envoyés correctement maintenant !
J'ai spécifié le type de transport, vu ici
var socket = io.connect("http://localhost:1337",{
transports:[ 'websocket' ]
});
Maintenant, faut que je comprenne pourquoi un utilisateur connecté est systématiquement déconnecté lorsqu'un nouveau user se connecte à la room !