diff --git a/swad_API.c b/swad_API.c index 828ea4f10..1efaec6ac 100644 --- a/swad_API.c +++ b/swad_API.c @@ -5200,6 +5200,12 @@ int swad__getMatchStatus (struct soap *soap, Game.GamCod = (long) gameCode; Match.MchCod = (long) matchCode; + /***** Default output *****/ + getMatchStatusOut->matchCode = -1; + getMatchStatusOut->questionIndex = -1; + getMatchStatusOut->numAnswers = -1; + getMatchStatusOut->answerIndex = -1; + /***** Check web service key *****/ if ((ReturnCode = API_CheckWSKey (wsKey)) != SOAP_OK) return ReturnCode; @@ -5266,8 +5272,9 @@ int swad__getMatchStatus (struct soap *soap, if (Match.Status.Playing && // Match is being played Match.Status.Showing != Mch_END) // Unfinished /* Update players */ - getMatchStatusOut->matchCode = Mch_RegisterMeAsPlayerInMatch (&Match) ? matchCode : // > 0 ==> OK - -1; // < 0 ==> can not join this match + if (Mch_RegisterMeAsPlayerInMatch (&Match)) + if (Match.Status.Showing == Mch_ANSWERS) // Showing the question stem and the answers + getMatchStatusOut->matchCode = (int) Match.MchCod; // > 0 ==> student is allowed to answer the question /***** Set index of question inside the game *****/ getMatchStatusOut->questionIndex = (int) Match.Status.QstInd; @@ -5383,13 +5390,14 @@ int swad__answerMatchQuestion (struct soap *soap, /***** Check number of option selected by student *****/ if (numOption < 0) - return soap_sender_fault (soap, - "Bad number of option", - "The number of option should be greater or equal than 0"); - UsrAnswer.NumOpt = (unsigned) numOption; - - /***** Store answer *****/ - Mch_StoreQuestionAnswer (&Match,QstInd,&UsrAnswer); + /***** Remove my answer to this question *****/ + Mch_RemoveMyQuestionAnswer (&Match,QstInd); + else + { + /***** Store answer *****/ + UsrAnswer.NumOpt = (unsigned) numOption; + Mch_StoreQuestionAnswer (&Match,QstInd,&UsrAnswer); + } return SOAP_OK; } diff --git a/swad_action.c b/swad_action.c index a3d22b554..9f4df8caf 100644 --- a/swad_action.c +++ b/swad_action.c @@ -761,7 +761,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = [ActJoiMch ] = {1780,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_NEW_TAB,Mch_GetMatchBeingPlayed ,Mch_JoinMatchAsStd ,NULL}, [ActSeeMchAnsQstStd ] = {1808,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_JoinMatchAsStd ,NULL}, - [ActRemMchAnsQstStd ] = {1809,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_RemoveMyQuestionAnswer ,NULL}, + [ActRemMchAnsQstStd ] = {1809,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_RemMyQstAnsAndShowMchStatus ,NULL}, [ActAnsMchQstStd ] = {1651,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_2ND_TAB,Mch_GetMatchBeingPlayed ,Mch_ReceiveQuestionAnswer ,NULL}, [ActRefMchStd ] = {1782,-1,TabUnk,ActSeeAllGam ,0x008, 0, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_AJAX_RFRESH,Mch_GetMatchBeingPlayed ,Mch_RefreshMatchStd ,NULL}, diff --git a/swad_changelog.h b/swad_changelog.h index d35192193..4732d026a 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -555,7 +555,7 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - * En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 19.259 (2020-08-22)" +#define Log_PLATFORM_VERSION "SWAD 19.260.1 (2020-08-26)" #define CSS_FILE "swad19.253.css" #define JS_FILE "swad19.254.js" /* @@ -573,6 +573,7 @@ TODO: Que al generar un examen s TODO: Create module swad_test_result "sudo apt install webp" en Ubuntu, y "yum install libwebp libwebp-tools" en CentOS, para decodificar imágenes Web/ug reportado por Javier Fernández Baldomero. + Version 19.260.1: Aug 26, 2020 Fixed bugs in API functions related to games and matches. Reported by Sergio Díaz Rueda. (304027 lines) Version 19.260: Aug 23, 2020 New API function getAvailableRoles. (304009 lines) Version 19.259: Aug 22, 2020 Changes in API function answerMatchQuestion. (303969 lines) Version 19.258: Aug 11, 2020 Changes in API functions related to games and matches. (303951 lines) diff --git a/swad_match.c b/swad_match.c index 994980b7a..e5ed1cae5 100644 --- a/swad_match.c +++ b/swad_match.c @@ -3733,7 +3733,7 @@ void Mch_JoinMatchAsStd (void) /****** Remove student's answer to a question and show match as student ******/ /*****************************************************************************/ -void Mch_RemoveMyQuestionAnswer (void) +void Mch_RemMyQstAnsAndShowMchStatus (void) { struct Mch_Match Match; unsigned QstInd; @@ -3748,18 +3748,8 @@ void Mch_RemoveMyQuestionAnswer (void) /***** Get question index from form *****/ QstInd = Gam_GetParamQstInd (); - /***** Check that teacher's screen is showing answers - and question index is the current one being played *****/ - if (Match.Status.Playing && // Match is being played - Match.Status.Showing == Mch_ANSWERS && // Teacher's screen is showing answers - QstInd == Match.Status.QstInd) // Removing answer to the current question being played - { - /***** Remove my answer to this question *****/ - Mch_RemoveMyAnswerToMatchQuestion (&Match); - - /***** Compute score and update my match result *****/ - MchPrn_ComputeScoreAndUpdateMyMatchPrintInDB (Match.MchCod); - } + /***** Remove my answer to this question *****/ + Mch_RemoveMyQuestionAnswer (&Match,QstInd); /***** Show current match status *****/ HTM_DIV_Begin ("id=\"match\" class=\"MCH_CONT\""); @@ -3767,6 +3757,26 @@ void Mch_RemoveMyQuestionAnswer (void) HTM_DIV_End (); } +/*****************************************************************************/ +/******************** Remove student's answer to a question ******************/ +/*****************************************************************************/ + +void Mch_RemoveMyQuestionAnswer (const struct Mch_Match *Match,unsigned QstInd) + { + /***** Check that teacher's screen is showing answers + and question index is the current one being played *****/ + if (Match->Status.Playing && // Match is being played + Match->Status.Showing == Mch_ANSWERS && // Teacher's screen is showing answers + QstInd == Match->Status.QstInd) // Removing answer to the current question being played + { + /***** Remove my answer to this question *****/ + Mch_RemoveMyAnswerToMatchQuestion (Match); + + /***** Compute score and update my match result *****/ + MchPrn_ComputeScoreAndUpdateMyMatchPrintInDB (Match->MchCod); + } + } + /*****************************************************************************/ /******************** Start match countdown (by a teacher) *******************/ /*****************************************************************************/ @@ -3961,7 +3971,7 @@ void Mch_ReceiveQuestionAnswer (void) /********** Store question answer from student when playing a match **********/ /*****************************************************************************/ -void Mch_StoreQuestionAnswer (struct Mch_Match *Match,unsigned QstInd, +void Mch_StoreQuestionAnswer (const struct Mch_Match *Match,unsigned QstInd, struct Mch_UsrAnswer *UsrAnswer) { unsigned Indexes[Tst_MAX_OPTIONS_PER_QUESTION]; diff --git a/swad_match.h b/swad_match.h index f76aa6228..513619c44 100644 --- a/swad_match.h +++ b/swad_match.h @@ -136,7 +136,8 @@ bool Mch_RegisterMeAsPlayerInMatch (struct Mch_Match *Match); void Mch_GetMatchBeingPlayed (void); void Mch_JoinMatchAsStd (void); -void Mch_RemoveMyQuestionAnswer (void); +void Mch_RemMyQstAnsAndShowMchStatus (void); +void Mch_RemoveMyQuestionAnswer (const struct Mch_Match *Match,unsigned QstInd); void Mch_StartCountdown (void); void Mch_RefreshMatchTch (void); @@ -145,7 +146,7 @@ void Mch_RefreshMatchStd (void); void Mch_GetQstAnsFromDB (long MchCod,long UsrCod,unsigned QstInd, struct Mch_UsrAnswer *UsrAnswer); void Mch_ReceiveQuestionAnswer (void); -void Mch_StoreQuestionAnswer (struct Mch_Match *Match,unsigned QstInd, +void Mch_StoreQuestionAnswer (const struct Mch_Match *Match,unsigned QstInd, struct Mch_UsrAnswer *UsrAnswer); void Mch_GetMatchQuestionsFromDB (struct MchPrn_Print *Print);