diff options
-rw-r--r-- | discussion.php | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/discussion.php b/discussion.php new file mode 100644 index 000000000..9471b1d09 --- /dev/null +++ b/discussion.php @@ -0,0 +1,315 @@ +<? + +function comments_kids ($cid, $mode, $order = 0, $thold = 0, $level = 0, $dummy = 0) { + global $user, $theme; + + $comments = 0; + + $result = db_query("SELECT c.*, u.* FROM comments c LEFT JOIN users u ON c.author = u.id WHERE c.pid = $cid ORDER BY c.timestamp, c.cid"); + + if ($mode == "nested") { + while ($comment = db_fetch_object($result)) { + if ($$comment->score >= $thold) { + if ($level && !$comments) print "<UL>"; + $comments++; + + $link = "<A HREF=\"discussion.php?op=reply&sid=$comment->sid&pid=$comment->cid&mode=$mode&order=$order&thold=$thold\"><FONT COLOR=\"$theme->hlcolor2\">reply to this comment</FONT></A>"; + $theme->comment($comment->userid, $comment->subject, $comment->comment, $comment->timestamp, $comment->url, $comment->femail, $comment->score, $comment->cid, $link); + + comments_kids($comment->cid, $mode, $order, $thold, $level + 1, $dummy + 1); + } + } + } + elseif ($mode == "flat") { + while ($comment = db_fetch_object($result)) { + if ($comment->score >= $thold) { + $link = "<A HREF=\"discussion.php?op=reply&sid=$comment->sid&pid=$comment->cid&mode=$mode&order=$order&thold=$thold\"><FONT COLOR=\"$theme->hlcolor2\">reply to this comment</FONT></A>"; + $theme->comment($comment->userid, $comment->subject, $comment->comment, $comment->timestamp, $comment->url, $comment->femail, $comment->score, $comment->cid, $link); + } + comments_kids($comment->cid, $mode, $order, $thold); + } + } + elseif ($mode == "disabled") { + // do nothing + } + else { + print "ERROR: we should not get here!"; + } + + if ($level && $comments) { + print "</UL>"; + } +} + +function comments_childs($cid, $mode, $order, $thold, $level = 0, $thread) { + global $anonymous, $theme, $user; + + ### Perform SQL query: + $result = db_query("SELECT c.*, u.* FROM comments c LEFT JOIN users u ON c.author = u.id WHERE c.pid = $cid ORDER BY c.timestamp, c.cid"); + + if ($level == 0) $thread = ""; + $comments = 0; + + while ($comment = db_fetch_object($result)) { + if ($level && !$comments) { + $thread .= "<UL>"; + } + + $comments++; + + ### Compose link: + $thread .= "<LI><A HREF=\"discussion.php?id=$comment->sid&cid=$comment->cid&pid=$comment->pid"; + $thread .= ($mode) ? "&mode=$mode" : "&mode=threaded"; + $thread .= ($order) ? "&order=$order" : "&order=0"; + $thread .= ($thold) ? "&thold=$thold" : "&thold=0"; + $thread .= "\">$comment->subject</A> by "; + $thread .= ($comment->userid) ? $comment->userid : $anonymous; + $thread .= " <SMALL>(". date("D, M d, Y - H:i:s", $comment->timestamp) .")<SMALL></LI>"; + + ### Recursive: + comments_childs($comment->cid, $mode, $order, $thold, $level + 1, &$thread); + } + + if ($level && $comments) { + $thread .= "</UL>"; + } + + return $thread; +} + +function comments_display ($sid, $pid, $cid, $mode, $order, $thold, $level = 0) { + global $user, $theme; + + ### Pre-process variables: + $pid = (empty($pid)) ? 0 : $pid; + $cid = (empty($pid)) ? 0 : $cid; + + ### Compose story-query: + $result = db_query("SELECT stories.*, users.userid FROM stories LEFT JOIN users ON stories.author = users.id WHERE stories.status != 0 AND stories.id = $sid"); + $story = db_fetch_object($result); + + ### Display story: + $theme->article($story, "[ <A HREF=\"\"><FONT COLOR=\"$theme->hlcolor2\">home</FONT></A> | <A HREF=\"discussion.php?op=reply&sid=$story->id&pid=0\"><FONT COLOR=\"$theme->hlcolor2\">add a comment</FONT></A> ]"); + + ### Display `comment control'-box: + $theme->commentControl($sid, $title, $thold, $mode, $order); + + ### Compose query: + $query = "SELECT c.*, u.* FROM comments c LEFT JOIN users u ON c.author = u.id WHERE c.sid = $sid AND c.pid = $pid"; + if ($mode == 'threaded' || mode == 'nested') { + if ($thold != "") $query .= " AND c.score >= $thold"; + else $query .= " AND c.score >= 0"; + } + if ($order == 1) $query .= " ORDER BY c.timestamp DESC"; + if ($order == 2) $query .= " ORDER BY c.score DESC"; + $result = db_query("$query"); + + ### Display the comments: + while ($comment = db_fetch_object($result)) { + ### Dynamically compose the `reply'-link: + if ($pid != 0) { + list($pid) = mysql_fetch_row(mysql_query("SELECT pid FROM comments WHERE cid = $comment->pid")); + $link = "<A HREF=\"discussion.php?id=$comment->sid&pid=$pid&mode=$mode&order=$order&thold=$thold\"><FONT COLOR=\"$theme->hlcolor2\">return to parent</FONT></A> | <A HREF=\"discussion.php?op=reply&sid=$comment->sid&pid=$comment->cid&mode=$mode&order=$order&thold=$thold\"><FONT COLOR=\"$theme->hlcolor2\">reply to this comment</FONT></A>"; + } + else { + $link = "<A HREF=\"discussion.php?op=reply&sid=$comment->sid&pid=$comment->cid&mode=$mode&order=$order&thold=$thold\"><FONT COLOR=\"$theme->hlcolor2\">reply to this comment</FONT></A> "; + } + + ### Display the comments: + if (empty($mode) || $mode == "threaded") { + $thread = comments_childs($comment->cid, $mode, $order, $thold); + $theme->comment($comment->userid, $comment->subject, $comment->comment, $comment->timestamp, $comment->url, $comment->femail, $comment->score, $comment->cid, $link, $thread); + } + else { + $theme->comment($comment->userid, $comment->subject, $comment->comment, $comment->timestamp, $comment->url, $comment->femail, $comment->score, $comment->cid, $link); + comments_kids($comment->cid, $mode, $order, $thold, $level); + } + } +} + +function comments_reply($pid, $sid, $mode, $order, $thold) { + global $anonymous, $user, $theme; + + ### Extract parent-information/data: + if ($pid) { + $item = db_fetch_object(db_query("SELECT comments.*, users.userid FROM comments LEFT JOIN users ON comments.author = users.id WHERE comments.cid = $pid")); + $theme->comment($item->userid, $item->subject, $item->comment, $item->timestamp, $item->url, $item->femail, $item->score, $item->cid, "reply to this comment"); + } + else { + $item = db_fetch_object(db_query("SELECT stories.*, users.userid FROM stories LEFT JOIN users ON stories.author = users.id WHERE stories.status = 2 AND stories.id = $sid")); + $theme->article($item, ""); + } + + ### Build reply form: + $output .= "<FORM ACTION=\"discussion.php\" METHOD=\"post\">\n"; + + ### Name field: + if ($user) { + $output .= "<P>\n"; + $output .= " <B>Your name:</B><BR>\n"; + $output .= " <A HREF=\"account.php\">$user->userid</A> <FONT SIZE=\"2\">[ <A HREF=\"account.php?op=logout\">logout</A> ]</FONT>\n"; + $output .= "</P>\n"; + } + else { + $output .= "<P>\n"; + $output .= " <B>Your name:</B><BR>\n"; + $output .= " $anonymous\n"; + $output .= "</P>\n"; + } + + ### Subject field: + $output .= "<P>\n"; + $output .= " <B>Subject:</B><BR>\n"; + if (!eregi("Re:",$item->subject)) $item->subject = "Re: $item->subject"; + // Only one 'Re:' will just do fine. ;) + $output .= " <INPUT TYPE=\"text\" NAME=\"subject\" SIZE=\"50\" MAXLENGTH=\"60\" VALUE=\"$item->subject\">\n"; + $output .= "</P>\n"; + + ### Comment field: + $output .= "<P>\n"; + $output .= " <B>Comment:</B><BR>\n"; + $output .= " <TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"10\" NAME=\"comment\">$user->signature</TEXTAREA><BR>\n"; + $output .= "</P>\n"; + + ### Hidden fields: + $output .= "<INPUT TYPE=\"hidden\" NAME=\"pid\" VALUE=\"$pid\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"sid\" VALUE=\"$sid\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"mode\" VALUE=\"$mode\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"order\" VALUE=\"$order\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"thold\" VALUE=\"$thold\">\n"; + + ### Preview button: + $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Preview comment\"> (You must preview at least once before you can submit.)\n"; + $output .= "</FORM>\n"; + + $theme->box("Reply", $output); +} + +function comment_preview($pid, $sid, $subject, $comment, $mode, $order, $thold) { + global $anonymous, $user, $theme; + + ### Preview comment: + if ($user) $theme->comment("", $subject, $comment, time(), "", "", "na", "", "reply to this comment"); + else $theme->comment($user->userid, $subject, $comment, time(), $user->url, $user->femail, "na", "", "reply to this comment"); + + ### Build reply form: + $output .= "<FORM ACTION=\"discussion.php\" METHOD=\"post\">\n"; + + ### Name field: + if ($user) { + $output .= "<P>\n"; + $output .= " <B>Your name:</B><BR>\n"; + $output .= " <A HREF=\"account.php\">$user->userid</A> <FONT SIZE=\"2\">[ <A HREF=\"account.php?op=logout\">logout</A> ]</FONT>\n"; + $output .= "</P>\n"; + } + else { + $output .= "<P>\n"; + $output .= " <B>Your name:</B><BR>\n"; + $output .= " $anonymous\n"; + $output .= "</P>\n"; + } + + ### Subject field: + $output .= "<P>\n"; + $output .= " <B>Subject:</B><BR>\n"; + $output .= " <INPUT TYPE=\"text\" NAME=\"subject\" SIZE=\"50\" MAXLENGTH=\"60\" VALUE=\"$subject\">\n"; + $output .= "</P>\n"; + + ### Comment field: + $output .= "<P>\n"; + $output .= " <B>Comment:</B><BR>\n"; + $output .= " <TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"10\" NAME=\"comment\">$comment</TEXTAREA><BR>\n"; + $output .= "</P>\n"; + + ### Hidden fields: + $output .= "<INPUT TYPE=\"hidden\" NAME=\"pid\" VALUE=\"$pid\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"sid\" VALUE=\"$sid\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"mode\" VALUE=\"$mode\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"order\" VALUE=\"$order\">\n"; + $output .= "<INPUT TYPE=\"hidden\" NAME=\"thold\" VALUE=\"$thold\">\n"; + + ### Preview and submit buttons: + if (empty($subject)) { + $output .= "<P>\n"; + $output .= " <FONT COLOR=\"red\"><B>Warning:</B></FONT> you did not supply a <U>subject</U>.\n"; + $outout .= "</P>\n"; + $output .= "<P>\n"; + $output .= " <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Preview comment\">\n"; + $output .= "</P>\n"; + } + else { + $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Preview comment\">\n"; + $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Post comment\">\n"; + $output .= "</FORM>\n"; + } + + $theme->box("Reply", $output); +} + +function comment_post($pid, $sid, $subject, $comment, $mode, $order, $thold) { + global $user, $theme; + + ### Check for fake threads: + $fake = db_result(db_query("SELECT COUNT(*) FROM stories WHERE id = $sid"), 0); + + ### Check for duplicate comments: + $duplicate = db_result(db_query("SELECT COUNT(*) FROM comments WHERE pid = '$pid' AND sid = '$sid' AND subject = '". addslashes($subject) ."' AND comment = '". addslashes($comment) ."'"), 0); + + if ($fake != 1) { + $theme->box("fake comment", "fake comment: $fake"); + } + elseif ($duplicate != 0) { + $theme->box("duplicate comment", "duplicate comment: $duplicate"); + } + else { + if ($user) { + ### Add comment to database: + db_query("INSERT INTO comments (pid, sid, author, subject, comment, hostname, timestamp) VALUES ($pid, $sid, $user->id, '". addslashes($subject) ."', '". addslashes($comment) ."', '". getenv("REMOTE_ADDR") ."', '". time() ."')"); + + ### Compose header: + $header = "discussion.php?id=$sid"; + $header .= ($mode) ? "&mode=$mode" : "&mode=threaded"; + $header .= ($order) ? "&order=$order" : "&order=0"; + $header .= ($thold) ? "&thold=$thold" : "&thold=0"; + } + else { + ### Add comment to database: + db_query("INSERT INTO comments (pid, sid, subject, comment, hostname, timestamp) VALUES ($pid, $sid, '". addslashes($subject) ."', '". addslashes($comment) ."', '". getenv("REMOTE_ADDR") ."', '". time() ."')"); + + ### Compose header: + $header .= "discussion.php?id=$sid&mode=threaded&order=1&thold=0"; + } + header("Location: $header"); + } +} + +include "config.inc"; +include "theme.inc"; +include "functions.inc"; + +if ($save) { + db_query("UPDATE users SET umode = '$mode', uorder = '$order', thold = '$thold' where id = '$user->id'"); + $user->rehash(); +} + +switch($op) { + case "Preview comment": + $theme->header(); + comment_preview($pid, $sid, $subject, $comment, $mode, $order, $thold); + $theme->footer(); + break; + case "Post comment": + comment_post($pid, $sid, $subject, $comment, $mode, $order, $thold); + break; + case "reply": + $theme->header(); + comments_reply($pid, $sid, $mode, $order, $thold); + $theme->footer(); + break; + default: + $theme->header(); + comments_display($id, $pid, $sid, $mode, $order, $thold); + $theme->footer(); +} + +?>
\ No newline at end of file |