From 8564ba4022f54e7c375349b43c7cb5227f7c52d8 Mon Sep 17 00:00:00 2001 From: Mystikfluu Date: Sun, 18 Sep 2022 13:28:26 +0200 Subject: [PATCH] add beta file uploads --- js/posts.js | 138 ++++++++++++++++++++++++++++++++++++--- routes/api/post.js | 112 +++++++++++++++++++++++++++++-- server.js | 28 ++++++-- user_uploads/test_upload | 1 + 4 files changed, 259 insertions(+), 20 deletions(-) create mode 100644 user_uploads/test_upload diff --git a/js/posts.js b/js/posts.js index cd3f2e3..242d48f 100644 --- a/js/posts.js +++ b/js/posts.js @@ -19,7 +19,22 @@ socket.addEventListener("message", async function (event) { let item = ds.data let username = decURIComp(item.post_user_name) if(message == "new_post" && decURIComp(item.post_receiver_name) == currentChannel) { - await createPost(username,decURIComp(item.post_text),item.post_time,item.post_special_text,highest_id+1,item.post_from_bot,item.post_reply_id,true) + await createPost( + username, + decURIComp(item.post_text), + item.post_time, + item.post_special_text, + highest_id+1, + item.post_from_bot, + item.post_reply_id, + true, + item.user_avatar, + item.files[0], + item.files[1], + item.files[2], + item.files[3], + item.files[4] + ) if(user["username"]!=username)mainNoti(username) let highest_known_posts = await (await fetch(`/api/getPostsLowerThan?id=${highest_id+28}&channel=${currentChannel}`)).json() @@ -34,11 +49,19 @@ socket.addEventListener("message", async function (event) { } }) +socket.addEventListener("open",()=> { + switchChannel(currentChannel) +}) + var cd = true //inversed "cooldown" function postMessage() { let msg = getById("post-text").value let len = msg.length + if(len==0){ + alert("you have to enter a message!") + return; + }; if(len > 1000) { alert(`Your message cant contain more than 1000 characters! (${len})`) return @@ -62,6 +85,7 @@ var cd = true //inversed "cooldown" formdata.append("file_"+i,files[i]) } files = [] + getById("filesDiv").innerHTML="" fetch("/api/post", { method: "POST", body: formdata @@ -117,7 +141,26 @@ async function reply_link_clicked(reply_channel,reply_id) { } } -async function createPost(username,text,time,specialtext,postid,isbot,reply_id,add_on_top,avatar_src) { +const image_types = { + "png":true, + "jpg":true, + "jpeg":true +} + +function iconLink(name) { + if(!name){ + //if(typeof name === 'undefined' || typeof name === "null"){ + return undefined; + } + console.log(name,name.lastIndexOf("\."),name.substring(name.lastIndexOf("\.")+1)); + let extension = name.substring(name.lastIndexOf("\.")+1) + if(extension in image_types) { + return "/user_uploads/"+name; + } + return "/api/getFileIcon/"+extension +} + +async function createPost(username,text,time,specialtext,postid,isbot,reply_id,add_on_top,avatar_src,file0,file1,file2,file3,file4) { if(!specialtext)specialtext="" const newDiv = createElement("div"); const newP = createElement("p"); @@ -198,13 +241,6 @@ async function createPost(username,text,time,specialtext,postid,isbot,reply_id,a replyA.appendChild(replyBr) replyA.classList.add("no-link-style") - // async function onclick(event) { - // event.preventDefault() - - // } - // replyDiv.onclick = function() { - // reply_link_clicked(reply_channel, reply_id) - // } replyDiv.appendChild(replyA) @@ -219,6 +255,72 @@ async function createPost(username,text,time,specialtext,postid,isbot,reply_id,a newDiv.appendChild(newP) newDiv.innerHTML += filterPost(text) newDiv.id = postid + + /* + FILES + */ + + const filesP = createElement("p") + const file0_img = createElement("img") + const file1_img = createElement("img") + const file2_img = createElement("img") + const file3_img = createElement("img") + const file4_img = createElement("img") + + file0_img.src = iconLink(file0) + file1_img.src = iconLink(file1) + file2_img.src = iconLink(file2) + file3_img.src = iconLink(file3) + file4_img.src = iconLink(file4) + + file0_img.width = 50 + file1_img.width = 50 + file2_img.width = 50 + file3_img.width = 50 + file4_img.width = 50 + + + if(file0){ + filesP.appendChild(file0_img) + + file0_img.onclick = function(event) { + console.warn("TODO: Create Modal"); + } + } + if(file1){ + filesP.appendChild(file1_img) + + file1_img.onclick = function(event) { + console.warn("TODO: Create Modal"); + } + } + if(file2){ + filesP.appendChild(file2_img) + + file2_img.onclick = function(event) { + console.warn("TODO: Create Modal"); + } + } + if(file3){ + filesP.appendChild(file3_img) + + file3_img.onclick = function(event) { + console.warn("TODO: Create Modal"); + } + } + if(file4){ + filesP.appendChild(file4_img) + + file4_img.onclick = function(event) { + console.warn("TODO: Create Modal"); + } + } + newDiv.appendChild(filesP) + + /* + Adding the post to the posts list + */ + let posts_div = getById("posts") if(add_on_top) { posts_div.insertBefore(newDiv, posts_div.children[0]); @@ -253,7 +355,22 @@ async function main(){ let post_promises = [] for(i in all_posts) { let item = all_posts[i] - let created = createPost(decURIComp(item.post_user_name),decURIComp(item.post_text),item.post_time,item.post_special_text,item.post_id,item.post_from_bot,item.post_reply_id,false,item.User_Avatar) + let created = createPost( + decURIComp(item.post_user_name), + decURIComp(item.post_text), + item.post_time, + item.post_special_text, + item.post_id, + item.post_from_bot, + item.post_reply_id, + false, + item.User_Avatar, + item.file_0, + item.file_1, + item.file_2, + item.file_3, + item.file_4 + ) post_promises.push(created) } @@ -376,6 +493,7 @@ var files = [] function addFile(file) { if(file.size > 100000) { + alert("that file is too large, max size: 100KiB") console.log("file is too big: ", file.name, file.type, file.size); return; } diff --git a/routes/api/post.js b/routes/api/post.js index 549ebd8..4d74268 100644 --- a/routes/api/post.js +++ b/routes/api/post.js @@ -79,8 +79,104 @@ export const setup = function (router, con, server) { res.json({ "error": "no message to post" }); return; } - let sql = `insert into ipost.posts (post_user_name,post_text,post_time,post_receiver_name,post_from_bot,post_reply_id) values (?,?,?,?,?,?);`; - let values = [encodeURIComponent(res.locals.username), req.body.message, Date.now(), req.body.receiver, res.locals.isbot, reply_id]; + console.log(req.body); + let __dirname = server.dirname + + let file0_name="",file1_name="",file2_name="",file3_name="",file4_name = "" + if(req.files["file_0"] !== undefined) { + let file = req.files["file_0"] + const file0_id = server.genstring(20) + console.log(file.name); + file0_name = file0_id+"/"+(file.name.substring(0,25)) + server.ensureExists(__dirname + "/user_uploads/"+file0_id,undefined,(err)=>{ + if(err) { + console.error(err) + return; + } + file.mv(__dirname + "/user_uploads/"+file0_name,(err2) => { + if(err2) { + console.error(err2) + return; + } + }) + }) + } + if(req.files["file_1"] !== undefined) { + let file = req.files["file_1"] + const file1_id = server.genstring(20) + console.log(file.name); + file1_name = file1_id+"/"+(file.name.substring(0,25)) + server.ensureExists(__dirname + "/user_uploads/"+file1_id,undefined,(err)=>{ + if(err) { + console.error(err) + return; + } + file.mv(__dirname + "/user_uploads/"+file1_name,(err2) => { + if(err2) { + console.error(err2) + return; + } + }) + }) + } + if(req.files["file_2"] !== undefined) { + let file = req.files["file_2"] + const file2_id = server.genstring(20) + console.log(file.name); + file2_name = file2_id+"/"+(file.name.substring(0,25)) + server.ensureExists(__dirname + "/user_uploads/"+file2_id,undefined,(err)=>{ + if(err) { + console.error(err) + return; + } + file.mv(__dirname + "/user_uploads/"+file2_name,(err2) => { + if(err2) { + console.error(err2) + return; + } + }) + }) + } + if(req.files["file_3"] !== undefined) { + let file = req.files["file_3"] + const file3_id = server.genstring(20) + console.log(file.name); + file3_name = file3_id+"/"+(file.name.substring(0,25)) + server.ensureExists(__dirname + "/user_uploads/"+file3_id,undefined,(err)=>{ + if(err) { + console.error(err) + return; + } + file.mv(__dirname + "/user_uploads/"+file3_name,(err2) => { + if(err2) { + console.error(err2) + return; + } + }) + }) + } + if(req.files["file_4"] !== undefined) { + let file = req.files["file_0"] + const file4_id = server.genstring(20) + console.log(file.name); + file4_name = file4_id+"/"+(file.name.substring(0,25)) + server.ensureExists(__dirname + "/user_uploads/"+file4_id,undefined,(err)=>{ + if(err) { + console.error(err) + return; + } + file.mv(__dirname + "/user_uploads/"+file4_name,(err2) => { + if(err2) { + console.error(err2) + return; + } + }) + }) + } + + + let sql = `insert into ipost.posts (post_user_name,post_text,post_time,post_receiver_name,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4) values (?,?,?,?,?,?,?,?,?,?,?);`; + let values = [encodeURIComponent(res.locals.username), req.body.message, Date.now(), req.body.receiver, res.locals.isbot, reply_id,file0_name,file1_name,file2_name,file3_name,file4_name]; con.query(sql, values, function (err, result) { if (err){ res.status(500) @@ -95,14 +191,22 @@ export const setup = function (router, con, server) { post_special_text: "", post_receiver_name: req.body.receiver, post_from_bot: res.locals.isbot, - post_reply_id: reply_id + post_reply_id: reply_id, + user_avatar: res.locals.avatar, + files: [ + file0_name, + file1_name, + file2_name, + file3_name, + file4_name + ] }; let message = { message: "new_post", data: post_obj }; let messagestr = JSON.stringify(message); - server.wss.clients.forEach( function (ws) { + server.wss.clients.forEach(function(ws) { ws.send(messagestr); }); res.json({ "success": "successfully posted message" }); diff --git a/server.js b/server.js index 4a1325e..94b6d74 100644 --- a/server.js +++ b/server.js @@ -453,7 +453,9 @@ var commonfunctions = { increaseAccountAPICall, increaseIndividualCall, wss, - genstring + genstring, + ensureExists, + "dirname": __dirname }; optionssetup(router, con, commonfunctions); allsetup(router, con, commonfunctions); @@ -600,7 +602,7 @@ router.get("/api/getPosts/*", function (req, res) { router.get("/api/getPosts", function (req, res) { res.set("Access-Control-Allow-Origin", "*"); if (req.query.channel != undefined) { - let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,User_Avatar from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_receiver_name = ? group by post_id order by post_id desc limit 30;`; + let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,User_Avatar,file_0,file_1,file_2,file_3,file_4 from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_receiver_name = ? group by post_id order by post_id desc limit 30;`; con.query(sql, [encodeURIComponent(req.query.channel)], function (err, result) { if (err) throw err; @@ -608,7 +610,7 @@ router.get("/api/getPosts", function (req, res) { }); } else { //fallback - let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id from ipost.posts where (post_receiver_name is null or post_receiver_name = 'everyone') group by post_id order by post_id desc limit 30;`; + let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where (post_receiver_name is null or post_receiver_name = 'everyone') group by post_id order by post_id desc limit 30;`; con.query(sql, [], function (err, result) { if (err) throw err; @@ -619,7 +621,7 @@ router.get("/api/getPosts", function (req, res) { router.get("/api/getPostsLowerThan", function (req, res) { res.set("Access-Control-Allow-Origin", "*"); if (req.query.channel != undefined) { - let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id from ipost.posts where ((post_receiver_name = ?) and (post_id < ?)) group by post_id order by post_id desc limit 30;`; + let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where ((post_receiver_name = ?) and (post_id < ?)) group by post_id order by post_id desc limit 30;`; con.query(sql, [encodeURIComponent(req.query.channel), req.query.id], function (err, result) { if (err) throw err; @@ -627,7 +629,7 @@ router.get("/api/getPostsLowerThan", function (req, res) { }); } else { //fallback - let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id from ipost.posts where ((post_receiver_name is null or post_receiver_name = 'everyone') and (post_id < ?)) group by post_id order by post_id desc limit 30;`; + let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,file_0,file_1,file_2,file_3,file_4 from ipost.posts where ((post_receiver_name is null or post_receiver_name = 'everyone') and (post_id < ?)) group by post_id order by post_id desc limit 30;`; con.query(sql, [req.query.id], function (err, result) { if (err) throw err; @@ -638,7 +640,7 @@ router.get("/api/getPostsLowerThan", function (req, res) { router.get("/api/getPost", function (req, res) { res.set("Access-Control-Allow-Origin", "*"); let arg = req.query.id; - let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,post_receiver_name,User_Avatar from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_id=?;`; + let sql = `select post_user_name,post_text,post_time,post_special_text,post_id,post_from_bot,post_reply_id,post_receiver_name,User_Avatar,file_0,file_1,file_2,file_3,file_4 from ipost.posts inner join ipost.users on (User_Name = post_user_name) where post_id=?;`; con.query(sql, [arg], function (err, result) { if (err) throw err; @@ -836,6 +838,20 @@ router.get("/images/*", (request, response) => { } return; }); + +router.get("/user_uploads/*", (request, response) => { + if (!increaseUSERCall(request, response)) + return; + if (existsSync(__dirname + request.originalUrl)) { + response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish + response.sendFile(__dirname + request.originalUrl); + } + else { + response.status(404).send("no file with that name found"); + } + return; +}); + router.get("/avatars/*", (request, response, next) => { if (!increaseUSERCall(request, response)) return; diff --git a/user_uploads/test_upload b/user_uploads/test_upload new file mode 100644 index 0000000..5788ed0 --- /dev/null +++ b/user_uploads/test_upload @@ -0,0 +1 @@ +this is a test upload \ No newline at end of file