add separate trigger threshold for TPH and PPH stats

merge-requests/208/head
fatchan 5 years ago
parent 8e5d1a15f8
commit 64d61c1117
  1. 3
      configs/main.json.example
  2. 2
      helpers/paramconverter.js
  3. 3
      models/forms/changeboardsettings.js
  4. 21
      models/forms/makepost.js
  5. 17
      views/pages/managesettings.pug

@ -53,7 +53,8 @@
"unlisted": false, "unlisted": false,
"captchaMode": 0, "captchaMode": 0,
"tphTrigger": 0, "tphTrigger": 0,
"tphTriggerAction": 0, "pphTrigger": 0,
"triggerAction": 0,
"forceAnon": false, "forceAnon": false,
"early404": true, "early404": true,
"ids": false, "ids": false,

@ -5,7 +5,7 @@ const { ObjectId } = require(__dirname+'/../db/db.js')
'checkedreports', 'checkedbans', 'checkedbanners', 'checkedaccounts']) //only these should be arrays, since express bodyparser can output arrays 'checkedreports', 'checkedbans', 'checkedbanners', 'checkedaccounts']) //only these should be arrays, since express bodyparser can output arrays
, trimFields = ['tags', 'uri', 'moderators', 'filters', 'announcement', 'description', 'message', , trimFields = ['tags', 'uri', 'moderators', 'filters', 'announcement', 'description', 'message',
'name', 'subject', 'email', 'password', 'default_name', 'report_reason', 'ban_reason', 'log_message'] //trim if we dont want filed with whitespace 'name', 'subject', 'email', 'password', 'default_name', 'report_reason', 'ban_reason', 'log_message'] //trim if we dont want filed with whitespace
, numberFields = ['filter_mode', 'captcha_mode', 'tph_trigger', 'tph_trigger_action', 'reply_limit', 'move_to_thread', , numberFields = ['filter_mode', 'captcha_mode', 'tph_trigger', 'pph_trigger', 'trigger_action', 'reply_limit', 'move_to_thread',
'max_files', 'thread_limit', 'thread', 'min_thread_message_length', 'min_reply_message_length', 'auth_level'] //convert these to numbers before they hit our routes 'max_files', 'thread_limit', 'thread', 'min_thread_message_length', 'min_reply_message_length', 'auth_level'] //convert these to numbers before they hit our routes
, banDurationRegex = /^(?<year>[\d]+y)?(?<month>[\d]+m)?(?<week>[\d]+w)?(?<day>[\d]+d)?(?<hour>[\d]+h)?$/ , banDurationRegex = /^(?<year>[\d]+y)?(?<month>[\d]+m)?(?<week>[\d]+w)?(?<day>[\d]+d)?(?<hour>[\d]+h)?$/
, msTime = require(__dirname+'/mstime.js') , msTime = require(__dirname+'/mstime.js')

@ -52,7 +52,8 @@ module.exports = async (req, res, next) => {
'userPostUnlink': req.body.user_post_unlink ? true : false, 'userPostUnlink': req.body.user_post_unlink ? true : false,
'captchaMode': typeof req.body.captcha_mode === 'number' && req.body.captcha_mode !== oldSettings.captchaMode ? req.body.captcha_mode : oldSettings.captchaMode, 'captchaMode': typeof req.body.captcha_mode === 'number' && req.body.captcha_mode !== oldSettings.captchaMode ? req.body.captcha_mode : oldSettings.captchaMode,
'tphTrigger': typeof req.body.tph_trigger === 'number' && req.body.tph_trigger !== oldSettings.tphTrigger ? req.body.tph_trigger : oldSettings.tphTrigger, 'tphTrigger': typeof req.body.tph_trigger === 'number' && req.body.tph_trigger !== oldSettings.tphTrigger ? req.body.tph_trigger : oldSettings.tphTrigger,
'tphTriggerAction': typeof req.body.tph_trigger_action === 'number' && req.body.tph_trigger_action !== oldSettings.tphTriggerAction ? req.body.tph_trigger_action : oldSettings.tphTriggerAction, 'pphTrigger': typeof req.body.pph_trigger === 'number' && req.body.pph_trigger !== oldSettings.pphTrigger ? req.body.pph_trigger : oldSettings.pphTrigger,
'triggerAction': typeof req.body.trigger_action === 'number' && req.body.trigger_action !== oldSettings.triggerAction ? req.body.trigger_action : oldSettings.triggerAction,
'threadLimit': typeof req.body.thread_limit === 'number' && req.body.thread_limit !== oldSettings.threadLimit ? req.body.thread_limit : oldSettings.threadLimit, 'threadLimit': typeof req.body.thread_limit === 'number' && req.body.thread_limit !== oldSettings.threadLimit ? req.body.thread_limit : oldSettings.threadLimit,
'replyLimit': typeof req.body.reply_limit === 'number' && req.body.reply_limit !== oldSettings.replyLimit ? req.body.reply_limit : oldSettings.replyLimit, 'replyLimit': typeof req.body.reply_limit === 'number' && req.body.reply_limit !== oldSettings.replyLimit ? req.body.reply_limit : oldSettings.replyLimit,
'maxFiles': typeof req.body.max_files === 'number' && req.body.max_files !== oldSettings.maxFiles ? req.body.max_files : oldSettings.maxFiles, 'maxFiles': typeof req.body.max_files === 'number' && req.body.max_files !== oldSettings.maxFiles ? req.body.max_files : oldSettings.maxFiles,

@ -52,7 +52,7 @@ module.exports = async (req, res, next) => {
const { filters, filterBanDuration, filterMode, const { filters, filterBanDuration, filterMode,
maxFiles, forceAnon, replyLimit, maxFiles, forceAnon, replyLimit,
threadLimit, ids, userPostSpoiler, threadLimit, ids, userPostSpoiler,
defaultName, tphTrigger, tphTriggerAction, defaultName, pphTrigger, tphTrigger, triggerAction,
captchaMode, locked, allowedFileTypes, flags } = res.locals.board.settings; captchaMode, locked, allowedFileTypes, flags } = res.locals.board.settings;
if (locked === true) { if (locked === true) {
await deleteTempFiles(req).catch(e => console.error); await deleteTempFiles(req).catch(e => console.error);
@ -366,25 +366,24 @@ module.exports = async (req, res, next) => {
const postId = await Posts.insertOne(res.locals.board, data, thread); const postId = await Posts.insertOne(res.locals.board, data, thread);
let enableCaptcha = false; let enableCaptcha = false;
if (!data.thread //if this is a new thread if (triggerAction > 0 //trigger is enabled
&& tphTriggerAction > 0 //and the triger mode is not nothing && (tphTrigger > 0 || pphTrigger > 0) //and we have a trigger > 0 for threads or posts
&& ((tphTriggerAction < 3 && captchaMode < tphTriggerAction) //and captcha mode less than captcha trigger && ((triggerAction < 3 && captchaMode < triggerAction) //and captcha mode less than trigger if trigger < 2
|| (tphTriggerAction === 3 && locked !== true))) { //and not locked with lock trigger || (triggerAction === 3 && locked !== true))) { //or trigger is to lock and board not locked
const pastHourMongoId = Mongo.ObjectId.createFromTime(Math.floor((Date.now() - msTime.hour)/1000)); const pastHourMongoId = Mongo.ObjectId.createFromTime(Math.floor((Date.now() - msTime.hour)/1000));
//count threads in past hour //count threads in past hour
const hourPosts = await Stats.getHourPosts(res.locals.board._id); const hourPosts = await Stats.getHourPosts(res.locals.board._id);
//if its above the trigger //if its above the trigger
if (hourPosts && hourPosts.tph && hourPosts.tph >= tphTrigger) { //TODO: add an option to check pph OR tph, not just tph if (hourPosts && (hourPosts.tph >= tphTrigger || hourPosts.pph > pphTrigger)) { //TODO: add an option to check pph OR tph, not just tph
//update in memory for other stuff done e.g. rebuilds //update in memory for other stuff done e.g. rebuilds
const update = { const update = {
'$set': {} '$set': {}
}; };
if (tphTriggerAction < 3) { if (triggerAction < 3) {
res.locals.board.settings.captchaMode = tphTriggerAction; res.locals.board.settings.captchaMode = triggerAction;
update['$set']['settings.captchaMode'] = tphTriggerAction; update['$set']['settings.captchaMode'] = triggerAction;
enableCaptcha = true; enableCaptcha = true;
} } else if (triggerAction === 3) {
if (tphTriggerAction === 3) {
res.locals.board.settings.locked = true; res.locals.board.settings.locked = true;
update['$set']['settings.locked'] = true; update['$set']['settings.locked'] = true;
} }

@ -159,12 +159,15 @@ block content
.label TPH Trigger Threshold .label TPH Trigger Threshold
input(type='number', name='tph_trigger', value=board.settings.tphTrigger) input(type='number', name='tph_trigger', value=board.settings.tphTrigger)
.row .row
.label TPH Trigger Action .label PPH Trigger Threshold
select(name='tph_trigger_action') input(type='number', name='pph_trigger', value=board.settings.pphTrigger)
option(value='0', selected=board.settings.tphTriggerAction === 0) Do nothing .row
option(value='1', selected=board.settings.tphTriggerAction === 1) Enable captcha for new thread .label TPH/PPH Trigger Action
option(value='2', selected=board.settings.tphTriggerAction === 2) Enable captcha for all posts select(name='trigger_action')
option(value='3', selected=board.settings.tphTriggerAction === 3) Lock Board option(value='0', selected=board.settings.triggerAction === 0) Do nothing
option(value='1', selected=board.settings.triggerAction === 1) Enable captcha for new thread
option(value='2', selected=board.settings.triggerAction === 2) Enable captcha for all posts
option(value='3', selected=board.settings.triggerAction === 3) Lock Board
.row .row
.label Filters .label Filters
textarea(name='filters' placeholder='newline separated, max 50') #{board.settings.filters.join('\n')} textarea(name='filters' placeholder='newline separated, max 50') #{board.settings.filters.join('\n')}
@ -173,7 +176,7 @@ block content
select(name='filter_mode') select(name='filter_mode')
option(value='0', selected=board.settings.filterMode === 0) Do nothing option(value='0', selected=board.settings.filterMode === 0) Do nothing
option(value='1', selected=board.settings.filterMode === 1) Block post option(value='1', selected=board.settings.filterMode === 1) Block post
option(value='2', selected=board.settings.filterMode === 2) Auto ban option(value='2', selected=board.settings.filterMode === 2) Ban
.row .row
.label Filter Auto Ban Duration .label Filter Auto Ban Duration
input(type='text' name='ban_duration' placeholder='e.g. 1w' value=board.settings.filterBanDuration) input(type='text' name='ban_duration' placeholder='e.g. 1w' value=board.settings.filterBanDuration)

Loading…
Cancel
Save