diff --git a/swad_account.c b/swad_account.c index bb111851..63594e25 100644 --- a/swad_account.c +++ b/swad_account.c @@ -538,7 +538,7 @@ static void Acc_PrintAccountSeparator (void) // Return true if no error and user can be logged in // Return false on error -bool Acc_CreateNewAccountAndLogIn (void) +bool Acc_CreateMyNewAccountAndLogIn (void) { char NewNicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA+1]; char NewEmail[Usr_MAX_BYTES_USR_EMAIL+1]; @@ -554,7 +554,8 @@ bool Acc_CreateNewAccountAndLogIn (void) strcpy (Gbl.Usrs.Me.UsrDat.Password,NewEncryptedPassword); /***** User does not exist in the platform, so create him/her! *****/ - Acc_CreateNewUsr (&Gbl.Usrs.Me.UsrDat); + Acc_CreateNewUsr (&Gbl.Usrs.Me.UsrDat, + true); // I am creating my own account /***** Save nickname *****/ Nck_UpdateMyNick (NewNicknameWithoutArroba); @@ -678,7 +679,7 @@ static bool Acc_GetParamsNewAccount (char *NewNicknameWithoutArroba, // UsrDat->UsrCod must be <= 0 // UsrDat->UsrDat.IDs must contain a list of IDs for the new user -void Acc_CreateNewUsr (struct UsrData *UsrDat) +void Acc_CreateNewUsr (struct UsrData *UsrDat,bool CreatingMyOwnAccount) { extern const char *The_ThemeId[The_NUM_THEMES]; extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; @@ -754,7 +755,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat) Fil_CreateDirIfNotExists (PathRelUsr); /***** Create user's figures *****/ - Prf_CreateNewUsrFigures (UsrDat->UsrCod); + Prf_CreateNewUsrFigures (UsrDat->UsrCod,CreatingMyOwnAccount); } /*****************************************************************************/ diff --git a/swad_account.h b/swad_account.h index b4e9d3ab..a512230e 100644 --- a/swad_account.h +++ b/swad_account.h @@ -57,8 +57,8 @@ void Acc_CheckIfEmptyAccountExists (void); void Acc_ShowFormGoToRequestNewAccount (void); void Acc_ShowFormChangeMyAccount (void); -bool Acc_CreateNewAccountAndLogIn (void); -void Acc_CreateNewUsr (struct UsrData *UsrDat); +bool Acc_CreateMyNewAccountAndLogIn (void); +void Acc_CreateNewUsr (struct UsrData *UsrDat,bool CreatingMyOwnAccount); void Acc_AfterCreationNewAccount (void); void Acc_GetUsrCodAndRemUsrGbl (void); diff --git a/swad_changelog.h b/swad_changelog.h index 2b607a5a..d4267fe0 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -156,13 +156,14 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.48.12 (2016-11-07)" +#define Log_PLATFORM_VERSION "SWAD 16.49 (2016-11-08)" #define CSS_FILE "swad16.48.4.css" #define JS_FILE "swad16.46.1.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 16.49: Nov 08, 2016 Set some user's figures to 0 when creating an account. (206555 lines) Version 16.48.12: Nov 07, 2016 Icon in my webs / social networks to show figure (statistics). (206537 lines) Version 16.48.11: Nov 07, 2016 Changes in order of figures (statistics). (206523 lines) Version 16.48.10: Nov 07, 2016 Changes in text related to notifications stats. (206522 lines) diff --git a/swad_enrollment.c b/swad_enrollment.c index 27afe9da..384454a7 100644 --- a/swad_enrollment.c +++ b/swad_enrollment.c @@ -1630,9 +1630,10 @@ static void Enr_RegisterUsr (struct UsrData *UsrDat,Rol_Role_t RegRemRole, // Reset user's data Usr_ResetUsrDataExceptUsrCodAndIDs (UsrDat); // It's necessary, because the same struct UsrDat was used for former user - // User does not exist in database;list of IDs is initialized + // User does not exist in database; list of IDs is initialized UsrDat->IDs.List[0].Confirmed = true; // If he/she is a new user ==> his/her ID will be stored as confirmed in database - Acc_CreateNewUsr (UsrDat); + Acc_CreateNewUsr (UsrDat, + false); // I am NOT creating my own account } /***** Register user in current course in database *****/ @@ -3496,7 +3497,8 @@ void Enr_CreateNewUsr (void) /***** Create user *****/ Gbl.Usrs.Other.UsrDat.IDs.List[0].Confirmed = true; // User's ID will be stored as confirmed - Acc_CreateNewUsr (&Gbl.Usrs.Other.UsrDat); + Acc_CreateNewUsr (&Gbl.Usrs.Other.UsrDat, + false); // I am NOT creating my own account /***** Register user in current course in database *****/ if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected diff --git a/swad_message.c b/swad_message.c index 440de636..9a932158 100644 --- a/swad_message.c +++ b/swad_message.c @@ -1654,7 +1654,7 @@ static void Msg_ShowSentOrReceivedMessages (void) unsigned long NumRow; unsigned long NumRows; unsigned long NumMsg = 0; // Initialized to avoid warning - unsigned NumUnreadMsgs; + unsigned NumUnreadMsgs = 0; // Initialized to avoid warning struct Pagination Pagination; long MsgCod; static const Pag_WhatPaginate_t WhatPaginate[Msg_NUM_TYPES_OF_MSGS] = @@ -2798,7 +2798,7 @@ static void Msg_ShowASentOrReceivedMessage (long MsgNum,long MsgCod) extern const char *Txt_MSG_To; extern const char *Txt_MSG_Message; struct UsrData UsrDat; - const char *Title; + const char *Title = NULL; // Initialized to avoid warning bool FromThisCrs = false; // Initialized to avoid warning time_t CreatTimeUTC; // Creation time of a message long CrsCod; diff --git a/swad_profile.c b/swad_profile.c index 0349e0fe..5e151933 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -26,6 +26,7 @@ /*****************************************************************************/ #include // For NULL +#include // For string functions #include "swad_config.h" #include "swad_database.h" @@ -86,7 +87,8 @@ static void Prf_GetNumForPstAndStoreAsUsrFigure (long UsrCod); static void Prf_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod); static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures); -static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures); +static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures, + bool CreatingMyOwnAccount); static bool Prf_CheckIfUsrFiguresExists (long UsrCod); static void Prf_GetAndShowRankingFigure (const char *FieldName); @@ -860,7 +862,7 @@ static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod) DB_QueryUPDATE (Query,"can not update user's figures"); } else // User entry does not exist - Prf_CreateUsrFigures (UsrCod,&UsrFigures); + Prf_CreateUsrFigures (UsrCod,&UsrFigures,false); } } @@ -892,7 +894,7 @@ static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod) DB_QueryUPDATE (Query,"can not update user's figures"); } else // User entry does not exist - Prf_CreateUsrFigures (UsrCod,&UsrFigures); + Prf_CreateUsrFigures (UsrCod,&UsrFigures,false); } } @@ -922,7 +924,7 @@ static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod) DB_QueryUPDATE (Query,"can not update user's figures"); } else // User entry does not exist - Prf_CreateUsrFigures (UsrCod,&UsrFigures); + Prf_CreateUsrFigures (UsrCod,&UsrFigures,false); } } @@ -952,7 +954,7 @@ static void Prf_GetNumForPstAndStoreAsUsrFigure (long UsrCod) DB_QueryUPDATE (Query,"can not update user's figures"); } else // User entry does not exist - Prf_CreateUsrFigures (UsrCod,&UsrFigures); + Prf_CreateUsrFigures (UsrCod,&UsrFigures,false); } } @@ -982,7 +984,7 @@ static void Prf_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod) DB_QueryUPDATE (Query,"can not update user's figures"); } else // User entry does not exist - Prf_CreateUsrFigures (UsrCod,&UsrFigures); + Prf_CreateUsrFigures (UsrCod,&UsrFigures,false); } } @@ -990,15 +992,19 @@ static void Prf_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod) /******************* Create user's figures for a new user ********************/ /*****************************************************************************/ -void Prf_CreateNewUsrFigures (long UsrCod) +void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount) { struct UsrFigures UsrFigures; /***** Reset user's figures *****/ Prf_ResetUsrFigures (&UsrFigures); + UsrFigures.NumClicks = 0; // set number of clicks to 0 + UsrFigures.NumFileViews = 0; // set number of file views to 0 + UsrFigures.NumForPst = 0; // set number of forum posts to 0 + UsrFigures.NumMsgSnt = 0; // set number of messages sent to 0 /***** Create user's figures *****/ - Prf_CreateUsrFigures (UsrCod,&UsrFigures); + Prf_CreateUsrFigures (UsrCod,&UsrFigures,CreatingMyOwnAccount); } /*****************************************************************************/ @@ -1008,31 +1014,39 @@ void Prf_CreateNewUsrFigures (long UsrCod) static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures) { UsrFigures->FirstClickTimeUTC = (time_t) 0; // unknown first click time or user never logged - UsrFigures->NumDays = -1; // not applicable - UsrFigures->NumClicks = -1L; // unknown number of clicks - UsrFigures->NumFileViews = -1L; // unknown number of file views - UsrFigures->NumForPst = -1L; // unknown number of forum posts - UsrFigures->NumMsgSnt = -1L; // unknown number of messages sent + UsrFigures->NumDays = -1; // not applicable + UsrFigures->NumClicks = -1L; // unknown number of clicks + UsrFigures->NumFileViews = -1L; // unknown number of file views + UsrFigures->NumForPst = -1L; // unknown number of forum posts + UsrFigures->NumMsgSnt = -1L; // unknown number of messages sent } /*****************************************************************************/ /***** Get number of messages sent by a user and store in user's figures *****/ /*****************************************************************************/ -static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures) +static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures, + bool CreatingMyOwnAccount) { char Query[512]; + char SubQueryFirstClickTime[64]; + + if (CreatingMyOwnAccount) + strcpy (SubQueryFirstClickTime,"NOW()"); // This is the first click + else + sprintf (SubQueryFirstClickTime,"FROM_UNIXTIME('%ld')", + (long) UsrFigures->FirstClickTimeUTC); // 0 ==> unknown first click time or user never logged /***** Create user's figures *****/ sprintf (Query,"INSERT INTO usr_figures" "(UsrCod,FirstClickTime,NumClicks,NumFileViews,NumForPst,NumMsgSnt)" - " VALUES ('%ld',FROM_UNIXTIME('%ld'),'%ld','%ld','%ld','%ld')", + " VALUES ('%ld',%s,'%ld','%ld','%ld','%ld')", UsrCod, - (long) UsrFigures->FirstClickTimeUTC, // 0 ==> unknown first click time or user never logged - UsrFigures->NumClicks, // -1L ==> unknown number of clicks - UsrFigures->NumFileViews, // -1L ==> unknown number of file views - UsrFigures->NumForPst, // -1L ==> unknown number of forum posts - UsrFigures->NumMsgSnt); // -1L ==> unknown number of messages sent + SubQueryFirstClickTime, + UsrFigures->NumClicks, // -1L ==> unknown number of clicks + UsrFigures->NumFileViews, // -1L ==> unknown number of file views + UsrFigures->NumForPst, // -1L ==> unknown number of forum posts + UsrFigures->NumMsgSnt); // -1L ==> unknown number of messages sent DB_QueryINSERT (Query,"can not create user's figures"); } diff --git a/swad_profile.h b/swad_profile.h index 4154de0c..30a543ad 100644 --- a/swad_profile.h +++ b/swad_profile.h @@ -64,7 +64,7 @@ void Prf_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures); void Prf_CalculateFigures (void); bool Prf_GetAndStoreAllUsrFigures (long UsrCod,struct UsrFigures *UsrFigures); -void Prf_CreateNewUsrFigures (long UsrCod); +void Prf_CreateNewUsrFigures (long UsrCod,bool CreatingMyOwnAccount); void Prf_RemoveUsrFigures (long UsrCod); void Prf_IncrementNumClicksUsr (long UsrCod); void Prf_IncrementNumFileViewsUsr (long UsrCod); diff --git a/swad_user.c b/swad_user.c index c95f3cd9..07f8025a 100644 --- a/swad_user.c +++ b/swad_user.c @@ -2208,8 +2208,8 @@ void Usr_ChkUsrAndGetUsrData (void) /***** Check user and get user's data *****/ if (Gbl.Action.Act == ActCreUsrAcc) { - /***** Create new account and login *****/ - if (Acc_CreateNewAccountAndLogIn ()) // User logged in + /***** Create my new account and login *****/ + if (Acc_CreateMyNewAccountAndLogIn ()) // User logged in { Gbl.Usrs.Me.Logged = true; Usr_SetUsrRoleAndPrefs (); @@ -2229,7 +2229,7 @@ void Usr_ChkUsrAndGetUsrData (void) /***** Check user and get user's data *****/ if (Gbl.Session.IsOpen) { - if (Usr_ChkUsrAndGetUsrDataFromSession ()) // User logged in + if (Usr_ChkUsrAndGetUsrDataFromSession ()) // User logged in { Gbl.Usrs.Me.Logged = true; Usr_SetUsrRoleAndPrefs (); diff --git a/swad_web_service.c b/swad_web_service.c index 95157c24..e8334b1c 100644 --- a/swad_web_service.c +++ b/swad_web_service.c @@ -672,7 +672,7 @@ static bool Svc_GetSomeUsrDataFromUsrCod (struct UsrData *UsrDat,long CrsCod) int swad__createAccount (struct soap *soap, char *userNickname,char *userEmail,char *userPassword,char *appKey, // input - struct swad__createAccountOutput *createAccountOut) // output + struct swad__createAccountOutput *createAccountOut) // output { char NewNicknameWithoutArroba[Nck_MAX_BYTES_NICKNAME_WITH_ARROBA+1]; char NewEncryptedPassword[Cry_LENGTH_ENCRYPTED_STR_SHA512_BASE64+1]; @@ -714,7 +714,8 @@ int swad__createAccount (struct soap *soap, strcpy (Gbl.Usrs.Me.UsrDat.Password,NewEncryptedPassword); /***** User does not exist in the platform, so create him/her! *****/ - Acc_CreateNewUsr (&Gbl.Usrs.Me.UsrDat); + Acc_CreateNewUsr (&Gbl.Usrs.Me.UsrDat, + true); // I am creating my own account /***** Save nickname *****/ Nck_UpdateMyNick (NewNicknameWithoutArroba);