jul/newreply.php
Xkeeper ca406f7268
Update newreply.php to suck less and more
* Remove rest of adbox code
* Mood list changed into `<select>` from `<input type=radio>`
* Preview and normal reply use the same form instead of two different ones
* Less but saner permission checks
* Last-chance post recovery if a thread closes while replying
* Smilies are mid-aligned
* Textbox now expandable and shrinks to fit properly
* Some other assorted crap
2019-01-02 16:59:49 -08:00

306 lines
10 KiB
PHP

<?php
require 'lib/function.php';
$thread=$sql->fetchq("SELECT forum, closed, sticky,title,lastposter FROM threads WHERE id=$id");
// Stop this insanity. Never index newreply.
$meta['noindex'] = true;
// Give failed replies a last-chance to copy and save their work,
// as way too often you'll miss and then it's just gone forever
$lastchance = null;
$redirectTime = 3;
if (v($_POST['message']) !== null) {
$lastchance = "<br><br>You can copy and save what you were <em>going</em> to post, if you want:
<br><textarea class='newposttextbox' style='margin: 1em auto;'>". htmlspecialchars(stripslashes($_POST['message']), ENT_QUOTES) ."</textarea>";
$redirectTime = -1;
}
if (!$thread) {
require_once 'lib/layout.php';
boardmessage("You can't reply to threads that don't exist!<br>". redirect("index.php", "the forum index", $redirectTime) . $lastchance, "Error");
}
$forumid =intval($thread['forum']);
$forum =$sql->fetchq("SELECT title,minpower,minpowerreply,id,specialscheme FROM forums WHERE id=$forumid");
if ($forum['minpower'] && $power < $forum['minpower']) {
require_once 'lib/layout.php';
boardmessage("You aren't allowed to view this thread.<br>". redirect("index.php", "the forum index", $redirectTime) . $lastchance, "Error");
}
$specialscheme = $forum['specialscheme'];
$windowtitle = "$boardname -- $forum[title]: $thread[title] -- New reply";
$thread['title'] = str_replace('<','&lt;',$thread['title']);
require_once 'lib/layout.php';
// Do access checks. Can't post while banned...
if ($power < $forum['minpowerreply'] || $banned) {
boardmessage("You aren't allowed to reply to this thread.<br>". redirect("thread.php?id=$id", "the thread", $redirectTime) . $lastchance, "Error");
}
// ...or in a closed thread
if ($thread['closed']) {
boardmessage("You can't reply to this thread because it is closed.<br>". redirect("thread.php?id=$id", "the thread", $redirectTime) . $lastchance, "Error");
}
// Check if we are a global moderator, or a local mod of this forum
$modoptions = "";
if ($ismod || mysql_num_rows($sql->query("SELECT user FROM forummods WHERE forum='$forumid' and user='$loguserid'"))) {
$ismod = 1;
$modoptions = "
<tr>
$tccell1><strong>Moderator Options:</strong></td>
$tccell2l>
$inpc='close' id='close' value='1'><label for='close'>Close</label> -
$inpc='stick' id='stick' value='1'". ($thread['sticky'] ? "checked" : "") ."><label for='stick'>Sticky</label>
</td>
</tr>";
}
if(!filter_int($ppp)) $ppp=(!$log?20:$loguser['postsperpage']);
$smilies = readsmilies();
$fonline = fonlineusers($forumid);
$header = makeheader($header1,$headlinks,$header2 ."\t$tblstart$tccell1s>$fonline$tblend");
$breadcrumb = "<a href=index.php>$boardname</a> - <a href=forum.php?id=$forumid>$forum[title]</a> - <a href='thread.php?id=$id'>$thread[title]</a> - New Reply";
$header .= "$fonttag$breadcrumb";
// Show the new reply form?
$showform = true;
$usererror = "";
$preview = "";
if (v($_POST['action']) == 'postreply') {
if ($log)
$userid = $loguserid;
else
$userid = checkuser($_POST['username'], $_POST['password']);
if ($userid == -1 || $userid == 0) {
$usererror = " <strong style='color: red;'>* Invalid username or password.</strong>";
} else {
$user = @$sql->fetchq("SELECT * FROM users WHERE id='$userid'");
if (!$user) {
boardmessage("Something went really weird? Contact an admin: Userid $userid but no user??", "This shouldn't happen");
}
}
if ($user) {
$sign = $user['signature'];
$head = $user['postheader'];
$numposts = $user['posts'] + 1;
$numdays = (ctime() - $user['regdate']) / 86400;
$tags = array();
$message = doreplace($message, $numposts, $numdays, $username, $tags);
$tagval = $sql->escape(json_encode($tags));
$rsign = doreplace($sign, $numposts, $numdays, $username);
$rhead = doreplace($head, $numposts, $numdays, $username);
$currenttime = ctime();
// Submitting a post
if (filter_string($_POST['submit'])) {
$sql->query("UPDATE `users` SET `posts` = $numposts, `lastposttime` = '$currenttime' WHERE `id` = '$userid'");
if (filter_bool($nolayout)) {
$headid = 0;
$signid = 0;
} else {
$headid=getpostlayoutid($head);
$signid=getpostlayoutid($sign);
}
$closeq = "";
$stickq = "";
if ($ismod) {
if (filter_bool($_POST['close'])) $closeq = "`closed` = '1',";
else $closeq = "`closed` = '0',";
if (filter_bool($_POST['stick'])) $stickq = "`sticky` = '1',";
else $stickq = "`sticky` = '0',";
}
$sql->query("INSERT INTO posts (thread,user,date,ip,num,headid,signid,moodid) VALUES ($id,$userid,$currenttime,'$userip',$numposts,$headid,$signid,'". $_POST['moodid'] ."')");
$pid=mysql_insert_id();
$options = filter_int($nosmilies) . "|" . filter_int($nohtml);
if($pid) $sql->query("INSERT INTO `posts_text` (`pid`,`text`,`tagval`, `options`) VALUES ('$pid','$message','$tagval', '$options')");
$sql->query("UPDATE `threads` SET $closeq $stickq `replies` = `replies` + 1, `lastpostdate` = '$currenttime', `lastposter` = '$userid' WHERE `id`='$id'");
$sql->query("UPDATE `forums` SET `numposts` = `numposts` + 1, `lastpostdate` = '$currenttime', `lastpostuser` ='$userid', `lastpostid` = '$pid' WHERE `id`='$forumid'");
$sql->query("UPDATE `threadsread` SET `read` = '0' WHERE `tid` = '$id'");
$sql->query("REPLACE INTO threadsread SET `uid` = '$userid', `tid` = '$id', `time` = ". ctime() .", `read` = '1'");
xk_ircout("reply", $user['name'], array(
'forum' => $forum['title'],
'fid' => $forumid,
'thread' => str_replace("&lt;", "<", $thread['title']),
'pid' => $pid,
'pow' => $forum['minpower'],
));
return header("Location: thread.php?pid=$pid#$pid");
// Previewing a post
} else {
loadtlayout();
$message = stripslashes($message);
$ppost = $user;
$ppost['posts']++;
$ppost['uid'] = $userid;
$ppost['num'] = $numposts;
$ppost['lastposttime'] = $currenttime;
$ppost['date'] = $currenttime;
$ppost['moodid'] = $_POST['moodid'];
if (filter_bool($nolayout)) {
$ppost['headtext'] = "";
$ppost['signtext'] = "";
} else {
$ppost['headtext']=$rhead;
$ppost['signtext']=$rsign;
}
$ppost['text'] = $message;
$ppost['options'] = filter_int($nosmilies) . "|" . filter_int($nohtml);
$ip = "";
$preview = "
$tblstart
<tr>$tccellh><strong>Post preview</strong></td></tr>
$tblend
".threadpost($ppost,1)."
<br>";
}
}
}
// Totally new reply, with optional quote
if ($showform) {
$userlogin = "";
if (!$log) {
$userlogin = "
<tr>
$tccell1><strong>Username:</strong></td>
$tccell2l>$inpt='username' size='25' maxlength='25' value='". htmlspecialchars(v($_POST['username']), ENT_QUOTES) ."'> $usererror
</tr>
<tr>$tccell1><strong>Password:</strong></td>
$tccell2l>$inpp='password' size='25' maxlength='64' value='". htmlspecialchars(v($_POST['password']), ENT_QUOTES) ."'>
</tr>
";
}
$quotemsg = "";
if (filter_int($postid)) {
$post = $sql->fetchq("SELECT user,text,thread FROM posts,posts_text WHERE id=$postid AND id=pid");
$post['text'] = str_replace('<br>', $br, $post['text']);
$u = $post['user'];
$users[$u] = loaduser($u, 1);
if ($post['thread'] == $id) $quotemsg = "[quote={$users[$u]['name']}]{$post['text']}[/quote]\r\n";
}
$message = $quotemsg . stripslashes(v($_POST['message']));
print "$header
$preview
<form action=newreply.php name=replier method=post>
$tblstartf
<colgroup>
<col style='width: 150px;'>
<col>
</colgroup>
<tr>
$tccellh colspan=2><strong>New reply</strong>
</tr>
$userlogin
<tr>
$tccell1 style='width: 150px; max-width: 150px;'><strong>Reply:</strong></td>
$tccell2l>$txta=message class='newposttextbox'>". htmlspecialchars($message, ENT_QUOTES) ."</TEXTAREA></td>
<tr>
$tccell1>&nbsp;</td>$tccell2l>
$inph=action VALUE=postreply>
$inph=id VALUE=$id>
$inph=valid value='". md5($_SERVER['REMOTE_ADDR'] . $id ."sillysaltstring") ."'>
$inps=submit VALUE='Submit reply'>
$inps=preview VALUE='Preview reply'></td>
</tr>
<tr>
$tccell1><strong>Mood avatar:</strong></td>
$tccell2l>". moodlist(filter_int($moodid)) ."</td>
</tr>
<tr>
$tccell1><strong>Options:</strong></td>
$tccell2l>
$inpc='nosmilies' id='nosmilies' value='1'". (v($_POST['nosmilies']) ? " checked" : "") ."><label for='nosmilies'>Disable Smilies</label> -
$inpc='nolayout' id='nolayout' value='1'". (v($_POST['nolayout']) ? " checked" : "") ."><label for='nolayout'>Disable Layout</label> -
$inpc='nohtml' id='nohtml' value='1'". (v($_POST['nohtml']) ? " checked" : "") ."><label for='nohtml'>Disable HTML</label>
</td>
</tr>
$modoptions
$tblend
</form>
";
// Thread history view (under the form)
// (originally had a check for power, but that's accounted for above)
if (true) {
$postlist="<tr>$tccellh colspan=2 style=\"font-weight:bold;\">Thread history</tr><tr>$tccellh width=150>User</td>$tccellh width=*>Post</tr>";
$qppp = $ppp + 1;
$posts=$sql->query("SELECT name,posts,sex,powerlevel,user,text,options,num FROM users u,posts p,posts_text WHERE thread=$id AND p.id=pid AND user=u.id ORDER BY p.id DESC LIMIT $qppp");
$i = 0;
while($post=$sql->fetch($posts)){
$bg = ((($i++) & 1) ? 'tdbg2' : 'tdbg1');
if ($ppp-- > 0){
$postnum=($post['num']?"$post[num]/":'');
$tcellbg="<td class='tbl $bg font' valign=top>";
$namecolor=getnamecolor($post['sex'],$post['powerlevel']);
$postlist.="<tr>
$tcellbg<a href=profile.php?id=$post[user]><font $namecolor>$post[name]</font></a>$smallfont<br>
Posts: $postnum$post[posts]</td>
$tcellbg".doreplace2(dofilters($post['text']), $post['options'])."</tr>
";
}
else{
$tcellbg="<td bgcolor=$tablebg1 valign=top colspan=2";
$postlist.="<tr>$tccellh colspan=2>This is a long thread. Click <a href=thread.php?id=$id>here</a> to view it.</td></tr>";
}
}
}
print "
$tblstart
$postlist
$tblend
$fonttag
$breadcrumb";
}
print $footer;
printtimedif($startingtime);