add notifs
This commit is contained in:
parent
8c00723e16
commit
729a7b8c56
9 changed files with 158 additions and 5 deletions
3
db.js
3
db.js
|
@ -6,7 +6,8 @@ let db;
|
||||||
const sql = `CREATE TABLE IF NOT EXISTS auth (username TEXT, password TEXT);
|
const sql = `CREATE TABLE IF NOT EXISTS auth (username TEXT, password TEXT);
|
||||||
CREATE TABLE IF NOT EXISTS token (username TEXT, token TEXT);
|
CREATE TABLE IF NOT EXISTS token (username TEXT, token TEXT);
|
||||||
CREATE TABLE IF NOT EXISTS feeder (parentType TEXT, parentId TEXT, childType text, childId TEXT, sortId REAL);
|
CREATE TABLE IF NOT EXISTS feeder (parentType TEXT, parentId TEXT, childType text, childId TEXT, sortId REAL);
|
||||||
CREATE TABLE IF NOT EXISTS comment (username TEXT, date REAL, content TEXT, id TEXT);`
|
CREATE TABLE IF NOT EXISTS comment (username TEXT, date REAL, content TEXT, id TEXT);
|
||||||
|
CREATE TABLE IF NOT EXISTS messages (username TEXT, date REAL, content TEXT, link TEXT, status TEXT)`
|
||||||
|
|
||||||
async function initDb() {
|
async function initDb() {
|
||||||
if (db) return db;
|
if (db) return db;
|
||||||
|
|
2
lib.js
2
lib.js
|
@ -55,4 +55,4 @@ async function replyIterator(replies, db) {
|
||||||
return replies;
|
return replies;
|
||||||
}
|
}
|
||||||
|
|
||||||
export { importRouters, apiStat, replyIterator };
|
export { importRouters, apiStat, replyIterator, splitUp };
|
|
@ -139,7 +139,8 @@ body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
height: 4em;
|
height: 4em;
|
||||||
object-fit: cover;
|
width: 4em;
|
||||||
|
object-fit: contain;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
85
public/mail.svg
Normal file
85
public/mail.svg
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="46.070927"
|
||||||
|
height="35.089081"
|
||||||
|
viewBox="0 0 46.070927 35.089082"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
|
||||||
|
sodipodi:docname="mail.svg"
|
||||||
|
xml:space="preserve"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
showguides="false"
|
||||||
|
inkscape:zoom="7.9999996"
|
||||||
|
inkscape:cx="19.125001"
|
||||||
|
inkscape:cy="21.562501"
|
||||||
|
inkscape:window-width="1918"
|
||||||
|
inkscape:window-height="1056"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="22"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:lockguides="true" /><defs
|
||||||
|
id="defs1" /><g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-60.927941,-65.880288)"><rect
|
||||||
|
style="fill:#ab88aa;fill-opacity:1;stroke:#0d0c11;stroke-width:3.40158;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
id="rect1"
|
||||||
|
width="42.669346"
|
||||||
|
height="31.687502"
|
||||||
|
x="62.628731"
|
||||||
|
y="67.581078" /><path
|
||||||
|
id="rect2"
|
||||||
|
style="fill:#2f2835;fill-opacity:1;stroke:#0d0c11;stroke-width:3.40158;stroke-linecap:round;stroke-linejoin:round;paint-order:stroke fill markers"
|
||||||
|
d="m 62.628731,67.581078 h 42.669349 l -21.000001,16.125 z"
|
||||||
|
sodipodi:nodetypes="cccc" /><g
|
||||||
|
id="g4"
|
||||||
|
style="stroke-width:10;stroke-dasharray:none"
|
||||||
|
transform="matrix(0.472384,-0.27273103,0.27273103,0.472384,19.883398,76.726014)"><g
|
||||||
|
id="g11"
|
||||||
|
transform="rotate(30,85.351954,98.307072)"><path
|
||||||
|
id="path1"
|
||||||
|
style="fill:#ab88aa;fill-opacity:1;stroke:#0d0c11;stroke-width:3.56524;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
d="m 81.016571,58.516151 a 8.939758,8.939758 0 0 0 -8.939583,8.93959 8.939758,8.939758 0 0 0 2.080659,5.716912 l -4.001855,6.47455 9.009917,-3.468429 a 8.939758,8.939758 0 0 0 1.850862,0.217242 8.939758,8.939758 0 0 0 8.940282,-8.940275 8.939758,8.939758 0 0 0 -8.940282,-8.93959 z" /><circle
|
||||||
|
style="fill:#2f2835;fill-opacity:1;stroke:none;stroke-width:4.465;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
id="circle3"
|
||||||
|
cy="67.455902"
|
||||||
|
cx="81.016754"
|
||||||
|
r="5.9711423" /><circle
|
||||||
|
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
id="path5"
|
||||||
|
cx="81.378105"
|
||||||
|
cy="64.079811"
|
||||||
|
r="1.0672917" /><circle
|
||||||
|
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
id="circle5"
|
||||||
|
cx="81.037964"
|
||||||
|
cy="67.393112"
|
||||||
|
r="1.90881" /><circle
|
||||||
|
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
id="circle6"
|
||||||
|
cx="84.374725"
|
||||||
|
cy="67.856392"
|
||||||
|
r="0.65679485" /><circle
|
||||||
|
style="fill:#f8e0f5;fill-opacity:1;stroke:none;stroke-width:3.92901;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
|
id="circle7"
|
||||||
|
cx="77.847824"
|
||||||
|
cy="70.36042"
|
||||||
|
r="0.49259618" /></g></g></g></svg>
|
After Width: | Height: | Size: 4.1 KiB |
|
@ -49,6 +49,29 @@ router.post('/', async (req, res, next) => {
|
||||||
(+new Date)
|
(+new Date)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if (type == 'users') {
|
||||||
|
await db.run('INSERT INTO messages (username, date, content, link, status) VALUES(?,?,?,?,?)', [
|
||||||
|
id,
|
||||||
|
(+new Date),
|
||||||
|
`A user responded to your wall.`,
|
||||||
|
`/walls/get/users/${id}/0`,
|
||||||
|
'unread'
|
||||||
|
]);
|
||||||
|
} else if (type == 'comment') {
|
||||||
|
let commenter = await db.all('SELECT * FROM comment WHERE id = ?', [
|
||||||
|
id
|
||||||
|
]);
|
||||||
|
if (commenter[0]) {
|
||||||
|
await db.run('INSERT INTO messages (username, date, content, link, status) VALUES(?,?,?,?,?)', [
|
||||||
|
commenter[0].username,
|
||||||
|
(+new Date),
|
||||||
|
`A user responded to your post.`,
|
||||||
|
`/walls/get/comment/${id}/0`,
|
||||||
|
'unread'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
apiStat(res, next, `Comment submitted.`, '/comment/' + token)
|
apiStat(res, next, `Comment submitted.`, '/comment/' + token)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ function initr(req, res, next) {
|
||||||
{ link: '/walls/get/hub/main/0', icon: '/icon.svg', name: 'DervNet' },
|
{ link: '/walls/get/hub/main/0', icon: '/icon.svg', name: 'DervNet' },
|
||||||
{ link: '/walls/list', icon: '/walls.svg', name: 'Explore' },
|
{ link: '/walls/list', icon: '/walls.svg', name: 'Explore' },
|
||||||
{ link: '/users/' + (res.auth ? res.auth.username : ''), icon: '/login.svg', name: 'You' },
|
{ link: '/users/' + (res.auth ? res.auth.username : ''), icon: '/login.svg', name: 'You' },
|
||||||
{ link: '/info/tou', icon: '/icon.svg', name: 'Rules' },
|
{ link: '/you/messages', icon: '/mail.svg', name: 'Messages' },
|
||||||
{ link: '/you/logout', icon: '/logout.svg', name: 'Leave' }
|
{ link: '/you/logout', icon: '/logout.svg', name: 'Leave' }
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
import { Router } from "express";
|
import { Router } from "express";
|
||||||
|
import { initDb } from "../db.js";
|
||||||
|
|
||||||
|
let db = await initDb();
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
//todo: fix jank
|
//todo: fix jank
|
||||||
|
@ -38,7 +41,6 @@ router.get('/logout', (req, res, next) => {
|
||||||
next();
|
next();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
router.get('/new', (req, res, next) => {
|
router.get('/new', (req, res, next) => {
|
||||||
res.ctx.mainPage = 'form'
|
res.ctx.mainPage = 'form'
|
||||||
res.ctx.mainCtx = {
|
res.ctx.mainCtx = {
|
||||||
|
@ -69,4 +71,30 @@ router.get('/new', (req, res, next) => {
|
||||||
next();
|
next();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
router.get('/messages', async (req, res, next) => {
|
||||||
|
let {username, valid} = res.auth;
|
||||||
|
|
||||||
|
if (!valid) {
|
||||||
|
next();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let messages = await db.all('SELECT * FROM messages WHERE username = ? ORDER BY date DESC LIMIT ? OFFSET ?', [
|
||||||
|
username,
|
||||||
|
10,
|
||||||
|
0
|
||||||
|
]);
|
||||||
|
|
||||||
|
await db.run('UPDATE messages SET status = ? WHERE username = ?', [
|
||||||
|
'read',
|
||||||
|
username
|
||||||
|
]);
|
||||||
|
|
||||||
|
res.ctx.mainPage = 'messages'
|
||||||
|
res.ctx.mainCtx = {
|
||||||
|
messages
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
})
|
||||||
|
|
||||||
export default router;
|
export default router;
|
11
views/message.ejs
Normal file
11
views/message.ejs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<div class='main'>
|
||||||
|
<h1 class="header-big">
|
||||||
|
Message
|
||||||
|
</h1>
|
||||||
|
<div>
|
||||||
|
<span class='commentbox'><a class='link' href='<%= link %>'><%= content %></a> </span>
|
||||||
|
</div>
|
||||||
|
<% if (!isNaN(date * 1)) { %>
|
||||||
|
<div class='sub'><b>Sent on</b> <%= new Date(date).toISOString() %> </div>
|
||||||
|
<% } %>
|
||||||
|
</div>
|
4
views/messages.ejs
Normal file
4
views/messages.ejs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
<% for (let reply of messages) { %>
|
||||||
|
<%- include ('message.ejs', reply || {}) %>
|
||||||
|
<% } %>
|
Loading…
Reference in a new issue