Please remember to click Mark as Installed if you use this modification.
Support questions from members who have not marked this as installed will be considered low priority.
Note: This product has been requested by kevinh as a custom work. It has been completed & delivered few months ago. Since all of my custom work is licensed under Creative Commons - Attribution-Noncommercial-Share Alike 3.0, I publish it now for the public use, I hope this product will be useful for all of you.
Name: Prevent Duplicate Posts Version: 3.8.100
Description:
This product will prevent duplicate posts from being posted in a time interval that specified by admin.
This product checks out the MD5 hash of the duplicate posts & compare it with the current post to see if it is really duplicate or not, this MD5 hash include (thread or forum ID, thread or post title, thread or post content and finally the user ID).
By enabling duplication flood check, you disallow users from making another duplicate post within a given time span of their last similar posting. In other words, if you set a duplication flood check time span of 30 seconds, a user may not duplicate post again within 30 seconds of making his last similar post.
Administrators and moderators are exempt from duplication flood check.
It's known that vBulletin by default has "Flood Check" that can be controlled from Admincp "Minimum Time Between Posts" option, but it's "Duplicate Check" is limited & can't be controlled any way since it's hard coded within vBulletin code (See file: functions_newpost.php -> function: build_new_post -> Code Block: after "// ### DUPE CHECK ###" comment), default vBulletin duplicate check is limited to 5 minutes only. This product solves this problem for those who need to prevent duplicate posts for a longer time with AdminCP control options.
Doing all default vBulletin checks & follow all vBulletin default scenarios while processing, the code embedded in the 'threadpost' data manager class, so it will work with both AJAX mode & normal mode posting all over the board.
Installation Procedure:
Do the following file edits:
Open the file "includes/class_dm_threadpost.php" & search in it for the following code:
Code:
if ($this->errors)
{
// if we already have errors, the save won't happen, so rollback now...
$this->floodcheck->rollback();
}
else
{
// ...or, in case we have a new error
$this->set_failure_callback(array(&$this->floodcheck, 'rollback'));
}
}
}
Add under it directly the following code:
Code:
// duplication check
if ($this->registry->options['ssgti_prevent_duplposts_floodchecktime'] > 0 AND empty($this->info['preview']) AND empty($this->info['is_automated']) AND $this->fetch_field('userid', 'post'))
{
if (!$this->info['user'])
{
$this->info['user'] = fetch_userinfo($this->fetch_field('userid', 'post'));
}
if (!$user)
{
$user =& $this->info['user'];
}
if ($user['lastpost'] <= TIMENOW AND
!can_moderate($this->info['forum']['forumid'], '', $user['userid'], $user['usergroupid'] . (trim($user['membergroupids']) ? ",$user[membergroupids]" : '')))
{
$forumid = $this->fetch_field('forumid');
if (!$forumid)
{
$forumid = $this->info['forum']['forumid'];
}
$threadid = $this->fetch_field('threadid');
$type = ($threadid > 0 ? 'reply' : 'thread');
$userid = $this->fetch_field('postuserid');
if (!$userid)
{
$userid = $this->fetch_field('userid');
}
$query_join = "";
if ($type == "thread")
{
$query_join = "LEFT JOIN " . TABLE_PREFIX . "thread AS thread USING (threadid)";
}
$suspection_period = TIMENOW - $this->registry->options['ssgti_prevent_duplposts_floodchecktime'];
// Fetch all suspect duplicate posts
$suspects = $this->dbobject->query_read_slave("
SELECT " . ($type == "thread" ? "thread.forumid, " : "") . "post.threadid, post.title, post.pagetext, post.userid, post.dateline
FROM " . TABLE_PREFIX . "post AS post
$query_join
WHERE post.userid = " . intval($this->registry->userinfo['userid']) . "
AND post.dateline > $suspection_period
ORDER BY post.dateline DESC
");
while ($suspect = $this->dbobject->fetch_array($suspects))
{
$current_post_hash = md5(($type == "thread" ? $forumid : $threadid) . $this->fetch_field('title') . $this->fetch_field('pagetext', 'post') . $userid);
$duplicated_post_hash = md5(($type == "thread" ? $suspect['forumid'] : $suspect['threadid']) . $suspect['title'] . $suspect['pagetext'] . $suspect['userid']);
if ($current_post_hash == $duplicated_post_hash)
{
$duplication_wait = $this->registry->options['ssgti_prevent_duplposts_floodchecktime'] - (TIMENOW - $suspect['dateline']);
$this->error('postduplicatecheck', $this->registry->options['ssgti_prevent_duplposts_floodchecktime'], $duplication_wait);
return false;
}
}
}
}
Save the modified file "includes/class_dm_threadpost.php" and upload it replacing the existing one.