Attempt to resurrect qomet code - need some rewrite
[qomet.git] / sockets.js
index eeda127..dafe6d9 100644 (file)
@@ -1,46 +1,49 @@
 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");
 
 module.exports = function(io)
 {
-       io.of("/").on("connection", socket => {
+       io.of("/").on("connection", socket => { //student or monitor connexion
                const aid = socket.handshake.query.aid;
-               socket.join(aid);
-               // Student or monitor connexion
                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.join(aid + "_teacher");
                        socket.on(message.allAnswers, m => { //send feedback to student (answers)
-                               if (!!students[m.number]) //TODO: namespace here... room quiz
-                                       socket.broadcast.to(aid).emit(message.allAnswers, m);
+                               socket.broadcast.to(aid + "_student").emit(message.allAnswers, m);
                        });
                }
                else //student
                {
                        const number = socket.handshake.query.number;
                        const password = socket.handshake.query.password;
-                       AssessmentEntity.checkPassword(ObjectId(aid), number, password, (err,ret) => {
+                       EvaluationModel.checkPassword(ObjectId(aid), number, password, (err,ret) => {
                                if (!!err || !ret)
                                        return; //wrong password, or some unexpected error...
-                               // TODO: Prevent socket connection (just ignore) if student already connected
-//                             io.of('/').in(aid).clients((error, clients) => {
-//                                     if (error)
-//                                             throw error;
-//                                     if (clients.some( c => { return c. .. == number; }))
-//                                             // Problem: we just have a list of socket IDs (not handshakes)
-//                             });
-                               // TODO: next is conditional to "student not already taking the exam"
-                               socket.on(message.allAnswers, () => { //got all answers from teacher
-                                       socket.emit(message.allAnswers, m);
+                               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);
+                               });
+                               socket.on(message.studentResize, m => {
+                                       socket.broadcast.to(aid + "_teacher").emit(message.studentResize, m);
+                               });
+                               socket.on(message.studentFullscreen, m => {
+                                       socket.broadcast.to(aid + "_teacher").emit(message.studentFullscreen, m);
                                });
-                               socket.on("disconnect", () => {
-                                       //TODO: notify monitor (grey low opacity background)
-                                       //Also send to server: discoTime in assessment.papers ...
+                               socket.on("disconnect", () => { //notify monitor + server
+                                       EvaluationModel.setDiscoTime(ObjectId(aid), number);
+                                       socket.broadcast.to(aid + "_teacher").emit(message.studentDisconnect, {number: number});
                                });
                        });
                }