From d85e45bf64cb2715f116eae1e0ea422419c0a358 Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Mon, 31 Dec 2001 13:02:53 +0000 Subject: [PATCH] - Added "x new comments" feature. Requires a SQL update. - Tidied up some comment related code in node.module. --- modules/blog.module | 4 +-- modules/blog/blog.module | 4 +-- modules/comment.module | 55 ++++++++++++++++++++++++++++++++-- modules/comment/comment.module | 55 ++++++++++++++++++++++++++++++++-- modules/node.module | 7 +---- modules/node/node.module | 7 +---- update.php | 10 +++++++ 7 files changed, 122 insertions(+), 20 deletions(-) diff --git a/modules/blog.module b/modules/blog.module index 68c8fee83d9..ae364e67408 100644 --- a/modules/blog.module +++ b/modules/blog.module @@ -180,7 +180,7 @@ function blog_page_user($uid = 0, $date = 0) { } if ($blog->comment) { - $links[] = "nid\">". format_plural(node_get_comments($blog->nid), t("comment"), t("comments")) .""; + $links[] = "nid\">". format_plural(comment_num_all($blog->nid), t("comment"), t("comments")) .""; } $output .= "
". check_output($blog->title) ."
". $theme->links($links) .""; @@ -217,7 +217,7 @@ function blog_page_last() { } if ($blog->comment) { - $links[] = "nid\">". format_plural(node_get_comments($blog->nid), t("comment"), t("comments")) .""; + $links[] = "nid\">". format_plural(comment_num_all($blog->nid), t("comment"), t("comments")) .""; } $output .= "". check_output($blog->title) ."". $theme->links($links) .""; diff --git a/modules/blog/blog.module b/modules/blog/blog.module index 68c8fee83d9..ae364e67408 100644 --- a/modules/blog/blog.module +++ b/modules/blog/blog.module @@ -180,7 +180,7 @@ function blog_page_user($uid = 0, $date = 0) { } if ($blog->comment) { - $links[] = "nid\">". format_plural(node_get_comments($blog->nid), t("comment"), t("comments")) .""; + $links[] = "nid\">". format_plural(comment_num_all($blog->nid), t("comment"), t("comments")) .""; } $output .= "
". check_output($blog->title) ."
". $theme->links($links) .""; @@ -217,7 +217,7 @@ function blog_page_last() { } if ($blog->comment) { - $links[] = "nid\">". format_plural(node_get_comments($blog->nid), t("comment"), t("comments")) .""; + $links[] = "nid\">". format_plural(comment_num_all($blog->nid), t("comment"), t("comments")) .""; } $output .= "". check_output($blog->title) ."". $theme->links($links) .""; diff --git a/modules/comment.module b/modules/comment.module index a315589729b..dc58b5a57e8 100644 --- a/modules/comment.module +++ b/modules/comment.module @@ -12,6 +12,47 @@ function comment_settings($mode, $order, $threshold) { } } +function comment_num_all($nid) { + $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$nid' GROUP BY n.nid")); + return $comment->number ? $comment->number : 0; +} + +function comment_num_new($nid) { + global $user; + + if ($user->uid) { + + /* + ** Retrieve the timestamp at which the current user last viewed + ** the specified node and use this timestamp to find the number + ** of new comments. + */ + + $history = db_fetch_object(db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '$nid'")); + $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$nid' AND timestamp > '". ($history->timestamp ? $history->timestamp : 0) ."' GROUP BY n.nid")); + + return $comment->number ? $comment->number : 0; + } + else { + return 0; + } + +} + +function comment_tag_new($nid) { + global $user; + + if ($user->uid) { + $result = db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '$nid'"); + if (db_fetch_object($result)) { + db_query("UPDATE history SET timestamp = '". time() ."' WHERE uid = '$user->uid' AND nid = '$nid'"); + } + else { + db_query("INSERT INTO history (uid, nid, timestamp) VALUES ('$user->uid', '$nid', '". time() ."')"); + } + } +} + function comment_access($op, $comment) { global $user; @@ -460,6 +501,7 @@ function comment_perm() { } function comment_link($type, $node = 0, $main = 0) { + if ($type == "admin" && user_access("administer comments")) { $links[] = "comments"; } @@ -473,10 +515,19 @@ function comment_link($type, $node = 0, $main = 0) { */ if (user_access("access comments")) { - $links[] = "nid#comment\">". format_plural(node_get_comments($node->nid), "comment", "comments") .""; + $all = comment_num_all($node->nid); + $new = comment_num_new($node->nid); + + $links[] = "nid#comment\">". format_plural($all, "comment", "comments") . ($new ? ", $new ". t("new") : "") .""; } } else { + /* + ** Tag the node's comments as read: + */ + + comment_tag_new($node->nid); + /* ** Node page: add a "post comment" link if the user is allowed to ** post comments. @@ -493,7 +544,7 @@ function comment_link($type, $node = 0, $main = 0) { function comment_node_link($node) { - if (user_access("administer comments") && node_get_comments($node->nid)) { + if (user_access("administer comments") && comments_all($node->nid)) { /* ** Edit comments: diff --git a/modules/comment/comment.module b/modules/comment/comment.module index a315589729b..dc58b5a57e8 100644 --- a/modules/comment/comment.module +++ b/modules/comment/comment.module @@ -12,6 +12,47 @@ function comment_settings($mode, $order, $threshold) { } } +function comment_num_all($nid) { + $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$nid' GROUP BY n.nid")); + return $comment->number ? $comment->number : 0; +} + +function comment_num_new($nid) { + global $user; + + if ($user->uid) { + + /* + ** Retrieve the timestamp at which the current user last viewed + ** the specified node and use this timestamp to find the number + ** of new comments. + */ + + $history = db_fetch_object(db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '$nid'")); + $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$nid' AND timestamp > '". ($history->timestamp ? $history->timestamp : 0) ."' GROUP BY n.nid")); + + return $comment->number ? $comment->number : 0; + } + else { + return 0; + } + +} + +function comment_tag_new($nid) { + global $user; + + if ($user->uid) { + $result = db_query("SELECT timestamp FROM history WHERE uid = '$user->uid' AND nid = '$nid'"); + if (db_fetch_object($result)) { + db_query("UPDATE history SET timestamp = '". time() ."' WHERE uid = '$user->uid' AND nid = '$nid'"); + } + else { + db_query("INSERT INTO history (uid, nid, timestamp) VALUES ('$user->uid', '$nid', '". time() ."')"); + } + } +} + function comment_access($op, $comment) { global $user; @@ -460,6 +501,7 @@ function comment_perm() { } function comment_link($type, $node = 0, $main = 0) { + if ($type == "admin" && user_access("administer comments")) { $links[] = "comments"; } @@ -473,10 +515,19 @@ function comment_link($type, $node = 0, $main = 0) { */ if (user_access("access comments")) { - $links[] = "nid#comment\">". format_plural(node_get_comments($node->nid), "comment", "comments") .""; + $all = comment_num_all($node->nid); + $new = comment_num_new($node->nid); + + $links[] = "nid#comment\">". format_plural($all, "comment", "comments") . ($new ? ", $new ". t("new") : "") .""; } } else { + /* + ** Tag the node's comments as read: + */ + + comment_tag_new($node->nid); + /* ** Node page: add a "post comment" link if the user is allowed to ** post comments. @@ -493,7 +544,7 @@ function comment_link($type, $node = 0, $main = 0) { function comment_node_link($node) { - if (user_access("administer comments") && node_get_comments($node->nid)) { + if (user_access("administer comments") && comments_all($node->nid)) { /* ** Edit comments: diff --git a/modules/node.module b/modules/node.module index e9b7f69a67d..c4999b1b604 100644 --- a/modules/node.module +++ b/modules/node.module @@ -14,15 +14,10 @@ function node_help() { } } -// TODO: still used by themes, yet doesn't return anything at the moment +// DEPRICATED: still used by themes, yet doesn't return anything at the moment function node_index() { } -function node_get_comments($nid) { - $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$nid' GROUP BY n.nid")); - return $comment->number ? $comment->number : 0; -} - function node_teaser($body) { $size = 400; diff --git a/modules/node/node.module b/modules/node/node.module index e9b7f69a67d..c4999b1b604 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -14,15 +14,10 @@ function node_help() { } } -// TODO: still used by themes, yet doesn't return anything at the moment +// DEPRICATED: still used by themes, yet doesn't return anything at the moment function node_index() { } -function node_get_comments($nid) { - $comment = db_fetch_object(db_query("SELECT COUNT(c.nid) AS number FROM node n LEFT JOIN comments c ON n.nid = c.nid WHERE n.nid = '$nid' GROUP BY n.nid")); - return $comment->number ? $comment->number : 0; -} - function node_teaser($body) { $size = 400; diff --git a/update.php b/update.php index 1cc0d1c814c..f26937533e0 100644 --- a/update.php +++ b/update.php @@ -41,6 +41,7 @@ "2001-12-16" => "update_14", "2001-12-24" => "update_15", "2001-12-30" => "update_16", + "2001-12-31" => "update_17", ); // Update functions @@ -296,6 +297,15 @@ function update_16() { update_sql("ALTER TABLE comments CHANGE lid nid int(10) NOT NULL;"); } +function update_17() { + update_sql("CREATE TABLE history ( + uid int(10) DEFAULT '0' NOT NULL, + nid int(10) DEFAULT '0' NOT NULL, + timestamp int(11) DEFAULT '0' NOT NULL, + PRIMARY KEY (uid, nid) + );"); +} + // System functions function update_sql($sql) { global $edit;