From 4332736ae90c4ea0b93b769679e07ddfad65af45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rytis=20Slatkevi=C4=8Dius?= Date: Sun, 29 Apr 2007 14:22:28 +0000 Subject: [PATCH] Private message functionality for the forums. NOTE: needs database update. svn path=/trunk/boinc/; revision=12499 --- checkin_notes | 25 ++++ db/schema.sql | 12 ++ html/inc/db.inc | 14 ++ html/inc/forum.inc | 45 +++++++ html/inc/forum_user.inc | 12 +- html/inc/user.inc | 2 + html/ops/db_update.php | 17 ++- html/user/forum_forum.php | 14 +- html/user/forum_help_desk.php | 13 +- html/user/forum_index.php | 12 +- html/user/forum_pm.php | 239 ++++++++++++++++++++++++++++++++++ html/user/img/pm.png | Bin 0 -> 224 bytes html/user/white.css | 6 + 13 files changed, 368 insertions(+), 43 deletions(-) create mode 100644 html/user/forum_pm.php create mode 100644 html/user/img/pm.png diff --git a/checkin_notes b/checkin_notes index 0d5232110b..3c329d57be 100755 --- a/checkin_notes +++ b/checkin_notes @@ -4094,3 +4094,28 @@ David 27 Apr 2007 html/ops/ remind.php mass_email_script.php + +Rytis 29 Apr 2007 + - Private message functionality for the forums. + NOTE: needs database update. + + html/ + user/ + forum_forum.php + forum_help_desk.php + forum_index.php + forum_pm.php (new) + white.css + img/ + pm.png (new) + + inc/ + db.inc + forum.inc + forum_user.inc + user.inc + + ops/ + db_update.php + + db/schema.sql diff --git a/db/schema.sql b/db/schema.sql index b04720c937..85f8c7ff9a 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -453,3 +453,15 @@ create table sent_email ( -- 6 = fundraising appeal primary key(userid) ) TYPE=MyISAM; + +create table private_messages ( + id int(10) unsigned not null auto_increment, + userid int(10) unsigned not null, + senderid int(10) unsigned not null, + date int(10) unsigned not null, + opened tinyint(1) unsigned not null default '0', + subject varchar(255) not null, + content text not null, + primary key(id), + key userid (userid) +) TYPE=MyISAM; \ No newline at end of file diff --git a/html/inc/db.inc b/html/inc/db.inc index 24242b7c76..660ac358fd 100644 --- a/html/inc/db.inc +++ b/html/inc/db.inc @@ -61,6 +61,20 @@ function lookup_user_email_addr($email_addr) { return null; } +function lookup_user_name($name) { + $result = mysql_query("SELECT * FROM user WHERE name='".mysql_escape_string($name)."'"); + if ($result) { + if (mysql_num_rows($result) == 1) { + return mysql_fetch_object($result); + } elseif (mysql_num_rows($result) == 0) { + return null; + } else { + return -1; // Non-unique username + } + } + return null; +} + function lookup_host($id) { $result = mysql_query("select * from host where id=$id"); if ($result) { diff --git a/html/inc/forum.inc b/html/inc/forum.inc index cc0cfc1402..ce51d5dd01 100644 --- a/html/inc/forum.inc +++ b/html/inc/forum.inc @@ -393,6 +393,34 @@ function end_forum_table() { * Output the forum/thread title. **/ function show_forum_title($forum=NULL, $thread=NULL) { + start_table_noborder(); + echo "\n"; + + // Search + echo "
+ + + + +
+ advanced search +
+ "; + echo "\n"; + + $logged_in_user = get_logged_in_user(false); + // Custom stuff for logged in user + if ($logged_in_user) { + echo "\n"; + + // Private messages + echo pm_notification($logged_in_user); + + echo "\n"; + } + echo "\n"; + end_table(); + echo "

\n"; if ($forum) { $category = $forum->getCategory(); @@ -543,4 +571,21 @@ function can_reply($thread, $user) { } } +function pm_notification($user) { + $output = ""; + $pm = mysql_query("SELECT COUNT(*) AS unread FROM private_messages WHERE userid=".$user->id." AND opened=0"); + $pm = mysql_fetch_object($pm); + if ($pm->unread > 1) { + $output .= "You have ".$pm->unread." unread private messages. "; + } elseif ($pm->unread == 1) { + $output .= "You have one unread private message. "; + } else { + $output .= "You have no unread private messages. "; + } + + $output .= "| Inbox\n"; + $output .= "| Write\n"; + return $output; +} + ?> diff --git a/html/inc/forum_user.inc b/html/inc/forum_user.inc index 673dbb6e07..6cd335ebe2 100644 --- a/html/inc/forum_user.inc +++ b/html/inc/forum_user.inc @@ -370,17 +370,7 @@ function newUser($id, $optional_dbobj="", $optional_prefobj=""){ * Construct links to the given user **/ function re_user_links($user) { - $x = ''.$user->getName().''; - if ($user->hasProfile()) { - $x .= ' '; - } - # Does this project accept donations? - # If so, do you want to have a link next to user name as it appears on the web site? - if ($user->hasDonated() == 1) { - @require_once("../project/donations.inc"); - $x .= DONATION_LINK; - } - return $x; + return user_links(get_user_from_id($user->getID())); } ?> diff --git a/html/inc/user.inc b/html/inc/user.inc index c61f219334..f1a55df80e 100644 --- a/html/inc/user.inc +++ b/html/inc/user.inc @@ -198,6 +198,8 @@ function show_user_info_private($user) { if ($tot) { row2("Message boards", "id>$tot posts"); } + + row2("Private messages", pm_notification($user)); row1("Teams"); if ($user->teamid) { diff --git a/html/ops/db_update.php b/html/ops/db_update.php index d9dde710d9..ebbaad66fa 100755 --- a/html/ops/db_update.php +++ b/html/ops/db_update.php @@ -365,11 +365,26 @@ function update_4_24_2007() { } +function update_4_29_2007() { + do_query("CREATE TABLE `private_messages` ( + `id` int(10) unsigned NOT NULL auto_increment, + `userid` int(10) unsigned NOT NULL, + `senderid` int(10) unsigned NOT NULL, + `date` int(10) unsigned NOT NULL, + `opened` tinyint(1) unsigned NOT NULL default '0', + `subject` varchar(255) NOT NULL, + `content` text NOT NULL, + PRIMARY KEY (`id`), + KEY `userid` (`userid`) + ) TYPE=MyISAM;" + ); +} + // modify the following to call the function you want. // Make sure you do all needed functions, in order. // (Look at your DB structure using "explain" queries to see // which ones you need). -//update_4_07_2007(); +//update_4_29_2007(); ?> diff --git a/html/user/forum_forum.php b/html/user/forum_forum.php index fbb347d432..8d2d1c8bd8 100644 --- a/html/user/forum_forum.php +++ b/html/user/forum_forum.php @@ -43,22 +43,14 @@ if ($Category->getType()!=0){ // Allow users with a linktab-browser to get some usefull links echo ''; + +show_forum_title($forum, NULL); + echo ' "; echo ' diff --git a/html/user/forum_help_desk.php b/html/user/forum_help_desk.php index e8e44859b7..4cc6782cd1 100644 --- a/html/user/forum_help_desk.php +++ b/html/user/forum_help_desk.php @@ -7,24 +7,17 @@ require_once('../inc/time.inc'); db_init(); +get_logged_in_user(false); + page_head("Questions and answers"); echo "

Talk live via Skype with a volunteer, in any of several languages. Go to BOINC Online Help.

-

- - - - - - - or do advanced search - -

"; +show_forum_title(null, null); start_forum_table(array("Topic", "# Questions", "Last post")); $categories = getHelpDeskCategories(); diff --git a/html/user/forum_index.php b/html/user/forum_index.php index 7916dee606..d2f6088719 100644 --- a/html/user/forum_index.php +++ b/html/user/forum_index.php @@ -9,6 +9,8 @@ require_once('../inc/forum.inc'); require_once('../inc/forum_std.inc'); db_init(); +get_logged_in_user(false); + function forum_summary($forum) { echo ' @@ -32,16 +34,6 @@ echo " Questions & answers area instead of the Message boards.

-

-
- - - - - - or do advanced search - -

"; show_forum_title(NULL, NULL, false); diff --git a/html/user/forum_pm.php b/html/user/forum_pm.php new file mode 100644 index 0000000000..065aceb1d5 --- /dev/null +++ b/html/user/forum_pm.php @@ -0,0 +1,239 @@ +id." ORDER BY date DESC"); + if (mysql_num_rows($query) == 0) { + echo "You have no private messages."; + } else { + start_table(); + print "\n"; + while ($row = mysql_fetch_object($query)) { + print "\n"; + $subject = "id."\">".$row->subject.""; + if ($row->opened) { + print "\n"; + } else { + print "\n"; + } + print "\n"; + print "\n"; + print "\n"; + } + end_table(); + } + +} elseif ($action == "read") { + $id = get_int("id"); + $message = mysql_query("SELECT * FROM private_messages WHERE id=".$id." AND userid=".$logged_in_user->id); + if (mysql_num_rows($message) == 0) { + error_page("No such message."); + } else { + $message = mysql_fetch_object($message); + page_head("Private messages : ".$message->subject); + pm_header(); + + $options = new output_options; + + start_table(); + echo ""; + echo ""; + echo ""; + echo ""; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + end_table(); + + page_tail(); + exit(); +} + +function pm_send($to, $subject, $content) { + global $logged_in_user; + $userid = $to->id; + $senderid = $logged_in_user->id; + $sql_subject = mysql_escape_string($subject); + $sql_content = mysql_escape_string($content); + mysql_query("INSERT INTO private_messages (userid, senderid, date, subject, content) VALUES ($userid, $senderid, UNIX_TIMESTAMP(), '$sql_subject', '$sql_content')"); + if ($to->send_email == 1) { // Send email notification + $message = "Dear ".$to->name.",\n\n"; + $message .= "You have received a new private message at ".PROJECT." from ".$logged_in_user->name.", entitled \"".$subject."\".\n\n"; + $message .= "To read the original version, respond to, or delete this message, you must log in here:\n"; + $message .= URL_BASE."forum_pm.php\n\n"; + $message .= "Do not reply to this message. To disable email notification, go to\n"; + $message .= URL_BASE."prefs.php?subset=project\n"; + $message .= "and change email notification settings.\n"; + + send_email($to, "[".PROJECT."] Private message notification", $message); + } +} + +?> diff --git a/html/user/img/pm.png b/html/user/img/pm.png new file mode 100644 index 0000000000000000000000000000000000000000..3b98b66f209dce58474d641b7e181b099f1416f6 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8d@ zBeIx*fm;ZK886+f`vVj-2=EDU1=9cj|F5X1cq^mw{}aRi#T)P3xdRjtVPKfVZp6UA zCc?e~$X4QM5PF>gRJ=e?fE`FNl?3?(|7Uo*-M|aTGxczk*pYODeiH-${#aIUQEEMlA_Wf0k?7j&ROg^8I#R6{0FdqRF3&;SNcS3j3^ HP6
'; -show_forum_title($forum, NULL); - -if ($Category->getType()!=0){ - echo " -
-
getID()."\">getTitle()."\">
- To keep the number of repeated posts to a minimum please search before you create a new thread. -
"; -} - - echo ''; echo "[Create a new thread]

SubjectSenderDate
".$subject."".$subject."".user_links(get_user_from_id($row->senderid))."".time_str($row->date)."
Subject".$message->subject."
Sender".user_links(get_user_from_id($message->senderid))."
Date".time_str($message->date)."
Message".output_transform($message->content, $options)."
\n"; + echo "Delete\n"; + echo " | Reply\n"; + echo " | Inbox\n"; + end_table(); + + if ($message->opened == 0) { + mysql_query("UPDATE private_messages SET opened=1 WHERE id=$id"); + } + } + +} elseif ($action == "new") { + pm_create_new(); +} elseif ($action == "delete") { + $id = get_int("id", true); + if ($id == null) { $id = post_int("id"); } + if (post_int("confirm", true) == 1) { + check_tokens($logged_in_user->authenticator); + mysql_query("DELETE FROM private_messages WHERE userid=".$logged_in_user->id." AND id=$id"); + header("Location: forum_pm.php"); + } else { + $message = mysql_query("SELECT * FROM private_messages WHERE userid=".$logged_in_user->id." AND id=$id"); + if (mysql_num_rows($message) == 1) { + $message = mysql_fetch_object($message); + $sender = lookup_user_id($message->senderid); + page_head("Private messages : Really delete?"); + pm_header(); + echo "
Are you sure you want to delete the message with subject \"".$message->subject."\" (sent by ".$sender->name." on ".time_str($message->date).")?
\n"; + echo "
\n"; + echo form_tokens($logged_in_user->authenticator); + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + } else { + error_page("No such message."); + } + } +} elseif ($action == "send") { + check_tokens($logged_in_user->authenticator); + + $to = post_str("to", true); + $subject = post_str("subject", true); + $content = post_str("content", true); + + if (($to == null) || ($subject == null) || ($content == null)) { + pm_create_new("You need to fill all fields to send a private message"); + } else { + akismet_check(new User($logged_in_user->id), $content); + $to = str_replace(", ", ",", $to); // Filter out spaces after separator + $users = explode(",", $to); + + $userlist = array(); + $userids = array(); // To prevent from spamming a single user by adding it multiple times + + foreach ($users as $username) { + $user = explode(" ", $username); + if (is_numeric($user[0])) { // user ID is gived + $userid = $user[0]; + $user = lookup_user_id($userid); + if ($user == null) { + pm_create_new("Could not find user with id $userid"); + } + } else { + $user = lookup_user_name($username); + if ($user == null) { + pm_create_new("Could not find user $username"); + } + } + $ignorelist = mysql_query("SELECT ignorelist FROM forum_preferences WHERE userid=".$user->id); + $ignorelist = mysql_fetch_object($ignorelist); + $ignorelist = $ignorelist->ignorelist; + $ignorelist = explode("|", $ignorelist); + if (in_array($logged_in_user->id, $ignorelist)) { + pm_create_new("User ".$user->name." (ID: ".$user->id.") is not accepting private messages from you."); + } + if ($userids[$user->id] == null) { + $userlist[] = $user; + $userids[$user->id] = true; + } + } + + foreach ($userlist as $user) { + pm_send($user, $subject, $content); + } + + Header("Location: forum_pm.php?action=inbox&sent=1"); + } +} + +page_tail(); + + +function pm_header() { + echo "
\n"; + echo " Inbox\n"; + echo " | Write\n"; + echo "
\n"; +} + +function pm_create_new($error = null) { + page_head("Private messages : Create new"); + pm_header(); + + global $logged_in_user; + $replyto = get_int("replyto", true); + $userid = get_int("userid", true); + + + if ($replyto) { + $message = mysql_query("SELECT * FROM private_messages WHERE userid=".$logged_in_user->id." AND id=$replyto"); + if ($message) { + $message = mysql_fetch_object($message); + $content = "[quote]".$message->content."[/quote]\n"; + $userid = $message->senderid; + $user = get_user_from_id($userid); + if ($user != null) { + $writeto = $userid." (".$user->name.")"; + } + $subject = $message->subject; + if (substr($subject, 0, 3) != "re:") { + $subject = "re: ".$subject; + } + } + } elseif ($userid) { + $user = get_user_from_id($userid); + if ($user != null) { + $writeto = $userid." (".$user->name.")"; + } + } else { + $writeto = post_str("to", true); + $subject = post_str("subject", true); + $content = post_str("content", true); + } + + if ($error != null) { + echo "
$error
\n"; + } + + echo "
\n"; + echo "\n"; + echo form_tokens($logged_in_user->authenticator); + start_table(); + echo "
To
User IDs or unique usernames, separated with commas
Subject
Message
".html_info()."