X-Git-Url: https://git.auder.net/?p=qomet.git;a=blobdiff_plain;f=sockets.js;h=dafe6d961773e523c98620c460eb26982b02999b;hp=d743a105c5b5060f4d70b97693db99b3f995bc8d;hb=HEAD;hpb=92c604bb02b4c46cd3b45d834652103589c61da1 diff --git a/sockets.js b/sockets.js index d743a10..dafe6d9 100644 --- a/sockets.js +++ b/sockets.js @@ -1,99 +1,51 @@ const message = require("./public/javascripts/utils/socketMessages"); const params = require("./config/parameters"); -const AssessmentEntity = require("./entities/assessment"); +const EvaluationModel = require("./models/evaluation"); const ObjectId = require("bson-objectid"); -// TODO: when teacher connect on monitor, io.of("appropriate namespace").on(connect student) { ... } -// --> 2 sockets on monitoring page: one with ns "/" et one dedicated to the exam, triggered after the first -// --> The monitoring page should not be closed during exam (otherwise monitors won't receive any more data) - -// TOOD need to re-introduce disconnections count + time (showed in monitoring and stored - -function examRoom(socket) { - let students = { }; - const aid = ObjectId(socket.handshake.query.aid); - - // Student or monitor stuff - const isTeacher = !!socket.handshake.query.secret && socket.handshake.query.secret == params.secret; - - if (isTeacher) - { - socket.on(message.newAnswer, m => { //got answer from student - socket.emit(message.newAnswer, m); - }); - socket.on(message.allAnswers, m => { //send feedback to student (answers) - if (!!students[m.number]) //TODO: namespace here... room quiz - socket.broadcast.to(students[m.number]).emit(message.allAnswers, m); - }); - socket.on("disconnect", m => { - // Reset student array if no more active teacher connections (TODO: condition) - students = { }; - }); - } - - else //student - { - const number = socket.handshake.query.number; - const password = socket.handshake.query.password; - AssessmentEntity.checkPassword(aid, number, password, (err,ret) => { - if (!!err || !ret) - return; //wrong password, or some unexpected error... - // Prevent socket connection (just ignore) if student already connected - if (!!students[number]) - return; - students[number] = { - sid: socket.id, - password: password, - }; - socket.on(message.allAnswers, () => { //got all answers from teacher - socket.emit(message.allAnswers, m); +module.exports = function(io) +{ + io.of("/").on("connection", socket => { //student or monitor connexion + const aid = socket.handshake.query.aid; + const isTeacher = !!socket.handshake.query.secret && socket.handshake.query.secret == params.secret; + + if (isTeacher) + { + socket.join(aid + "_teacher"); + socket.on(message.allAnswers, m => { //send feedback to student (answers) + socket.broadcast.to(aid + "_student").emit(message.allAnswers, m); }); - socket.on("disconnect", () => { - // .. - //TODO: notify monitor (highlight red), redirect - }); - // NOTE: nothing on disconnect --> teacher disconnect trigger students cleaning - }); - } -} - -module.exports = function(io) { - - // NOTE: if prof connected with 2 tabs and close 1, quizz should not break, thus following counter - let namespaces = { }; - - io.of("/").on("connection", socketProf => { - function closeQuizz(fullPath) { - namespaces[fullPath].counter--; - if (namespaces[fullPath].counter == 0) - { - // https://stackoverflow.com/questions/26400595/socket-io-how-do-i-remove-a-namespace - const connectedSockets = Object.keys(namespaces[fullPath].nsp.connected); - connectedSockets.forEach( sid => { - namespaces[fullPath].nsp.connected[sid].disconnect(); - }); - namespaces[fullPath].nsp.removeAllListeners(); - delete io.nsps[fullPath]; - } } - // Only prof account can connect default namespace - socketProf.on(message.startQuizz, m => { - // m contient quizz ID + fullPath (initials+path+name) - const quizzNamespace = io.of(m.fullPath); - if (!namespaces[m.fullPath]) - { - namespaces[m.fullPath] = { nsp:quizzNamespace, counter:1 }; - quizzNamespace.on("connection", quizzRoom); //après ça : prof can connect in quizz too - socketProf.emit(message.quizzReady); - socketProf.on(message.endQuizz, m2 => { - closeQuizz(m.fullPath); + else //student + { + const number = socket.handshake.query.number; + const password = socket.handshake.query.password; + EvaluationModel.checkPassword(ObjectId(aid), number, password, (err,ret) => { + if (!!err || !ret) + return; //wrong password, or some unexpected error... + EvaluationModel.newConnection(ObjectId(aid), number); + socket.broadcast.to(aid + "_teacher").emit(message.studentConnect, {number: number}); + socket.join(aid + "_student"); + socket.on(message.newAnswer, m => { //got answer from student client + socket.broadcast.to(aid + "_teacher").emit(message.newAnswer, m); + }); + socket.on(message.studentBlur, m => { + socket.broadcast.to(aid + "_teacher").emit(message.studentBlur, m); + }); + socket.on(message.studentFocus, m => { + socket.broadcast.to(aid + "_teacher").emit(message.studentFocus, m); }); - socketProf.on("disconnect", m2 => { - closeQuizz(m.fullPath); //TODO: this should delete all students in array + socket.on(message.studentResize, m => { + socket.broadcast.to(aid + "_teacher").emit(message.studentResize, m); }); - } - else - namespaces[m.fullPath]++; - }); + socket.on(message.studentFullscreen, m => { + socket.broadcast.to(aid + "_teacher").emit(message.studentFullscreen, m); + }); + socket.on("disconnect", () => { //notify monitor + server + EvaluationModel.setDiscoTime(ObjectId(aid), number); + socket.broadcast.to(aid + "_teacher").emit(message.studentDisconnect, {number: number}); + }); + }); + } }); }