async function scoreResponse()

in backend/Functions/IoT/answer_receive/app.js [97:160]


async function scoreResponse(key, gameInfo, questionNumber) {
  const promise = new Promise((resolve, reject) => {
    const questionKey = `question${questionNumber.toString()}`;
    let correctAnswerString = '';
    redisClient.hget(key, questionKey, async (err, value) => {
      if (err) {
        reject(err);
        return;
      }
      const question = JSON.parse(value);
      let followUp = '';
      if(Object.prototype.hasOwnProperty.call(question, 'answerFollowup')) {
        followUp = question.answerFollowup;
      }
      if(Object.prototype.hasOwnProperty.call(question, 'answerA')) {
        switch(question.correctAnswer) {
          case 'A':
            correctAnswerString = `${question.correctAnswer} - ${question.answerA}`;
            break;
          case 'B':
            correctAnswerString = `${question.correctAnswer} - ${question.answerB}`;
            break;
          case 'C':
            correctAnswerString = `${question.correctAnswer} - ${question.answerC}`;
            break;
          case 'D':
            correctAnswerString = `${question.correctAnswer} - ${question.answerD}`;
            break;
        }
      } else {
        correctAnswerString = question.correctAnswer;
      }
      if (question.correctAnswer.toLowerCase() === gameInfo.playerAnswer.toLowerCase()) {
        let first = await saveResponse(key, gameInfo, questionNumber);
        if(first) {
          await sendPlayerCorrect(key, gameInfo);
          redisClient.zincrby(`${key}:scoreboard`, parseFloat(1), gameInfo.respondingPlayerName);
          resolve({ score: 1, message: { text: 'Correct answer', correctAnswer: correctAnswerString, followUp }});
        } else {
          resolve({ score: 0, message: { text: 'Correct answer, but not first', correctAnswer: correctAnswerString, followUp }});
        }
      } else {
        if (Object.prototype.hasOwnProperty.call(question, 'alternatives')) {
          for(let j=0; j<question.alternatives.length; j++) {
            if(question.alternatives[j].toLowerCase()===gameInfo.playerAnswer.toLowerCase()) {
                let first = await saveResponse(key, gameInfo, questionNumber);
                if(first) {
                  await sendPlayerCorrect(key, gameInfo);
                  redisClient.zincrby(`${key}:scoreboard`, parseFloat(1), gameInfo.respondingPlayerName);
                  resolve({ score: 1, message : { text: 'Correct answer', correctAnswer: correctAnswerString, followUp }});
                } else {
                  resolve({ score: 0, message : { text: 'Correct answer, but not first', correctAnswer: correctAnswerString, followUp }});
                }
            }
          }
          resolve({ score: 0, message: {text: 'Incorrect answer', correctAnswer: correctAnswerString, followUp }});
        } else {
          resolve({ score: 0, message: {text: 'Incorrect answer', correctAnswer: correctAnswerString, followUp }});
        }
      }
    });
  });
  return promise;
}