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"; 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 '
';
-show_forum_title($forum, NULL);
-
-if ($Category->getType()!=0){
- echo "
-
- - To keep the number of repeated posts to a minimum please search before you create a new thread. - | |||
";
-}
-
-
echo '';
echo "[Create a new thread] | ";
echo '
-
";
+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 '
|||
Subject | Sender | Date | |
---|---|---|---|
".$subject." | \n"; + } else { + print "".$subject." | \n"; + } + print "".user_links(get_user_from_id($row->senderid))." | \n"; + print "".time_str($row->date)." | \n"; + print "
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 "\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";
+}
+
+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 " |