Merge branch 'dice-reroll-fix' into 'dev'

Dice reroll fix

See merge request fatchan/jschan!174
merge-requests/208/head
Thomas Lynch 4 years ago
commit 8aab859305
  1. 2
      README.md
  2. 49
      helpers/posting/diceroll.js
  3. 19
      helpers/posting/markdown.js
  4. 6
      models/forms/addnews.js
  5. 8
      models/forms/changeboardsettings.js
  6. 5
      models/forms/editpost.js
  7. 6
      models/forms/makepost.js

@ -30,7 +30,7 @@ Anonymous imageboard software.
##### Requirements
- Linux - Debian used in this example
- Node.j - the application runtime
- Node.js - the application runtime
- MongoDB - the database
- Redis - session store, task queue, locks, caching, websocket message arbiter
- Nginx - webserver/proxy, serve static files, handle https, GeoIP lookup

@ -1,17 +1,40 @@
'use strict';
module.exports = (match, numdice, numsides, operator, modifier) => {
numdice = parseInt(numdice);
numsides = parseInt(numsides);
let sum = (Math.floor(Math.random() * numsides) + 1) * numdice;
if (modifier && operator) {
modifier = parseInt(modifier);
//do i need to make sure it doesnt go negative or maybe give absolute value?
if (operator === '+') {
sum += modifier;
} else {
sum -= modifier;
module.exports = {
regexPrepare: /##(?<numdice>[1-9][0-9]{0,1})d(?<numsides>1[0-9]{1,8}|[2-9][0-9]{0,8})(?:(?<operator>[+-])(?<modifier>[1-9][0-9]{0,8}))?(?<value>=[1-9][0-9]{0,8})?/gmi,
regexMarkdown: /##(?<numdice>[1-9][0-9]{0,1})d(?<numsides>1[0-9]{1,8}|[2-9][0-9]{0,8})(?:(?<operator>[+-])(?<modifier>[1-9][0-9]{0,8}))?&#x3D;(?<value>[1-9][0-9]{0,8})/gmi,
prepare: (force) => (match, numdice, numsides, operator, modifier, value) => {
if (!force && value) {
return match;
}
}
return `<img src='/file/dice.png' height='16' width='16' /><span class='dice'>(${match}) Rolled ${numdice} dice with ${numsides} sides${modifier ? ' and modifier '+operator+modifier : '' } = ${sum}</span>`;
numdice = parseInt(numdice);
numsides = parseInt(numsides);
let matchWithoutValue = match.replace(/=.*/, '');
let sum = 0;
for (let i = 0; i < numdice; ++i) {
sum += Math.floor(Math.random() * numsides) + 1;
}
if (modifier && operator) {
modifier = parseInt(modifier);
//do i need to make sure it doesnt go negative or maybe give absolute value?
if (operator === '+') {
sum += modifier;
} else {
sum -= modifier;
}
}
return `${matchWithoutValue}=${sum}${value ? value : ''}`;
},
markdown: (match, numdice, numsides, operator, modifier, value) => {
numdice = parseInt(numdice);
numsides = parseInt(numsides);
value = parseInt(value);
let matchWithoutValue = match.replace(/&#x3D;.*/, '');
return `<img src='/file/dice.png' height='16' width='16' /><span class='dice'>(${matchWithoutValue}) Rolled ${numdice} dice with ${numsides} sides${modifier ? ' and modifier '+operator+modifier : '' } = ${value}</span>`;
},
}

@ -14,11 +14,11 @@ const greentextRegex = /^&gt;((?!&gt;\d+|&gt;&gt;&#x2F;\w+(&#x2F;\d*)?).*)/gm
, codeRegex = /(?:(?<language>[a-z+]{1,10})\r?\n)?(?<code>[\s\S]+)/i
, splitRegex = /```([\s\S]+?)```/gm
, trimNewlineRegex = /^\s*(\r?\n)*|(\r?\n)*$/g
, diceRegex = /##(?<numdice>[1-9][0-9]{0,8})d(?<numsides>1[0-9]{1,8}|[2-9][0-9]{0,8})(?:(?<operator>[+-])(?<modifier>[1-9][0-9]{0,8}))?/gmi
, getDomain = (string) => string.split(/\/\/|\//)[1] //unused atm
, escape = require(__dirname+'/escape.js')
, { highlight, highlightAuto } = require('highlight.js')
, { highlightOptions } = require(__dirname+'/../../configs/main.js')
, diceroll = require(__dirname+'/diceroll.js')
, replacements = [
{ regex: pinktextRegex, cb: (match, pinktext) => `<span class='pinktext'>&lt;${pinktext}</span>` },
{ regex: greentextRegex, cb: (match, greentext) => `<span class='greentext'>&gt;${greentext}</span>` },
@ -31,11 +31,26 @@ const greentextRegex = /^&gt;((?!&gt;\d+|&gt;&gt;&#x2F;\w+(&#x2F;\d*)?).*)/gm
{ regex: monoRegex, cb: (match, mono) => `<span class='mono'>${mono}</span>` },
{ regex: linkRegex, cb: require(__dirname+'/linkmatch.js') },
{ regex: detectedRegex, cb: (match, detected) => `<span class='detected'>${detected}</span>` },
{ regex: diceRegex, cb: require(__dirname+'/diceroll.js') },
{ regex: diceroll.regexMarkdown, cb: diceroll.markdown },
];
module.exports = {
prepareMarkdown: (text, force) => {
if (!text || text.length === 0) {
return text;
}
const chunks = text.split(splitRegex);
for (let i = 0; i < chunks.length; i++) {
//every other chunk will be a code block
if (i % 2 === 0) {
chunks[i] = chunks[i].replace(
diceroll.regexPrepare, diceroll.prepare(force));
}
}
return chunks.join('');
},
markdown: (text) => {
const chunks = text.split(splitRegex);
for (let i = 0; i < chunks.length; i++) {

@ -3,16 +3,18 @@
const { News } = require(__dirname+'/../../db/')
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js')
, buildQueue = require(__dirname+'/../../queue.js')
, { prepareMarkdown } = require(__dirname+'/../../helpers/posting/markdown.js')
, messageHandler = require(__dirname+'/../../helpers/posting/message.js');
module.exports = async (req, res, next) => {
const { message: markdownNews } = await messageHandler(req.body.message, null, null);
const message = prepareMarkdown(req.body.message, false);
const { message: markdownNews } = await messageHandler(message, null, null);
const post = {
'title': req.body.title,
'message': {
'raw': req.body.message,
'raw': message,
'markdown': markdownNews
},
'date': new Date(),

@ -7,6 +7,7 @@ const { Boards, Posts, Accounts } = require(__dirname+'/../../db/')
, buildQueue = require(__dirname+'/../../queue.js')
, { remove } = require('fs-extra')
, deletePosts = require(__dirname+'/deletepost.js')
, { prepareMarkdown } = require(__dirname+'/../../helpers/posting/markdown.js')
, messageHandler = require(__dirname+'/../../helpers/posting/message.js')
, countryCodes = new Set(['??', 'AD','AE','AF','AG','AI','AL','AM','AO','AQ','AR','AS','AT','AU','AW','AX','AZ','BA','BB','BD','BE','BF','BG','BH','BI','BJ','BL','BM','BN','BO','BQ','BR','BS','BT','BV','BW','BY','BZ','CA','CC','CD','CF','CG','CH','CI','CK','CL','CM','CN','CO','CR','CU','CV','CW','CX','CY','CZ','DE','DJ','DK','DM','DO','DZ','EC','EE','EG','EH','ER','ES','ET','FI','FJ','FK','FM','FO','FR','GA','GB','GD','GE','GF','GG','GH','GI','GL','GM','GN','GP','GQ','GR','GS','GT','GU','GW','GY','HK','HM','HN','HR','HT','HU','ID','IE','IL','IM','IN','IO','IQ','IR','IS','IT','JE','JM','JO','JP','KE','KG','KH','KI','KM','KN','KP','KR','KW','KY','KZ','LA','LB','LC','LI','LK','LR','LS','LT','LU','LV','LY','MA','MC','MD','ME','MF','MG','MH','MK','ML','MM','MN','MO','MP','MQ','MR','MS','MT','MU','MV','MW','MX','MY','MZ','NA','NC','NE','NF','NG','NI','NL','NO','NP','NR','NU','NZ','OM','PA','PE','PF','PG','PH','PK','PL','PM','PN','PR','PS','PT','PW','PY','QA','RE','RO','RS','RU','RW','SA','SB','SC','SD','SE','SG','SH','SI','SJ','SK','SL','SM','SN','SO','SR','SS','ST','SV','SX','SY','SZ','TC','TD','TF','TG','TH','TJ','TK','TL','TM','TN','TO','TR','TT','TV','TW','TZ','UA','UG','UM','US','UY','UZ','VA','VC','VE','VG','VI','VN','VU','WF','WS','XK','YE','YT','ZA','ZM','ZW'])
, trimSetting = (setting, oldSetting) => {
@ -30,9 +31,10 @@ module.exports = async (req, res, next) => {
//array of promises we might need
const promises = [];
const announcement = req.body.announcement === null ? null : prepareMarkdown(req.body.announcement, false);
let markdownAnnouncement = oldSettings.announcement.markdown;
if (req.body.announcement !== oldSettings.announcement.raw) {
const { message } = await messageHandler(req.body.announcement, req.params.board, null);
if (announcement !== oldSettings.announcement.raw) {
const { message } = await messageHandler(announcement, req.params.board, null);
markdownAnnouncement = message; //is there a destructure syntax for this?
}
@ -113,7 +115,7 @@ module.exports = async (req, res, next) => {
'strictFiltering': booleanSetting(req.body.strict_filtering),
'customCss': globalLimits.customCss.enabled ? (req.body.custom_css !== null ? req.body.custom_css : oldSettings.customCss) : null,
'announcement': {
'raw': req.body.announcement !== null ? req.body.announcement : oldSettings.announcement.raw,
'raw': announcement !== null ? announcement : oldSettings.announcement.raw,
'markdown': req.body.announcement !== null ? markdownAnnouncement : oldSettings.announcement.markdown,
},
'allowedFileTypes': {

@ -3,6 +3,7 @@
const { Posts, Bans, Modlogs } = require(__dirname+'/../../db/')
, Mongo = require(__dirname+'/../../db/db.js')
, getTripCode = require(__dirname+'/../../helpers/posting/tripcode.js')
, { prepareMarkdown } = require(__dirname+'/../../helpers/posting/markdown.js')
, messageHandler = require(__dirname+'/../../helpers/posting/message.js')
, nameHandler = require(__dirname+'/../../helpers/posting/name.js')
, { previewReplies, strictFiltering } = require(__dirname+'/../../configs/main.js')
@ -75,7 +76,8 @@ todo: handle some more situations
//new name, trip and cap
const { name, tripcode, capcode } = await nameHandler(req.body.name, res.locals.permLevel, board.settings);
//new message and quotes
const { message, quotes, crossquotes } = await messageHandler(req.body.message, req.body.board, post.thread);
const nomarkup = prepareMarkdown(req.body.message, false);
const { message, quotes, crossquotes } = await messageHandler(nomarkup, req.body.board, post.thread);
//todo: email and subject (probably dont need any transformation since staff bypass limits on forceanon, and it doesnt have to account for sage/etc
//intersection/difference of quotes sets for linking and unlinking
@ -125,6 +127,7 @@ todo: handle some more situations
username: req.body.hide_name ? 'Hidden User' : req.session.user,
date: new Date(),
},
nomarkup,
message,
quotes,
crossquotes,

@ -10,6 +10,7 @@ const path = require('path')
, { Stats, Posts, Boards, Files, Bans } = require(__dirname+'/../../db/')
, cache = require(__dirname+'/../../redis.js')
, nameHandler = require(__dirname+'/../../helpers/posting/name.js')
, { prepareMarkdown } = require(__dirname+'/../../helpers/posting/markdown.js')
, messageHandler = require(__dirname+'/../../helpers/posting/message.js')
, moveUpload = require(__dirname+'/../../helpers/files/moveupload.js')
, mimeTypes = require(__dirname+'/../../helpers/files/mimetypes.js')
@ -335,7 +336,8 @@ module.exports = async (req, res, next) => {
//get name, trip and cap
const { name, tripcode, capcode } = await nameHandler(req.body.name, res.locals.permLevel, res.locals.board.settings);
//get message, quotes and crossquote array
const { message, quotes, crossquotes } = await messageHandler(req.body.message, req.params.board, req.body.thread);
const nomarkup = prepareMarkdown(req.body.message, true);
const { message, quotes, crossquotes } = await messageHandler(nomarkup, req.params.board, req.body.thread);
//build post data for db
const data = {
@ -347,7 +349,7 @@ module.exports = async (req, res, next) => {
capcode,
subject,
'message': message || null,
'nomarkup': req.body.message || null,
'nomarkup': nomarkup || null,
'thread': req.body.thread || null,
password,
email,

Loading…
Cancel
Save