From 1d8eaf3cc7bc47fd07e415ec11051dad96994ed8 Mon Sep 17 00:00:00 2001 From: acanas Date: Thu, 11 Feb 2021 17:45:33 +0100 Subject: [PATCH] Version20.29 --- swad_timeline_notification.c | 246 +++++++++++++++++++++++++++++++++++ swad_timeline_notification.h | 56 ++++++++ 2 files changed, 302 insertions(+) create mode 100644 swad_timeline_notification.c create mode 100644 swad_timeline_notification.h diff --git a/swad_timeline_notification.c b/swad_timeline_notification.c new file mode 100644 index 000000000..5440d6ea5 --- /dev/null +++ b/swad_timeline_notification.c @@ -0,0 +1,246 @@ +// swad_timeline_notification.c: social timeline notifications + +/* + 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. + Copyright (C) 1999-2021 Antonio Caņas Vargas + + 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 . +*/ +/*****************************************************************************/ +/*********************************** Headers *********************************/ +/*****************************************************************************/ + +#include // For boolean type +// #include // For malloc and free +#include // For string functions + +#include "swad_database.h" +#include "swad_global.h" +// #include "swad_profile.h" +#include "swad_timeline.h" +// #include "swad_timeline_favourite.h" +#include "swad_timeline_note.h" +#include "swad_timeline_notification.h" +#include "swad_timeline_post.h" +#include "swad_timeline_publication.h" +// #include "swad_timeline_share.h" + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/************************* Private constants and types ***********************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/************** External global variables from others modules ****************/ +/*****************************************************************************/ + +extern struct Globals Gbl; + +/*****************************************************************************/ +/************************* Private global variables **************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/***************************** Private prototypes ****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/*********** Create a notification for the author of a post/comment **********/ +/*****************************************************************************/ + +void TL_Ntf_CreateNotifToAuthor (long AuthorCod,long PubCod, + Ntf_NotifyEvent_t NotifyEvent) + { + struct UsrData UsrDat; + bool CreateNotif; + bool NotifyByEmail; + + /***** Initialize structure with user's data *****/ + Usr_UsrDataConstructor (&UsrDat); + + UsrDat.UsrCod = AuthorCod; + if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat,Usr_DONT_GET_PREFS)) + { + /***** This fav must be notified by email? *****/ + CreateNotif = (UsrDat.NtfEvents.CreateNotif & (1 << NotifyEvent)); + NotifyByEmail = CreateNotif && + (UsrDat.NtfEvents.SendEmail & (1 << NotifyEvent)); + + /***** Create notification for the author of the post. + If this author wants to receive notifications by email, + activate the sending of a notification *****/ + if (CreateNotif) + Ntf_StoreNotifyEventToOneUser (NotifyEvent,&UsrDat,PubCod, + (Ntf_Status_t) (NotifyByEmail ? Ntf_STATUS_BIT_EMAIL : + 0), + Gbl.Hierarchy.Ins.InsCod, + Gbl.Hierarchy.Ctr.CtrCod, + Gbl.Hierarchy.Deg.DegCod, + Gbl.Hierarchy.Crs.CrsCod); + } + + /***** Free memory used for user's data *****/ + Usr_UsrDataDestructor (&UsrDat); + } + +/*****************************************************************************/ +/***************** Get notification of a new publication *********************/ +/*****************************************************************************/ + +void TL_Ntf_GetNotifPublication (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], + char **ContentStr, + long PubCod,bool GetContent) + { + MYSQL_RES *mysql_res; + MYSQL_ROW row; + struct TL_Pub_Publication Pub; + struct TL_Not_Note Not; + struct TL_Pst_PostContent Content; + size_t Length; + bool ContentCopied = false; + + /***** Return nothing on error *****/ + Pub.PubType = TL_PUB_UNKNOWN; + SummaryStr[0] = '\0'; // Return nothing on error + Content.Txt[0] = '\0'; + + /***** Get summary and content from post from database *****/ + if (DB_QuerySELECT (&mysql_res,"can not get data of publication", + "SELECT PubCod," // row[0] + "NotCod," // row[1] + "PublisherCod," // row[2] + "PubType" // row[3] + " FROM tl_pubs WHERE PubCod=%ld", + PubCod) == 1) // Result should have a unique row + /* Get data of publication from row */ + TL_Pub_GetDataOfPublicationFromNextRow (mysql_res,&Pub); + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + /***** Get summary and content *****/ + switch (Pub.PubType) + { + case TL_PUB_UNKNOWN: + break; + case TL_PUB_ORIGINAL_NOTE: + case TL_PUB_SHARED_NOTE: + /* Get data of note */ + Not.NotCod = Pub.NotCod; + TL_Not_GetDataOfNoteByCod (&Not); + + if (Not.NoteType == TL_NOTE_POST) + { + /***** Get content of post from database *****/ + if (DB_QuerySELECT (&mysql_res,"can not get the content of a post", + "SELECT Txt" // row[0] + " FROM tl_posts" + " WHERE PstCod=%ld", + Not.Cod) == 1) // Result should have a unique row + { + /***** Get row *****/ + row = mysql_fetch_row (mysql_res); + + /****** Get content (row[0]) *****/ + Str_Copy (Content.Txt,row[0], + Cns_MAX_BYTES_LONG_TEXT); + } + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + /***** Copy content string *****/ + if (GetContent) + { + Length = strlen (Content.Txt); + if ((*ContentStr = (char *) malloc (Length + 1)) != NULL) + { + Str_Copy (*ContentStr,Content.Txt, + Length); + ContentCopied = true; + } + } + + /***** Copy summary string *****/ + Str_LimitLengthHTMLStr (Content.Txt,Ntf_MAX_CHARS_SUMMARY); + Str_Copy (SummaryStr,Content.Txt, + Ntf_MAX_BYTES_SUMMARY); + } + else + TL_Not_GetNoteSummary (&Not,SummaryStr); + break; + case TL_Pub_COMMENT_TO_NOTE: + /***** Get content of post from database *****/ + if (DB_QuerySELECT (&mysql_res,"can not get the content" + " of a comment to a note", + "SELECT Txt" // row[0] + " FROM tl_comments" + " WHERE PubCod=%ld", + Pub.PubCod) == 1) // Result should have a unique row + { + /***** Get row *****/ + row = mysql_fetch_row (mysql_res); + + /****** Get content (row[0]) *****/ + Str_Copy (Content.Txt,row[0], + Cns_MAX_BYTES_LONG_TEXT); + } + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); + + /***** Copy content string *****/ + if (GetContent) + { + Length = strlen (Content.Txt); + if ((*ContentStr = (char *) malloc (Length + 1)) != NULL) + { + Str_Copy (*ContentStr,Content.Txt, + Length); + ContentCopied = true; + } + } + + /***** Copy summary string *****/ + Str_LimitLengthHTMLStr (Content.Txt,Ntf_MAX_CHARS_SUMMARY); + Str_Copy (SummaryStr,Content.Txt, + Ntf_MAX_BYTES_SUMMARY); + break; + } + + /***** Create empty content string if nothing copied *****/ + if (GetContent && !ContentCopied) + if ((*ContentStr = (char *) malloc (1)) != NULL) + (*ContentStr)[0] = '\0'; + } + +/*****************************************************************************/ +/************ Mark all my notifications about timeline as seen ***************/ +/*****************************************************************************/ +// Must be executed as a priori function + +void TL_Ntf_MarkMyNotifAsSeen (void) + { + Ntf_MarkNotifAsSeen (Ntf_EVENT_TIMELINE_COMMENT,-1L,-1L,Gbl.Usrs.Me.UsrDat.UsrCod); + Ntf_MarkNotifAsSeen (Ntf_EVENT_TIMELINE_FAV ,-1L,-1L,Gbl.Usrs.Me.UsrDat.UsrCod); + Ntf_MarkNotifAsSeen (Ntf_EVENT_TIMELINE_SHARE ,-1L,-1L,Gbl.Usrs.Me.UsrDat.UsrCod); + Ntf_MarkNotifAsSeen (Ntf_EVENT_TIMELINE_MENTION,-1L,-1L,Gbl.Usrs.Me.UsrDat.UsrCod); + } diff --git a/swad_timeline_notification.h b/swad_timeline_notification.h new file mode 100644 index 000000000..a6741ecff --- /dev/null +++ b/swad_timeline_notification.h @@ -0,0 +1,56 @@ +// swad_timeline_notification.h: social timeline notifications + +#ifndef _SWAD_TL_NTF +#define _SWAD_TL_NTF +/* + SWAD (Shared Workspace At a Distance in Spanish), + is a web platform developed at the University of Granada (Spain), + and used to support university teaching. + + This file is part of SWAD core. + Copyright (C) 1999-2021 Antonio Caņas Vargas + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public 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 . +*/ +/*****************************************************************************/ +/********************************** Headers **********************************/ +/*****************************************************************************/ + +// #include "swad_form.h" +// #include "swad_media.h" +#include "swad_notification.h" +// #include "swad_user.h" + +/*****************************************************************************/ +/****************************** Public constants *****************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/******************************** Public types *******************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/****************************** Public prototypes ****************************/ +/*****************************************************************************/ + +void TL_Ntf_CreateNotifToAuthor (long AuthorCod,long PubCod, + Ntf_NotifyEvent_t NotifyEvent); + +void TL_Ntf_GetNotifPublication (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], + char **ContentStr, + long PubCod,bool GetContent); + +void TL_Ntf_MarkMyNotifAsSeen (void); + +#endif