swad-core/swad_profile.c

1472 lines
55 KiB
C
Raw Normal View History

2015-03-14 17:39:04 +01:00
// swad_profile.c: user's public profile
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
2016-01-01 20:19:43 +01:00
Copyright (C) 1999-2016 Antonio Ca<EFBFBD>as Vargas
2015-03-14 17:39:04 +01:00
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/*********************************** Headers *********************************/
/*****************************************************************************/
#include <linux/stddef.h> // For NULL
#include "swad_config.h"
#include "swad_database.h"
2015-03-19 00:28:37 +01:00
#include "swad_follow.h"
2015-03-14 17:39:04 +01:00
#include "swad_global.h"
#include "swad_nickname.h"
#include "swad_parameter.h"
#include "swad_privacy.h"
2015-03-18 02:11:23 +01:00
#include "swad_profile.h"
2015-03-14 17:39:04 +01:00
#include "swad_role.h"
2015-12-29 14:24:37 +01:00
#include "swad_social.h"
2015-03-14 17:39:04 +01:00
#include "swad_text.h"
#include "swad_theme.h"
#include "swad_user.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/****************************** Internal types *******************************/
/*****************************************************************************/
struct UsrFigures
{
2015-10-26 14:35:50 +01:00
time_t FirstClickTimeUTC; // 0 ==> unknown first click time of user never logged
int NumDays; // -1 ==> not applicable
long NumClicks; // -1L ==> unknown number of clicks
long NumFileViews; // -1L ==> unknown number of file views
long NumForPst; // -1L ==> unknown number of forum posts
long NumMsgSnt; // -1L ==> unknown number of messages sent
2015-03-14 17:39:04 +01:00
};
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/************************* Internal global variables *************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
2015-03-14 18:41:01 +01:00
static void Prf_RequestUserProfileWithDefaultNickname (const char *DefaultNickname);
2015-03-18 02:11:23 +01:00
static void Prf_GetUsrDatAndShowUserProfile (void);
2015-03-14 17:39:04 +01:00
static void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat);
2015-12-30 18:43:58 +01:00
static void Prf_PutLinkToUpdateAction (Act_Action_t Action,const char *EncryptedUsrCod);
2015-03-14 18:41:01 +01:00
2015-03-14 17:39:04 +01:00
static void Prf_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures);
2015-03-14 18:41:01 +01:00
2015-03-17 01:03:22 +01:00
static unsigned long Prf_GetRankingFigure (long UsrCod,const char *FieldName);
static unsigned long Prf_GetNumUsrsWithFigure (const char *FieldName);
2015-03-14 17:39:04 +01:00
static unsigned long Prf_GetRankingNumClicksPerDay (long UsrCod);
static unsigned long Prf_GetNumUsrsWithNumClicksPerDay (void);
2015-03-17 00:54:03 +01:00
static void Prf_ShowRanking (unsigned long Rank,unsigned long NumUsrs);
2015-03-14 18:41:01 +01:00
2015-03-14 17:39:04 +01:00
static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod);
static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod);
static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod);
static void Prf_GetNumForPstAndStoreAsUsrFigure (long UsrCod);
static void Prf_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod);
2015-03-14 18:41:01 +01:00
2015-03-14 17:39:04 +01:00
static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures);
static void Prf_CreateUsrFigures (long UsrCod,const struct UsrFigures *UsrFigures);
static bool Prf_CheckIfUsrFiguresExists (long UsrCod);
2015-03-16 17:46:32 +01:00
static void Prf_GetAndShowRankingFigure (const char *FieldName);
2015-03-14 17:39:04 +01:00
/*****************************************************************************/
/************************** Get public profile URL ***************************/
/*****************************************************************************/
char *Prf_GetURLPublicProfile (char *URL,const char *NicknameWithoutArroba)
{
2015-12-07 23:13:08 +01:00
extern const char *Txt_STR_LANG_ID[1+Txt_NUM_LANGUAGES];
2015-03-14 17:39:04 +01:00
/***** Build URL using nickname *****/
sprintf (URL,"%s/%s?usr=@%s",
2015-12-07 23:13:08 +01:00
Cfg_HTTPS_URL_SWAD_CGI,
Txt_STR_LANG_ID[Gbl.Prefs.Language],
2015-03-14 17:39:04 +01:00
NicknameWithoutArroba);
return URL;
}
/*****************************************************************************/
/************************** Request a user's profile *************************/
/*****************************************************************************/
void Prf_RequestUserProfile (void)
2015-03-14 18:41:01 +01:00
{
/* By default, the nickname is filled with my nickname
If no user logged ==> the nickname is empty */
Prf_RequestUserProfileWithDefaultNickname (Gbl.Usrs.Me.UsrDat.Nickname);
}
/*****************************************************************************/
/*************** Request a user's profile with nickname filled ***************/
/*****************************************************************************/
static void Prf_RequestUserProfileWithDefaultNickname (const char *DefaultNickname)
2015-03-14 17:39:04 +01:00
{
extern const char *Txt_View_public_profile;
2015-07-28 00:16:09 +02:00
extern const char *The_ClassForm[The_NUM_THEMES];
2015-03-14 17:39:04 +01:00
extern const char *Txt_Nickname;
extern const char *Txt_Continue;
2015-04-11 23:46:21 +02:00
/***** Start form *****/
Act_FormStart (ActSeePubPrf);
2015-03-14 17:39:04 +01:00
/***** Start frame *****/
2015-04-12 18:01:06 +02:00
Lay_StartRoundFrame (NULL,Txt_View_public_profile);
2015-03-14 17:39:04 +01:00
/***** Form to request user's @nickname *****/
2015-04-12 18:01:06 +02:00
fprintf (Gbl.F.Out,"<label class=\"%s\">"
"%s:&nbsp;"
"</label>"
2015-03-14 17:39:04 +01:00
"<input type=\"text\" name=\"usr\""
2015-04-12 18:01:06 +02:00
" size=\"20\" maxlength=\"%u\" value=\"@%s\" />",
2015-07-28 00:16:09 +02:00
The_ClassForm[Gbl.Prefs.Theme],
2015-03-14 17:39:04 +01:00
Txt_Nickname,
Nck_MAX_BYTES_NICKNAME_WITH_ARROBA,
2015-03-14 18:41:01 +01:00
DefaultNickname);
2015-03-14 17:39:04 +01:00
2015-04-11 23:46:21 +02:00
/***** Send button and end frame *****/
2015-04-12 18:01:06 +02:00
Lay_EndRoundFrameWithButton (Lay_CONFIRM_BUTTON,Txt_Continue);
2015-03-14 17:39:04 +01:00
2015-04-11 23:46:21 +02:00
/***** End form *****/
Act_FormEnd ();
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/**************** Get user's code and show a user's profile ******************/
/*****************************************************************************/
void Prf_GetUsrCodAndShowUserProfile (void)
{
2015-03-14 18:41:01 +01:00
/***** Try to get user *****/
// User's code may be already taken from nickname in Par_GetMainParameters ()
if (Gbl.Usrs.Other.UsrDat.UsrCod <= 0)
// If user is not set, try to get it from user code
Usr_GetParamOtherUsrCodEncrypted ();
2015-03-14 17:39:04 +01:00
/***** Show user's profile *****/
2015-03-18 02:11:23 +01:00
Prf_GetUsrDatAndShowUserProfile ();
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/*************************** Show a user's profile ***************************/
/*****************************************************************************/
2015-03-14 18:41:01 +01:00
// If error, Nickname is used to fill the form to request another nickname
2015-03-14 17:39:04 +01:00
2015-03-18 02:11:23 +01:00
static void Prf_GetUsrDatAndShowUserProfile (void)
2015-03-14 17:39:04 +01:00
{
extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
2015-03-18 02:11:23 +01:00
bool Error;
2015-03-14 17:39:04 +01:00
/***** Check if user exists and get his data *****/
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // Existing user
2015-03-18 02:11:23 +01:00
/***** Show public profile *****/
Error = !Prf_ShowUserProfile ();
2015-03-14 17:39:04 +01:00
else
Error = true;
if (Error)
{
/***** Show error message *****/
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
/***** Request nickname again *****/
2015-03-14 18:41:01 +01:00
Prf_RequestUserProfileWithDefaultNickname ("");
2015-03-14 17:39:04 +01:00
}
2016-01-04 16:10:27 +01:00
else if (Gbl.Usrs.Me.Logged) // Timeline visible only by logged users
2016-01-02 02:33:23 +01:00
{
/***** Start section *****/
fprintf (Gbl.F.Out,"<section id=\"timeline\">");
2015-12-29 14:31:48 +01:00
/***** Show social activity (timeline) of this user *****/
2016-01-02 01:56:48 +01:00
Soc_ShowTimelineUsr ();
2016-01-02 02:33:23 +01:00
/***** End section *****/
fprintf (Gbl.F.Out,"</section>");
}
2015-03-14 17:39:04 +01:00
}
2015-03-18 02:11:23 +01:00
/*****************************************************************************/
/*************************** Show a user's profile ***************************/
/*****************************************************************************/
// Return false on error
bool Prf_ShowUserProfile (void)
{
2015-12-29 14:24:37 +01:00
unsigned NumFollowing;
unsigned NumFollowers;
2015-12-29 19:40:38 +01:00
bool UsrFollowsMe;
bool IFollowUsr;
2015-12-29 14:24:37 +01:00
2015-03-18 02:11:23 +01:00
/***** Check if I can see the public profile *****/
2015-12-12 19:47:10 +01:00
if (Pri_ShowIsAllowed (Gbl.Usrs.Other.UsrDat.ProfileVisibility,
Gbl.Usrs.Other.UsrDat.UsrCod))
2015-03-18 02:11:23 +01:00
{
if (Gbl.CurrentCrs.Crs.CrsCod > 0) // Course selected
{
/* Get user's role in current course */
Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB = Rol_GetRoleInCrs (Gbl.CurrentCrs.Crs.CrsCod,Gbl.Usrs.Other.UsrDat.UsrCod);
/* Get if user has accepted enrollment in current course */
2015-09-17 11:21:49 +02:00
Gbl.Usrs.Other.UsrDat.Accepted = Usr_CheckIfUsrBelongsToCrs (Gbl.Usrs.Other.UsrDat.UsrCod,
Gbl.CurrentCrs.Crs.CrsCod,
true);
2015-03-18 02:11:23 +01:00
}
/***** Common record *****/
Rec_ShowSharedUsrRecord (Rec_RECORD_PUBLIC,&Gbl.Usrs.Other.UsrDat);
2015-03-18 21:53:56 +01:00
/***** Show details of user's profile *****/
Prf_ShowDetailsUserProfile (&Gbl.Usrs.Other.UsrDat);
2015-03-18 02:11:23 +01:00
2015-12-29 19:40:38 +01:00
/***** Count following and followers *****/
2015-12-29 14:24:37 +01:00
NumFollowing = Fol_GetNumFollowing (Gbl.Usrs.Other.UsrDat.UsrCod);
NumFollowers = Fol_GetNumFollowers (Gbl.Usrs.Other.UsrDat.UsrCod);
2015-12-29 19:40:38 +01:00
UsrFollowsMe = false;
if (NumFollowing)
UsrFollowsMe = Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Other.UsrDat.UsrCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
IFollowUsr = false;
if (NumFollowers)
IFollowUsr = Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Show following and followers *****/
2015-12-29 14:24:37 +01:00
Fol_ShowFollowingAndFollowers (&Gbl.Usrs.Other.UsrDat,
2015-12-29 19:40:38 +01:00
NumFollowing,NumFollowers,
UsrFollowsMe,IFollowUsr);
2015-12-29 14:24:37 +01:00
2015-03-18 02:11:23 +01:00
return true;
}
return false;
}
2015-03-14 17:39:04 +01:00
/*****************************************************************************/
/******************** Change my public profile visibility ********************/
/*****************************************************************************/
void Prf_ChangeProfileVisibility (void)
{
extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY];
extern const char *Txt_The_visibility_of_your_public_profile_has_changed;
char Query[128];
/***** Get param with public/private photo *****/
2015-12-24 19:30:45 +01:00
Gbl.Usrs.Me.UsrDat.ProfileVisibility = Pri_GetParamVisibility ("VisPrf");
2015-03-14 17:39:04 +01:00
/***** Store public/private photo in database *****/
sprintf (Query,"UPDATE usr_data SET ProfileVisibility='%s'"
" WHERE UsrCod='%ld'",
Pri_VisibilityDB[Gbl.Usrs.Me.UsrDat.ProfileVisibility],
Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not update your preference about public profile visibility");
/***** Show alert *****/
Lay_ShowAlert (Lay_SUCCESS,Txt_The_visibility_of_your_public_profile_has_changed);
/***** Show form again *****/
Pri_EditMyPrivacy ();
}
/*****************************************************************************/
/********************** Show details of user's profile ***********************/
/*****************************************************************************/
static void Prf_ShowDetailsUserProfile (const struct UsrData *UsrDat)
{
extern const char *Txt_ROLES_SINGUL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
2015-03-18 21:53:56 +01:00
extern const char *Txt_teachers_ABBREVIATION;
extern const char *Txt_students_ABBREVIATION;
2015-12-14 01:25:20 +01:00
extern const char *Txt_courses_ABBREVIATION;
2015-03-14 17:39:04 +01:00
extern const char *Txt_Files;
extern const char *Txt_file;
extern const char *Txt_files;
extern const char *Txt_public_FILES;
2015-03-18 21:53:56 +01:00
extern const char *Txt_From_TIME;
extern const char *Txt_day;
extern const char *Txt_days;
extern const char *Txt_Clicks;
extern const char *Txt_clicks;
extern const char *Txt_Downloads;
extern const char *Txt_download;
extern const char *Txt_downloads;
extern const char *Txt_Forums;
extern const char *Txt_post;
extern const char *Txt_posts;
extern const char *Txt_Messages;
extern const char *Txt_message;
extern const char *Txt_messages;
2015-03-29 01:06:00 +01:00
bool UsrIsBannedFromRanking;
2015-03-18 21:53:56 +01:00
struct UsrFigures UsrFigures;
2015-03-14 17:39:04 +01:00
unsigned NumCrssUsrIsTeacher;
unsigned NumCrssUsrIsStudent;
unsigned NumFiles;
unsigned NumPublicFiles;
2015-12-12 19:47:10 +01:00
/***** Start left list *****/
fprintf (Gbl.F.Out,"<div id=\"prf_fig_left_container\">"
2016-01-01 21:18:44 +01:00
"<ul class=\"PRF_FIG_UL DAT_NOBR_N\">");
2015-09-28 18:28:29 +02:00
2015-12-12 19:47:10 +01:00
/***** Number of courses in which the user is teacher *****/
NumCrssUsrIsTeacher = Usr_GetNumCrssOfUsrWithARole (UsrDat->UsrCod,Rol_TEACHER);
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/tch64x64.gif');\" />"
2015-12-12 19:47:10 +01:00
"%u&nbsp;%s&nbsp;",
Txt_ROLES_SINGUL_Abc[Rol_TEACHER][UsrDat->Sex],
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL,
2015-12-12 19:47:10 +01:00
NumCrssUsrIsTeacher,
2015-12-14 01:25:20 +01:00
Txt_courses_ABBREVIATION);
2015-12-12 19:47:10 +01:00
if (NumCrssUsrIsTeacher)
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"(%u&nbsp;%s/%u&nbsp;%s)",
2015-12-12 19:47:10 +01:00
Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_TEACHER,Rol_TEACHER),
2015-03-18 21:53:56 +01:00
Txt_teachers_ABBREVIATION,
2015-12-12 19:47:10 +01:00
Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_TEACHER,Rol_STUDENT),
2015-03-18 21:53:56 +01:00
Txt_students_ABBREVIATION);
2015-12-12 19:47:10 +01:00
fprintf (Gbl.F.Out,"</li>");
/***** Number of courses in which the user is student *****/
NumCrssUsrIsStudent = Usr_GetNumCrssOfUsrWithARole (UsrDat->UsrCod,Rol_STUDENT);
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/std64x64.gif');\" />"
2015-12-12 19:47:10 +01:00
"%u&nbsp;%s&nbsp;",
Txt_ROLES_SINGUL_Abc[Rol_STUDENT][UsrDat->Sex],
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL,
2015-12-12 19:47:10 +01:00
NumCrssUsrIsStudent,
2015-12-14 01:25:20 +01:00
Txt_courses_ABBREVIATION);
2015-12-12 19:47:10 +01:00
if (NumCrssUsrIsStudent)
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"(%u&nbsp;%s/%u&nbsp;%s)",
2015-12-12 19:47:10 +01:00
Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_STUDENT,Rol_TEACHER),
2015-03-18 21:53:56 +01:00
Txt_teachers_ABBREVIATION,
2015-12-12 19:47:10 +01:00
Usr_GetNumUsrsInCrssOfAUsr (UsrDat->UsrCod,Rol_STUDENT,Rol_STUDENT),
2015-03-18 21:53:56 +01:00
Txt_students_ABBREVIATION);
2015-12-12 19:47:10 +01:00
fprintf (Gbl.F.Out,"</li>");
2015-03-14 17:39:04 +01:00
/***** Number of files currently published *****/
if ((NumFiles = Brw_GetNumFilesUsr (UsrDat->UsrCod)))
NumPublicFiles = Brw_GetNumPublicFilesUsr (UsrDat->UsrCod);
else
NumPublicFiles = 0;
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/file64x64.gif');\" />"
2015-03-21 19:55:00 +01:00
"%u&nbsp;%s&nbsp;(%u&nbsp;%s)"
2015-12-12 02:01:20 +01:00
"</li>",
2015-07-22 13:49:39 +02:00
Txt_Files,
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL,
2015-03-14 17:39:04 +01:00
NumFiles,
(NumFiles == 1) ? Txt_file :
Txt_files,
NumPublicFiles,Txt_public_FILES);
/***** Get figures *****/
Prf_GetUsrFigures (UsrDat->UsrCod,&UsrFigures);
/* First click time */
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/clock64x64.gif');\" />",
2015-07-22 13:49:39 +02:00
Txt_From_TIME,
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL);
2015-10-26 14:35:50 +01:00
if (UsrFigures.FirstClickTimeUTC)
2015-03-14 17:39:04 +01:00
{
2015-12-12 19:47:10 +01:00
fprintf (Gbl.F.Out,"<span id=\"first_click_date\"></span>");
2015-03-24 10:11:17 +01:00
if (UsrFigures.NumDays > 0)
2015-03-21 19:55:00 +01:00
fprintf (Gbl.F.Out,"&nbsp;(%d&nbsp;%s)",
2015-03-14 17:39:04 +01:00
UsrFigures.NumDays,
(UsrFigures.NumDays == 1) ? Txt_day :
Txt_days);
2015-10-26 14:35:50 +01:00
fprintf (Gbl.F.Out,"<script type=\"text/javascript\">"
2015-12-12 19:47:10 +01:00
"writeLocalDateFromUTC('first_click_date',%ld,'&nbsp;');"
2015-10-26 14:35:50 +01:00
"</script>",
(long) UsrFigures.FirstClickTimeUTC);
2015-03-14 17:39:04 +01:00
}
else // First click time is unknown or user never logged
/***** Button to fetch and store first click time *****/
2015-12-30 18:43:58 +01:00
Prf_PutLinkToUpdateAction (ActCal1stClkTim,UsrDat->EncryptedUsrCod);
2015-12-12 02:01:20 +01:00
fprintf (Gbl.F.Out,"</li>");
2015-03-14 17:39:04 +01:00
2015-12-12 19:47:10 +01:00
/***** End of right list *****/
fprintf (Gbl.F.Out,"</ul>"
"</div>");
/***** Start left list *****/
fprintf (Gbl.F.Out,"<div id=\"prf_fig_right_container\">"
2016-01-01 21:18:44 +01:00
"<ul class=\"PRF_FIG_UL DAT_NOBR_N\">");
2015-12-12 19:47:10 +01:00
2015-03-29 01:06:00 +01:00
UsrIsBannedFromRanking = Usr_CheckIfUsrBanned (UsrDat->UsrCod);
if (!UsrIsBannedFromRanking)
2015-03-14 17:39:04 +01:00
{
2015-03-29 01:06:00 +01:00
/* Number of clicks */
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/click64x64.gif');\" />",
2015-07-22 13:49:39 +02:00
Txt_Clicks,
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL);
2015-03-29 01:06:00 +01:00
if (UsrFigures.NumClicks >= 0)
2015-03-14 17:39:04 +01:00
{
2015-03-29 01:06:00 +01:00
fprintf (Gbl.F.Out,"%ld&nbsp;%s&nbsp;",
UsrFigures.NumClicks,Txt_clicks);
Prf_ShowRanking (Prf_GetRankingFigure (UsrDat->UsrCod,"NumClicks"),
Prf_GetNumUsrsWithFigure ("NumClicks"));
if (UsrFigures.NumDays > 0)
{
fprintf (Gbl.F.Out,"&nbsp;(");
Str_WriteFloatNum ((float) UsrFigures.NumClicks /
(float) UsrFigures.NumDays);
2015-12-14 01:25:20 +01:00
fprintf (Gbl.F.Out,"/%s&nbsp;",Txt_day);
2015-03-29 01:06:00 +01:00
Prf_ShowRanking (Prf_GetRankingNumClicksPerDay (UsrDat->UsrCod),
Prf_GetNumUsrsWithNumClicksPerDay ());
fprintf (Gbl.F.Out,")");
}
2015-03-14 17:39:04 +01:00
}
2015-03-29 01:06:00 +01:00
else // Number of clicks is unknown
/***** Button to fetch and store number of clicks *****/
2015-12-30 18:43:58 +01:00
Prf_PutLinkToUpdateAction (ActCalNumClk,UsrDat->EncryptedUsrCod);
2015-12-12 02:01:20 +01:00
fprintf (Gbl.F.Out,"</li>");
2015-03-14 17:39:04 +01:00
2015-03-29 01:06:00 +01:00
/***** Number of file views *****/
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/download64x64.gif');\" />",
2015-07-22 13:49:39 +02:00
Txt_Downloads,
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL);
2015-03-29 01:06:00 +01:00
if (UsrFigures.NumFileViews >= 0)
2015-03-14 17:39:04 +01:00
{
2015-03-29 01:06:00 +01:00
fprintf (Gbl.F.Out,"%ld&nbsp;%s&nbsp;",
UsrFigures.NumFileViews,
(UsrFigures.NumFileViews == 1) ? Txt_download :
Txt_downloads);
Prf_ShowRanking (Prf_GetRankingFigure (UsrDat->UsrCod,"NumFileViews"),
Prf_GetNumUsrsWithFigure ("NumFileViews"));
if (UsrFigures.NumDays > 0)
{
fprintf (Gbl.F.Out,"&nbsp;(");
Str_WriteFloatNum ((float) UsrFigures.NumFileViews /
(float) UsrFigures.NumDays);
2015-12-14 01:25:20 +01:00
fprintf (Gbl.F.Out,"/%s)",Txt_day);
2015-03-29 01:06:00 +01:00
}
2015-03-14 17:39:04 +01:00
}
2015-03-29 01:06:00 +01:00
else // Number of file views is unknown
/***** Button to fetch and store number of file views *****/
2015-12-30 18:43:58 +01:00
Prf_PutLinkToUpdateAction (ActCalNumFilVie,UsrDat->EncryptedUsrCod);
2015-12-12 02:01:20 +01:00
fprintf (Gbl.F.Out,"</li>");
2015-03-14 17:39:04 +01:00
2015-03-29 01:06:00 +01:00
/***** Number of posts in forums *****/
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/forum64x64.gif');\" />",
2015-07-22 13:49:39 +02:00
Txt_Forums,
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL);
2015-03-29 01:06:00 +01:00
if (UsrFigures.NumForPst >= 0)
2015-03-14 17:39:04 +01:00
{
2015-03-29 01:06:00 +01:00
fprintf (Gbl.F.Out,"%ld&nbsp;%s&nbsp;",
UsrFigures.NumForPst,
(UsrFigures.NumForPst == 1) ? Txt_post :
Txt_posts);
Prf_ShowRanking (Prf_GetRankingFigure (UsrDat->UsrCod,"NumForPst"),
Prf_GetNumUsrsWithFigure ("NumForPst"));
if (UsrFigures.NumDays > 0)
{
fprintf (Gbl.F.Out,"&nbsp;(");
Str_WriteFloatNum ((float) UsrFigures.NumForPst /
(float) UsrFigures.NumDays);
2015-12-14 01:25:20 +01:00
fprintf (Gbl.F.Out,"/%s)",Txt_day);
2015-03-29 01:06:00 +01:00
}
2015-03-14 17:39:04 +01:00
}
2015-03-29 01:06:00 +01:00
else // Number of forum posts is unknown
/***** Button to fetch and store number of forum posts *****/
2015-12-30 18:43:58 +01:00
Prf_PutLinkToUpdateAction (ActCalNumForPst,UsrDat->EncryptedUsrCod);
2015-12-12 02:01:20 +01:00
fprintf (Gbl.F.Out,"</li>");
2015-03-14 17:39:04 +01:00
2015-03-29 01:06:00 +01:00
/***** Number of messages sent *****/
2015-12-12 23:47:53 +01:00
fprintf (Gbl.F.Out,"<li title=\"%s\" class=\"PRF_FIG_LI\""
" style=\"background-image:url('%s/msg64x64.gif');\" />",
2015-07-22 13:49:39 +02:00
Txt_Messages,
2015-12-12 23:47:53 +01:00
Gbl.Prefs.IconsURL);
2015-03-29 01:06:00 +01:00
if (UsrFigures.NumMsgSnt >= 0)
2015-03-14 17:39:04 +01:00
{
2015-03-29 01:06:00 +01:00
fprintf (Gbl.F.Out,"%ld&nbsp;%s&nbsp;",
UsrFigures.NumMsgSnt,
(UsrFigures.NumMsgSnt == 1) ? Txt_message :
Txt_messages);
Prf_ShowRanking (Prf_GetRankingFigure (UsrDat->UsrCod,"NumMsgSnt"),
Prf_GetNumUsrsWithFigure ("NumMsgSnt"));
if (UsrFigures.NumDays > 0)
{
fprintf (Gbl.F.Out,"&nbsp;(");
Str_WriteFloatNum ((float) UsrFigures.NumMsgSnt /
(float) UsrFigures.NumDays);
2015-12-14 01:25:20 +01:00
fprintf (Gbl.F.Out,"/%s)",Txt_day);
2015-03-29 01:06:00 +01:00
}
2015-03-14 17:39:04 +01:00
}
2015-03-29 01:06:00 +01:00
else // Number of clicks is unknown
/***** Button to fetch and store number of messages sent *****/
2015-12-30 18:43:58 +01:00
Prf_PutLinkToUpdateAction (ActCalNumMsgSnt,UsrDat->EncryptedUsrCod);
2015-12-12 02:01:20 +01:00
fprintf (Gbl.F.Out,"</li>");
2015-03-14 17:39:04 +01:00
}
2015-12-12 19:47:10 +01:00
/***** End of right list *****/
2015-12-12 02:01:20 +01:00
fprintf (Gbl.F.Out,"</ul>"
"</div>");
2015-03-14 17:39:04 +01:00
}
2015-12-30 18:43:58 +01:00
/*****************************************************************************/
/******** Put contextual link with animated icon to update an action *********/
/*****************************************************************************/
static void Prf_PutLinkToUpdateAction (Act_Action_t Action,const char *EncryptedUsrCod)
{
extern const char *The_ClassForm[The_NUM_THEMES];
extern const char *Txt_Calculate;
Act_FormStart (Action);
Usr_PutParamUsrCodEncrypted (EncryptedUsrCod);
Act_LinkFormSubmitAnimated (Txt_Calculate,The_ClassForm[Gbl.Prefs.Theme]);
Lay_PutCalculateIconWithText (Txt_Calculate,Txt_Calculate);
Act_FormEnd ();
}
2015-03-14 17:39:04 +01:00
/*****************************************************************************/
/********************** Select values on user's figures **********************/
/*****************************************************************************/
static void Prf_GetUsrFigures (long UsrCod,struct UsrFigures *UsrFigures)
{
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumRows;
/***** Get user's figures from database *****/
2015-10-26 14:35:50 +01:00
sprintf (Query,"SELECT UNIX_TIMESTAMP(FirstClickTime),"
2015-03-24 10:11:17 +01:00
"DATEDIFF(NOW(),FirstClickTime)+1,"
2015-03-14 17:39:04 +01:00
"NumClicks,NumFileViews,NumForPst,NumMsgSnt"
" FROM usr_figures WHERE UsrCod='%ld'",
UsrCod);
if ((NumRows = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get user's figures")))
{
/***** Get user's figures *****/
row = mysql_fetch_row (mysql_res);
2015-10-26 14:35:50 +01:00
/* Get first click (row[0] holds first click time UTC) */
UsrFigures->FirstClickTimeUTC = Dat_GetUNIXTimeFromStr (row[0]);
2015-03-14 17:39:04 +01:00
/* Get number of days since first click (row[1]) */
2015-10-26 14:35:50 +01:00
if (UsrFigures->FirstClickTimeUTC)
2015-03-14 17:39:04 +01:00
{
if (sscanf (row[1],"%d",&UsrFigures->NumDays) != 1)
UsrFigures->NumDays = -1;
}
else
UsrFigures->NumDays = -1;
/* Get number of clicks (row[2]) */
if (sscanf (row[2],"%ld",&UsrFigures->NumClicks) != 1)
UsrFigures->NumClicks = -1L;
/* Get number of file views (row[3]) */
if (sscanf (row[3],"%ld",&UsrFigures->NumFileViews) != 1)
UsrFigures->NumFileViews = -1L;
/* Get number of forum posts (row[4]) */
if (sscanf (row[4],"%ld",&UsrFigures->NumForPst) != 1)
UsrFigures->NumForPst = -1L;
/* Get number of messages sent (row[5]) */
if (sscanf (row[5],"%ld",&UsrFigures->NumMsgSnt) != 1)
UsrFigures->NumMsgSnt = -1L;
}
else
/***** Return special user's figures indicating "not present" *****/
Prf_ResetUsrFigures (UsrFigures);
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
/********** Get ranking of a user according to the number of clicks **********/
/*****************************************************************************/
2015-03-17 01:03:22 +01:00
static unsigned long Prf_GetRankingFigure (long UsrCod,const char *FieldName)
2015-03-14 17:39:04 +01:00
{
2015-03-17 02:01:30 +01:00
char Query[256];
2015-03-14 17:39:04 +01:00
2015-03-17 01:03:22 +01:00
/***** Select number of rows with figure
greater than the figure of this user *****/
2015-03-14 17:39:04 +01:00
sprintf (Query,"SELECT COUNT(*)+1 FROM usr_figures"
" WHERE UsrCod<>'%ld'" // Really not necessary here
2015-03-17 01:03:22 +01:00
" AND %s>"
"(SELECT %s FROM usr_figures WHERE UsrCod='%ld')",
UsrCod,FieldName,FieldName,UsrCod);
return DB_QueryCOUNT (Query,"can not get ranking using a figure");
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
2015-03-17 01:03:22 +01:00
/********************* Get number of users with a figure *********************/
2015-03-14 17:39:04 +01:00
/*****************************************************************************/
2015-03-17 01:03:22 +01:00
static unsigned long Prf_GetNumUsrsWithFigure (const char *FieldName)
2015-03-14 17:39:04 +01:00
{
char Query[128];
/***** Select number of rows with values already calculated *****/
2015-03-17 01:03:22 +01:00
sprintf (Query,"SELECT COUNT(*) FROM usr_figures WHERE %s>='0'",
FieldName);
return DB_QueryCOUNT (Query,"can not get number of users with a figure");
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/****** Get ranking of a user according to the number of clicks per day ******/
/*****************************************************************************/
static unsigned long Prf_GetRankingNumClicksPerDay (long UsrCod)
{
char Query[512];
/***** Select number of rows with number of clicks per day
greater than the clicks per day of this user *****/
sprintf (Query,"SELECT COUNT(*)+1 FROM"
" (SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1)"
" AS NumClicksPerDay"
" FROM usr_figures"
" WHERE UsrCod<>'%ld'" // Necessary because the following comparison is not exact in floating point
2015-11-11 03:00:22 +01:00
" AND NumClicks>='0' AND FirstClickTime>FROM_UNIXTIME('0'))"
2015-03-14 17:39:04 +01:00
" AS TableNumClicksPerDay"
" WHERE NumClicksPerDay>"
"(SELECT NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1)"
" FROM usr_figures"
" WHERE UsrCod='%ld'"
2015-11-11 03:00:22 +01:00
" AND NumClicks>='0' AND FirstClickTime>FROM_UNIXTIME('0'))",
2015-03-14 17:39:04 +01:00
UsrCod,UsrCod);
return DB_QueryCOUNT (Query,"can not get ranking using number of clicks per day");
}
/*****************************************************************************/
/************** Get number of users with number of clicks per day ************/
/*****************************************************************************/
static unsigned long Prf_GetNumUsrsWithNumClicksPerDay (void)
{
char Query[128];
/***** Select number of rows with values already calculated *****/
sprintf (Query,"SELECT COUNT(*) FROM usr_figures"
2015-11-11 03:00:22 +01:00
" WHERE NumClicks>='0' AND FirstClickTime>FROM_UNIXTIME('0')");
2015-03-14 17:39:04 +01:00
return DB_QueryCOUNT (Query,"can not get number of users with number of clicks per day");
}
2015-03-17 00:54:03 +01:00
/*****************************************************************************/
/************************* Show position in ranking **************************/
/*****************************************************************************/
static void Prf_ShowRanking (unsigned long Rank,unsigned long NumUsrs)
{
2015-07-28 00:16:09 +02:00
extern const char *The_ClassForm[The_NUM_THEMES];
2015-03-17 00:54:03 +01:00
extern const char *Txt_of_PART_OF_A_TOTAL;
2015-03-18 20:34:00 +01:00
/***** Part of a total and end container *****/
sprintf (Gbl.Title,"#%lu %s %lu",
Rank,Txt_of_PART_OF_A_TOTAL,NumUsrs);
2015-03-17 00:54:03 +01:00
/***** Rank in form to go to ranking *****/
Act_FormStart (ActSeeUseGbl);
Sco_PutParamScope (Sco_SCOPE_SYS);
2015-10-19 21:49:45 +02:00
Par_PutHiddenParamUnsigned ("FigureType",(unsigned) Sta_USERS_RANKING);
2015-07-28 00:16:09 +02:00
Act_LinkFormSubmit (Gbl.Title,The_ClassForm[Gbl.Prefs.Theme]);
2015-03-17 02:01:30 +01:00
fprintf (Gbl.F.Out,"#%lu</a>",Rank);
2015-03-17 00:54:03 +01:00
Act_FormEnd ();
}
2015-03-14 17:39:04 +01:00
/*****************************************************************************/
/********* Calculate first click time and show user's profile again **********/
/*****************************************************************************/
void Prf_CalculateFirstClickTime (void)
{
/***** Get user's code *****/
Usr_GetParamOtherUsrCodEncrypted ();
/***** Get first click time from log and store as user's figure *****/
Prf_GetFirstClickFromLogAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Show user's profile again *****/
2015-03-18 02:11:23 +01:00
Prf_GetUsrDatAndShowUserProfile ();
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/*** Get first click of a user from log table and store in user's figures ****/
/*****************************************************************************/
static void Prf_GetFirstClickFromLogAndStoreAsUsrFigure (long UsrCod)
{
char Query[256];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
struct UsrFigures UsrFigures;
if (Usr_ChkIfUsrCodExists (UsrCod))
{
/***** Reset user's figures *****/
Prf_ResetUsrFigures (&UsrFigures);
/***** Get first click from log table *****/
2015-10-26 14:35:50 +01:00
sprintf (Query,"SELECT UNIX_TIMESTAMP("
2015-10-16 02:24:29 +02:00
"(SELECT MIN(ClickTime) FROM log_full WHERE UsrCod='%ld')"
2015-10-26 14:35:50 +01:00
")",
2015-03-14 17:39:04 +01:00
UsrCod);
if (DB_QuerySELECT (Query,&mysql_res,"can not get user's first click"))
{
/* Get first click */
row = mysql_fetch_row (mysql_res);
2015-10-26 14:35:50 +01:00
/* Get first click (row[0] holds the start date-time UTC) */
2015-03-14 17:39:04 +01:00
if (row[0]) // It is NULL when user never logged
2015-10-26 14:35:50 +01:00
UsrFigures.FirstClickTimeUTC = Dat_GetUNIXTimeFromStr (row[0]);
2015-03-14 17:39:04 +01:00
}
/* Free structure that stores the query result */
DB_FreeMySQLResult (&mysql_res);
/***** Update first click time in user's figures *****/
if (Prf_CheckIfUsrFiguresExists (UsrCod))
{
2015-10-26 14:35:50 +01:00
sprintf (Query,"UPDATE usr_figures SET FirstClickTime=FROM_UNIXTIME('%ld')"
2015-03-14 17:39:04 +01:00
" WHERE UsrCod='%ld'",
2015-10-26 14:35:50 +01:00
(long) UsrFigures.FirstClickTimeUTC,UsrCod);
2015-03-14 17:39:04 +01:00
DB_QueryUPDATE (Query,"can not update user's figures");
}
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures);
}
}
/*****************************************************************************/
/********* Calculate number of clicks and show user's profile again **********/
/*****************************************************************************/
void Prf_CalculateNumClicks (void)
{
/***** Get user's code *****/
Usr_GetParamOtherUsrCodEncrypted ();
/***** Get number of clicks and store as user's figure *****/
Prf_GetNumClicksAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Show user's profile again *****/
2015-03-18 02:11:23 +01:00
Prf_GetUsrDatAndShowUserProfile ();
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/* Get number of clicks of a user from log table and store in user's figures */
/*****************************************************************************/
static void Prf_GetNumClicksAndStoreAsUsrFigure (long UsrCod)
{
char Query[256];
struct UsrFigures UsrFigures;
if (Usr_ChkIfUsrCodExists (UsrCod))
{
/***** Reset user's figures *****/
Prf_ResetUsrFigures (&UsrFigures);
/***** Get number of clicks from database *****/
2015-10-16 02:24:29 +02:00
sprintf (Query,"SELECT COUNT(*) FROM log_full WHERE UsrCod='%ld'",
2015-03-14 17:39:04 +01:00
UsrCod);
UsrFigures.NumClicks = (long) DB_QueryCOUNT (Query,"can not get number of clicks");
/***** Update number of clicks in user's figures *****/
if (Prf_CheckIfUsrFiguresExists (UsrCod))
{
sprintf (Query,"UPDATE usr_figures SET NumClicks='%ld'"
" WHERE UsrCod='%ld'",
UsrFigures.NumClicks,UsrCod);
DB_QueryUPDATE (Query,"can not update user's figures");
}
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures);
}
}
/*****************************************************************************/
/******* Calculate number of file views and show user's profile again *******/
/*****************************************************************************/
void Prf_CalculateNumFileViews (void)
{
/***** Get user's code *****/
Usr_GetParamOtherUsrCodEncrypted ();
/***** Get number of file views and store as user's figure *****/
Prf_GetNumFileViewsAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Show user's profile again *****/
2015-03-18 02:11:23 +01:00
Prf_GetUsrDatAndShowUserProfile ();
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/**** Get number of file views sent by a user and store in user's figures ****/
/*****************************************************************************/
static void Prf_GetNumFileViewsAndStoreAsUsrFigure (long UsrCod)
{
char Query[256];
struct UsrFigures UsrFigures;
if (Usr_ChkIfUsrCodExists (UsrCod))
{
/***** Reset user's figures *****/
Prf_ResetUsrFigures (&UsrFigures);
/***** Get number of file views from database *****/
UsrFigures.NumFileViews = Brw_GetNumFileViewsUsr (UsrCod);
/***** Update number of file views in user's figures *****/
if (Prf_CheckIfUsrFiguresExists (UsrCod))
{
sprintf (Query,"UPDATE usr_figures SET NumFileViews='%ld'"
" WHERE UsrCod='%ld'",
UsrFigures.NumFileViews,UsrCod);
DB_QueryUPDATE (Query,"can not update user's figures");
}
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures);
}
}
/*****************************************************************************/
/******* Calculate number of forum posts and show user's profile again *******/
/*****************************************************************************/
void Prf_CalculateNumForPst (void)
{
/***** Get user's code *****/
Usr_GetParamOtherUsrCodEncrypted ();
/***** Get number of forum posts and store as user's figure *****/
Prf_GetNumForPstAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Show user's profile again *****/
2015-03-18 02:11:23 +01:00
Prf_GetUsrDatAndShowUserProfile ();
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/**** Get number of forum posts sent by a user and store in user's figures ***/
/*****************************************************************************/
static void Prf_GetNumForPstAndStoreAsUsrFigure (long UsrCod)
{
char Query[256];
struct UsrFigures UsrFigures;
if (Usr_ChkIfUsrCodExists (UsrCod))
{
/***** Reset user's figures *****/
Prf_ResetUsrFigures (&UsrFigures);
/***** Get number of forum posts from database *****/
UsrFigures.NumForPst = For_GetNumPostsUsr (UsrCod);
/***** Update number of forum posts in user's figures *****/
if (Prf_CheckIfUsrFiguresExists (UsrCod))
{
sprintf (Query,"UPDATE usr_figures SET NumForPst='%ld'"
" WHERE UsrCod='%ld'",
UsrFigures.NumForPst,UsrCod);
DB_QueryUPDATE (Query,"can not update user's figures");
}
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures);
}
}
/*****************************************************************************/
/****** Calculate number of messages sent and show user's profile again ******/
/*****************************************************************************/
void Prf_CalculateNumMsgSnt (void)
{
/***** Get user's code *****/
Usr_GetParamOtherUsrCodEncrypted ();
/***** Get number of messages sent and store as user's figure *****/
Prf_GetNumMsgSntAndStoreAsUsrFigure (Gbl.Usrs.Other.UsrDat.UsrCod);
/***** Show user's profile again *****/
2015-03-18 02:11:23 +01:00
Prf_GetUsrDatAndShowUserProfile ();
2015-03-14 17:39:04 +01:00
}
/*****************************************************************************/
/***** Get number of messages sent by a user and store in user's figures *****/
/*****************************************************************************/
static void Prf_GetNumMsgSntAndStoreAsUsrFigure (long UsrCod)
{
char Query[256];
struct UsrFigures UsrFigures;
if (Usr_ChkIfUsrCodExists (UsrCod))
{
/***** Reset user's figures *****/
Prf_ResetUsrFigures (&UsrFigures);
/***** Get number of messages sent from database *****/
UsrFigures.NumMsgSnt = Msg_GetNumMsgsSentByUsr (UsrCod);
/***** Update number of messages sent in user's figures *****/
if (Prf_CheckIfUsrFiguresExists (UsrCod))
{
sprintf (Query,"UPDATE usr_figures SET NumMsgSnt='%ld'"
" WHERE UsrCod='%ld'",
UsrFigures.NumMsgSnt,UsrCod);
DB_QueryUPDATE (Query,"can not update user's figures");
}
else // User entry does not exist
Prf_CreateUsrFigures (UsrCod,&UsrFigures);
}
}
2015-03-28 18:34:08 +01:00
/*****************************************************************************/
/******************* Create user's figures for a new user ********************/
/*****************************************************************************/
void Prf_CreateNewUsrFigures (long UsrCod)
{
struct UsrFigures UsrFigures;
/***** Reset user's figures *****/
Prf_ResetUsrFigures (&UsrFigures);
/***** Create user's figures *****/
Prf_CreateUsrFigures (UsrCod,&UsrFigures);
}
2015-03-14 17:39:04 +01:00
/*****************************************************************************/
/********************** Reset values of user's figures ***********************/
/*****************************************************************************/
static void Prf_ResetUsrFigures (struct UsrFigures *UsrFigures)
{
2015-10-26 14:35:50 +01:00
UsrFigures->FirstClickTimeUTC = (time_t) 0; // unknown first click time or user never logged
2015-03-14 17:39:04 +01:00
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)
{
2015-03-28 18:34:08 +01:00
char Query[512];
2015-03-14 17:39:04 +01:00
/***** Create user's figures *****/
2015-03-24 10:11:17 +01:00
sprintf (Query,"INSERT INTO usr_figures"
2015-11-03 13:11:06 +01:00
"(UsrCod,FirstClickTime,NumClicks,NumFileViews,NumForPst,NumMsgSnt)"
" VALUES ('%ld',FROM_UNIXTIME('%ld'),'%ld','%ld','%ld','%ld')",
2015-03-14 17:39:04 +01:00
UsrCod,
2015-10-26 14:35:50 +01:00
(long) UsrFigures->FirstClickTimeUTC, // 0 ==> unknown first click time or user never logged
2015-03-14 17:39:04 +01:00
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");
}
/*****************************************************************************/
/**************************** Remove user's figures **************************/
/*****************************************************************************/
void Prf_RemoveUsrFigures (long UsrCod)
{
char Query[128];
/***** Remove user's figures *****/
sprintf (Query,"DELETE FROM usr_figures WHERE UsrCod='%ld'",
UsrCod);
DB_QueryDELETE (Query,"can not delete user's figures");
}
/*****************************************************************************/
/*** Check if it exists an entry for this user in table of user's figures ****/
/*****************************************************************************/
static bool Prf_CheckIfUsrFiguresExists (long UsrCod)
{
char Query[128];
sprintf (Query,"SELECT COUNT(*) FROM usr_figures WHERE UsrCod='%ld'",
UsrCod);
return (DB_QueryCOUNT (Query,"can not get user's first click") != 0);
}
/*****************************************************************************/
/*************** Increment number of clicks made by a user *******************/
/*****************************************************************************/
void Prf_IncrementNumClicksUsr (long UsrCod)
{
char Query[256];
/***** Increment number of clicks *****/
// If NumClicks < 0 ==> not yet calculated, so do nothing
sprintf (Query,"UPDATE IGNORE usr_figures SET NumClicks=NumClicks+1"
" WHERE UsrCod='%ld' AND NumClicks>=0",
UsrCod);
DB_QueryINSERT (Query,"can not increment user's clicks");
}
/*****************************************************************************/
/************** Increment number of file views sent by a user ****************/
/*****************************************************************************/
void Prf_IncrementNumFileViewsUsr (long UsrCod)
{
char Query[256];
/***** Increment number of file views *****/
// If NumFileViews < 0 ==> not yet calculated, so do nothing
sprintf (Query,"UPDATE IGNORE usr_figures SET NumFileViews=NumFileViews+1"
" WHERE UsrCod='%ld' AND NumFileViews>=0",
UsrCod);
DB_QueryINSERT (Query,"can not increment user's file views");
}
/*****************************************************************************/
/************* Increment number of forum posts sent by a user ****************/
/*****************************************************************************/
void Prf_IncrementNumForPstUsr (long UsrCod)
{
char Query[256];
/***** Increment number of forum posts *****/
// If NumForPst < 0 ==> not yet calculated, so do nothing
sprintf (Query,"UPDATE IGNORE usr_figures SET NumForPst=NumForPst+1"
" WHERE UsrCod='%ld' AND NumForPst>=0",
UsrCod);
DB_QueryINSERT (Query,"can not increment user's forum posts");
}
/*****************************************************************************/
/*************** Increment number of messages sent by a user *****************/
/*****************************************************************************/
void Prf_IncrementNumMsgSntUsr (long UsrCod)
{
char Query[256];
/***** Increment number of messages sent *****/
// If NumMsgSnt < 0 ==> not yet calculated, so do nothing
sprintf (Query,"UPDATE IGNORE usr_figures SET NumMsgSnt=NumMsgSnt+1"
" WHERE UsrCod='%ld' AND NumMsgSnt>=0",
UsrCod);
DB_QueryINSERT (Query,"can not increment user's messages sent");
}
2015-03-16 14:05:16 +01:00
/*****************************************************************************/
/******** Get and show ranking of users attending to number of clicks ********/
/*****************************************************************************/
void Prf_GetAndShowRankingClicks (void)
{
2015-03-16 17:46:32 +01:00
Prf_GetAndShowRankingFigure ("NumClicks");
}
void Prf_GetAndShowRankingFileViews (void)
{
Prf_GetAndShowRankingFigure ("NumFileViews");
}
void Prf_GetAndShowRankingForPst (void)
{
Prf_GetAndShowRankingFigure ("NumForPst");
}
void Prf_GetAndShowRankingMsgSnt (void)
{
Prf_GetAndShowRankingFigure ("NumMsgSnt");
}
static void Prf_GetAndShowRankingFigure (const char *FieldName)
{
2015-03-29 01:06:00 +01:00
char Query[1024];
2015-03-16 14:05:16 +01:00
/***** Get ranking from database *****/
switch (Gbl.Scope.Current)
{
case Sco_SCOPE_SYS:
2015-03-16 17:46:32 +01:00
sprintf (Query,"SELECT UsrCod,%s"
2015-03-16 14:05:16 +01:00
" FROM usr_figures"
2015-03-16 17:46:32 +01:00
" WHERE %s>='0'"
2015-03-29 01:06:00 +01:00
" AND UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY %s DESC,UsrCod LIMIT 100",
2015-03-16 17:46:32 +01:00
FieldName,
FieldName,FieldName);
2015-03-16 14:05:16 +01:00
break;
case Sco_SCOPE_CTY:
2015-03-16 17:46:32 +01:00
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.%s"
2015-03-16 14:05:16 +01:00
" FROM institutions,centres,degrees,courses,crs_usr,usr_figures"
" WHERE institutions.CtyCod='%ld'"
" AND institutions.InsCod=centres.InsCod"
" AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
2015-03-16 17:46:32 +01:00
" AND usr_figures.%s>='0'"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY usr_figures.%s DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 17:46:32 +01:00
FieldName,
Gbl.CurrentCty.Cty.CtyCod,
FieldName,FieldName);
2015-03-16 14:05:16 +01:00
break;
case Sco_SCOPE_INS:
2015-03-16 17:46:32 +01:00
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.%s"
2015-03-16 14:05:16 +01:00
" FROM centres,degrees,courses,crs_usr,usr_figures"
" WHERE centres.InsCod='%ld'"
" AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
2015-03-16 17:46:32 +01:00
" AND usr_figures.%s>='0'"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY usr_figures.%s DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 17:46:32 +01:00
FieldName,
Gbl.CurrentIns.Ins.InsCod,
FieldName,FieldName);
2015-03-16 14:05:16 +01:00
break;
case Sco_SCOPE_CTR:
2015-03-16 17:46:32 +01:00
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.%s"
2015-03-16 14:05:16 +01:00
" FROM degrees,courses,crs_usr,usr_figures"
" WHERE degrees.CtrCod='%ld'"
" AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
2015-03-16 17:46:32 +01:00
" AND usr_figures.%s>='0'"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY usr_figures.%s DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 17:46:32 +01:00
FieldName,
Gbl.CurrentCtr.Ctr.CtrCod,
FieldName,FieldName);
2015-03-16 14:05:16 +01:00
break;
case Sco_SCOPE_DEG:
2015-03-16 17:46:32 +01:00
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.%s"
2015-03-16 14:05:16 +01:00
" FROM courses,crs_usr,usr_figures"
" WHERE courses.DegCod='%ld'"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
2015-03-16 17:46:32 +01:00
" AND usr_figures.%s>='0'"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY usr_figures.%s DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 17:46:32 +01:00
FieldName,
Gbl.CurrentDeg.Deg.DegCod,
FieldName,FieldName);
2015-03-16 14:05:16 +01:00
break;
case Sco_SCOPE_CRS:
2015-03-16 17:46:32 +01:00
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,usr_figures.%s"
2015-03-16 14:05:16 +01:00
" FROM crs_usr,usr_figures"
" WHERE crs_usr.CrsCod='%ld'"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
2015-03-16 17:46:32 +01:00
" AND usr_figures.%s>='0'"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY usr_figures.%s DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 17:46:32 +01:00
FieldName,
Gbl.CurrentCrs.Crs.CrsCod,
FieldName,FieldName);
2015-03-16 14:05:16 +01:00
break;
default:
Lay_ShowErrorAndExit ("Wrong scope.");
break;
}
2015-03-23 10:35:15 +01:00
Prf_ShowRankingFigure (Query);
}
void Prf_ShowRankingFigure (const char *Query)
{
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumUsrs;
unsigned NumUsr;
unsigned Rank;
struct UsrData UsrDat;
long FigureHigh = LONG_MAX;
long Figure;
2015-03-16 14:05:16 +01:00
NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get ranking");
if (NumUsrs)
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
fprintf (Gbl.F.Out,"<table>");
2015-03-17 14:51:58 +01:00
for (NumUsr = 1, Rank = 1, Gbl.RowEvenOdd = 0;
2015-03-17 02:40:35 +01:00
NumUsr <= NumUsrs;
2015-03-17 14:51:58 +01:00
NumUsr++, Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd)
2015-03-16 14:05:16 +01:00
{
/***** Get user and number of clicks *****/
row = mysql_fetch_row (mysql_res);
/* Get user's code (row[0]) */
UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
Usr_GetAllUsrDataFromUsrCod (&UsrDat);
2015-03-16 17:46:32 +01:00
/* Get figure (row[1]) */
if (sscanf (row[1],"%ld",&Figure) != 1)
Lay_ShowErrorAndExit ("Error reading user's figure.");
if (Figure < FigureHigh)
{
2015-03-17 02:40:35 +01:00
Rank = NumUsr;
2015-03-16 17:46:32 +01:00
FigureHigh = Figure;
}
2015-03-16 14:05:16 +01:00
/***** Show row *****/
2015-03-17 14:51:58 +01:00
fprintf (Gbl.F.Out,"<tr>");
Prf_ShowUsrInRanking (&UsrDat,Rank);
2015-09-03 17:14:30 +02:00
fprintf (Gbl.F.Out,"<td class=\"RIGHT_MIDDLE COLOR%u\""
2015-09-28 18:28:29 +02:00
" style=\"height:50px;\">"
2015-09-03 17:14:30 +02:00
"%ld"
"</td>"
2015-03-16 20:26:39 +01:00
"</tr>",
2015-09-03 17:14:30 +02:00
Gbl.RowEvenOdd,
Figure);
2015-03-16 14:05:16 +01:00
}
fprintf (Gbl.F.Out,"</table>");
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
/**** Get and show ranking of users attending to number of clicks per day ****/
/*****************************************************************************/
void Prf_GetAndShowRankingClicksPerDay (void)
{
2015-03-29 01:06:00 +01:00
char Query[1024];
2015-03-16 14:05:16 +01:00
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumUsrs;
unsigned NumUsr;
2015-03-16 17:46:32 +01:00
unsigned Rank;
2015-03-16 14:05:16 +01:00
struct UsrData UsrDat;
2015-03-16 17:46:32 +01:00
float NumClicksPerDayHigh = (float) LONG_MAX;
2015-03-16 14:05:16 +01:00
float NumClicksPerDay;
/***** Get ranking from database *****/
switch (Gbl.Scope.Current)
{
case Sco_SCOPE_SYS:
sprintf (Query,"SELECT UsrCod,"
"NumClicks/(DATEDIFF(NOW(),FirstClickTime)+1) AS NumClicksPerDay"
" FROM usr_figures"
" WHERE FirstClickTime>0"
2015-03-29 01:06:00 +01:00
" AND UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY NumClicksPerDay DESC,UsrCod LIMIT 100");
2015-03-16 14:05:16 +01:00
break;
case Sco_SCOPE_CTY:
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
"usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
" FROM institutions,centres,degrees,courses,crs_usr,usr_figures"
" WHERE institutions.CtyCod='%ld'"
" AND institutions.InsCod=centres.InsCod"
" AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
" AND usr_figures.FirstClickTime>0"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY NumClicksPerDay DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 14:05:16 +01:00
Gbl.CurrentCty.Cty.CtyCod);
break;
case Sco_SCOPE_INS:
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
"usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
" FROM centres,degrees,courses,crs_usr,usr_figures"
" WHERE centres.InsCod='%ld'"
" AND centres.CtrCod=degrees.CtrCod"
" AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
" AND usr_figures.FirstClickTime>0"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY NumClicksPerDay DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 14:05:16 +01:00
Gbl.CurrentIns.Ins.InsCod);
break;
case Sco_SCOPE_CTR:
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
"usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
" FROM degrees,courses,crs_usr,usr_figures"
" WHERE degrees.CtrCod='%ld'"
" AND degrees.DegCod=courses.DegCod"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
2015-03-16 20:26:39 +01:00
" AND usr_figures.FirstClickTime>0"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY NumClicksPerDay DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 14:05:16 +01:00
Gbl.CurrentCtr.Ctr.CtrCod);
break;
case Sco_SCOPE_DEG:
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
"usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
" FROM courses,crs_usr,usr_figures"
" WHERE courses.DegCod='%ld'"
" AND courses.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
" AND usr_figures.FirstClickTime>0"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY NumClicksPerDay DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 14:05:16 +01:00
Gbl.CurrentDeg.Deg.DegCod);
break;
case Sco_SCOPE_CRS:
sprintf (Query,"SELECT DISTINCTROW usr_figures.UsrCod,"
"usr_figures.NumClicks/(DATEDIFF(NOW(),usr_figures.FirstClickTime)+1) AS NumClicksPerDay"
" FROM crs_usr,usr_figures"
" WHERE crs_usr.CrsCod='%ld'"
" AND crs_usr.UsrCod=usr_figures.UsrCod"
" AND usr_figures.FirstClickTime>0"
2015-03-29 01:06:00 +01:00
" AND usr_figures.UsrCod NOT IN (SELECT UsrCod FROM usr_banned)"
2015-03-16 17:51:47 +01:00
" ORDER BY NumClicksPerDay DESC,usr_figures.UsrCod LIMIT 100",
2015-03-16 14:05:16 +01:00
Gbl.CurrentCrs.Crs.CrsCod);
break;
default:
Lay_ShowErrorAndExit ("Wrong scope.");
break;
}
NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get ranking");
if (NumUsrs)
{
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
fprintf (Gbl.F.Out,"<table>");
2015-03-17 14:51:58 +01:00
for (NumUsr = 1, Rank = 1, Gbl.RowEvenOdd = 0;
2015-03-17 02:40:35 +01:00
NumUsr <= NumUsrs;
2015-03-17 14:51:58 +01:00
NumUsr++, Gbl.RowEvenOdd = 1 - Gbl.RowEvenOdd)
2015-03-16 14:05:16 +01:00
{
/***** Get user and number of clicks *****/
row = mysql_fetch_row (mysql_res);
/* Get user's code (row[0]) */
UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
Usr_GetAllUsrDataFromUsrCod (&UsrDat);
/* Get number of clicks per day (row[1]) */
NumClicksPerDay = Str_GetFloatNumFromStr (row[1]);
2015-03-16 17:46:32 +01:00
if (NumClicksPerDay < NumClicksPerDayHigh)
{
2015-03-17 02:40:35 +01:00
Rank = NumUsr;
2015-03-16 17:46:32 +01:00
NumClicksPerDayHigh = NumClicksPerDay;
}
2015-03-16 14:05:16 +01:00
/***** Show row *****/
2015-03-17 14:51:58 +01:00
fprintf (Gbl.F.Out,"<tr>");
Prf_ShowUsrInRanking (&UsrDat,Rank);
2015-09-03 17:14:30 +02:00
fprintf (Gbl.F.Out,"<td class=\"RIGHT_MIDDLE COLOR%u\""
2015-09-28 18:28:29 +02:00
" style=\"height:50px;\">",
2015-09-03 17:14:30 +02:00
Gbl.RowEvenOdd);
2015-03-16 20:26:39 +01:00
Str_WriteFloatNum (NumClicksPerDay);
fprintf (Gbl.F.Out,"</td>"
"</tr>");
2015-03-16 14:05:16 +01:00
}
fprintf (Gbl.F.Out,"</table>");
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
2015-03-16 17:46:32 +01:00
/*****************************************************************************/
/************** Show user's photo and nickname in ranking list ***************/
/*****************************************************************************/
2015-03-23 10:35:15 +01:00
void Prf_ShowUsrInRanking (const struct UsrData *UsrDat,unsigned Rank)
2015-03-16 17:46:32 +01:00
{
extern const char *Txt_View_public_profile;
bool ShowPhoto;
char PhotoURL[PATH_MAX+1];
2015-03-17 14:51:58 +01:00
bool Visible = Pri_ShowIsAllowed (UsrDat->ProfileVisibility,UsrDat->UsrCod);
2015-09-03 17:14:30 +02:00
fprintf (Gbl.F.Out,"<td class=\"RANK RIGHT_MIDDLE COLOR%u\""
2015-09-28 18:28:29 +02:00
" style=\"height:50px;\">"
2015-03-17 14:51:58 +01:00
"#%u"
"</td>"
2015-09-03 17:14:30 +02:00
"<td class=\"COLOR%u\""
2015-09-28 18:28:29 +02:00
" style=\"width:35px; height:50px;\">",
2015-09-03 17:14:30 +02:00
Gbl.RowEvenOdd,
2015-03-17 14:51:58 +01:00
Rank,
2015-09-03 17:14:30 +02:00
Gbl.RowEvenOdd);
2015-03-16 17:46:32 +01:00
2015-03-16 20:26:39 +01:00
/***** Check if I can see the public profile *****/
2015-03-17 14:51:58 +01:00
if (Visible)
2015-03-16 20:26:39 +01:00
{
/***** User's photo *****/
ShowPhoto = Pho_ShowUsrPhotoIsAllowed (UsrDat,PhotoURL);
Pho_ShowUsrPhoto (UsrDat,ShowPhoto ? PhotoURL :
NULL,
2015-12-13 12:51:41 +01:00
"PHOTO30x40",Pho_ZOOM);
2015-03-17 14:51:58 +01:00
}
2015-03-16 20:26:39 +01:00
2015-03-17 14:51:58 +01:00
fprintf (Gbl.F.Out,"</td>"
2015-09-28 18:28:29 +02:00
"<td class=\"COLOR%u\" style=\"height:50px;\">",
2015-09-03 17:14:30 +02:00
Gbl.RowEvenOdd);
2015-03-17 14:51:58 +01:00
/***** Put form to go to public profile *****/
2015-03-25 16:25:50 +01:00
if (Visible)
2015-03-17 14:51:58 +01:00
{
Act_FormStart (ActSeePubPrf);
2015-04-02 18:39:49 +02:00
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
2015-03-17 14:51:58 +01:00
Act_LinkFormSubmit (Txt_View_public_profile,"DAT_SMALL");
Usr_RestrictLengthAndWriteName (UsrDat,8);
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
2015-03-16 20:26:39 +01:00
}
2015-03-17 14:51:58 +01:00
fprintf (Gbl.F.Out,"</td>");
2015-03-16 17:46:32 +01:00
}