import { existsSync } from 'fs'; import { v4 as uuidV4, v5 as uuidV5, NIL as uuidNIL } from 'uuid'; import { getImg, postImg, getImgType } from './image'; import type { Thread, Comment } from '../models/Thread' export async function processThreadIn(board: string, thread: Thread, comments = false) { if(!thread || !board) return; let imageId: string = thread.imageId; // if(existsSync(`dist/client/images/${imageId}`)) if(existsSync(`public/images/${imageId}`)) thread.imageId = `/images/${imageId}`; else thread.imageId = await getImg(imageId); thread.threadText = replaceURLs(thread.threadText, board, thread.id); if(!comments) return; for(let comment of thread.comments) { let cimageId = comment.imageId; // if(existsSync(`dist/client/images/${cimageId}`)) if(existsSync(`public/images/${cimageId}`)) comment.imageId = `/images/${cimageId}`; else comment.imageId = await getImg(cimageId); comment.commentText = replaceURLs(comment.commentText, board, thread.id); } } export async function processThreadOut(form: any): Thread { let img = form.get('image'); let t: Thread = { id: uuidV4(), threadName: form.get('ThreadName'), threadCreator: uuidV5(form.get('iphash'), uuidNIL), threadText: form.get('ThreadText'), comments: [], creationDate: Date.now(), imageId: await postImg(img), fileType: getImgType(img), } return t; } export async function processCommentOut(form: any): Comment { let img = form.get('image'); let c: Comment = {}; c.id = uuidV4(); c.commentCreator = uuidV5(form.get('iphash'), uuidNIL); c.commentText = form.get('CommentText'); c.creationDate = Date.now(); c.imageId = await postImg(img); c.fileType = getImgType(img); return c; } function replaceURLs(text: string, board: string, OPtid?: string): string { if(!text) return; if(OPtid) { let replyRegex = /(^|[^>])>>[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g; text = text.replace(replyRegex, (id) => { let showid = id; id = id.replace(/(>|\n| )/g, ''); if(id == OPtid) showid += "(OP)"; // this adds the targeted class // to the target id when its hovered on // and removes it when it stops hovering return ` ${showid} `; }); } // link to thread on other board let otherthreadlinkRegex = />>>\/.*\/[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g; text = text.replace(otherthreadlinkRegex, (id) => { let link = id.slice(4); let parts = link.split('/'); let linkid = parts[1]; let board = parts[0]; return ` >>>/${board}/${linkid} ` }); // link to thread on this board let threadlinkRegex = />>>[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g; text = text.replace(threadlinkRegex, (id) => { let linkid = id.slice(3); // remove the first >>> return ` ${id} ` }); // link to another board let otherboardRegex = />>>\/.*\/($|[^0-9a-fA-F])/g; text = text.replace(otherboardRegex, (id) => { let boardid = id.split('/')[1]; return ` >>>/${boardid}/ ` }); let newlineRegex = /(\r\n|\r|\n)/g; text = text.replace(newlineRegex, () => { return '
' }); let urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g; return text.replace(urlRegex, (url) => { var hyperlink = url; if (!hyperlink.match('^https?:\/\/')) { hyperlink = 'http://' + hyperlink; } return ' ' + url + ' ' }); }