Version 1.0\nusable, but some stuff still to do
This commit is contained in:
157
app.js
Normal file → Executable file
157
app.js
Normal file → Executable file
@@ -1,48 +1,111 @@
|
||||
const express = require('express');
|
||||
const crypto = require('crypto');
|
||||
const crypto = require('crypto'); // For encrypting passwords
|
||||
const { fromUnixTime, format, getUnixTime } = require("date-fns")
|
||||
const fs = require('fs');
|
||||
const users = require('./users.js');
|
||||
const posts = require('./posts.js');
|
||||
const config = require('./config.js');
|
||||
const app = express();
|
||||
const port = 8005;
|
||||
const port = 8080;
|
||||
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
app.use(express.json());
|
||||
app.use(express.static(config.root_path));
|
||||
|
||||
function unix_time_to_date_format(unix_time) {
|
||||
let date_object = new Date(unix_time)
|
||||
let formatter = new Intl.DateTimeFormat(config.date_format,config.date_options);
|
||||
let formatted_time = formatter.format(date_object);
|
||||
|
||||
return formatted_time
|
||||
function get_userID(username) {
|
||||
for (let i = 0; i < users.users.length; i++) {
|
||||
if (users.users[i]['username'] == username) {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
function replace_format_indicators(input_string, post_index) {
|
||||
function unix_time_to_date_format(unix_time) {
|
||||
date = fromUnixTime(unix_time)
|
||||
formatted_date = format(date, config.date_format)
|
||||
|
||||
return formatted_date
|
||||
}
|
||||
|
||||
function unix_time_to_rss_date(unix_time) {
|
||||
date = fromUnixTime(unix_time)
|
||||
formatted_date = format(date, "EEE, dd MMM yyyy HH:mm:ss")
|
||||
return `${formatted_date} ${config.time_zone}`
|
||||
}
|
||||
|
||||
function hyperlink_tags(tags) {
|
||||
string = ""
|
||||
for (let tag_index = 0; tag_index < tags.length; tag_index++) {
|
||||
string += `<a href="/tag/${tags[tag_index]}">${tags[tag_index]}</a>`
|
||||
if (tag_index < tags.length - 1) {
|
||||
string += ", ";
|
||||
}
|
||||
}
|
||||
return string
|
||||
}
|
||||
|
||||
function replace_format_indicators(input_string, post_index=0, tag_name="tag") {
|
||||
post_object = posts.posts[post_index]
|
||||
output_string = input_string
|
||||
.replace("%A", (post_object["tags"]))
|
||||
.replace("%C", post_object["content"])
|
||||
.replace("%D", unix_time_to_date_format(post_object["pubdate"]))
|
||||
.replace("%E", unix_time_to_date_format(post_object["editdate"]))
|
||||
.replace("%L", `/post/${post_index}`)
|
||||
.replace("%N", post_object["poster"])
|
||||
.replace("%P", "/post")
|
||||
.replace("%O", "/edit")
|
||||
.replace("%R", "/rss")
|
||||
.replace("%S", config.seperator)
|
||||
.replace("%T", post_object["title"])
|
||||
.replace("%U", `/user/${post_object["poster"]}`)
|
||||
.replace("%Y", config.site_name)
|
||||
.replace("%W", config.site_description)
|
||||
.replaceAll("%A", (post_object["tags"]))
|
||||
.replaceAll("%B", (hyperlink_tags(post_object["tags"])))
|
||||
.replaceAll("%C", post_object["content"].replaceAll("\n","<br/>"))
|
||||
.replaceAll("%D", unix_time_to_date_format(post_object["pubdate"]))
|
||||
.replaceAll("%E", unix_time_to_date_format(post_object["editdate"]))
|
||||
.replaceAll("%F", users.users[post_object["userID"]]['prettyname'])
|
||||
.replaceAll("%G", tag_name)
|
||||
.replaceAll("%I", users.users[post_object['userID']]['description'])
|
||||
.replaceAll("%L", `/post/${post_index}`)
|
||||
.replaceAll("%N", users.users[post_object["userID"]]['username'])
|
||||
.replaceAll("%P", "/post")
|
||||
.replaceAll("%O", "/edit")
|
||||
.replaceAll("%R", "/rss")
|
||||
.replaceAll("%S", config.seperator)
|
||||
.replaceAll("%T", post_object["title"])
|
||||
.replaceAll("%U", `/user/${users.users[post_object["userID"]]['username']}`)
|
||||
.replaceAll("%Y", config.site_name)
|
||||
.replaceAll("%W", config.site_description)
|
||||
|
||||
return output_string
|
||||
}
|
||||
|
||||
app.get(config.rss_path, (req,res) => {
|
||||
if (config.rss == false) {
|
||||
res.send("Sorry, RSS is disabled!")
|
||||
}
|
||||
else {
|
||||
let rss_content = `<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0">
|
||||
<channel>
|
||||
<title>${config.site_name}</title>
|
||||
<link>${config.site_url}</link>
|
||||
<description>${config.site_description}</description>
|
||||
`
|
||||
for (let i = posts.posts.length-1; i >= 0; i--) {
|
||||
rss_content += `
|
||||
<item>
|
||||
<title>${posts.posts[i]["title"]}</title>
|
||||
<link>${config.site_url}/post/${i}.${config.file_extension}</link>
|
||||
<description><![CDATA[${posts.posts[i]["content"].replaceAll("\n","<br/>")}]]></description>
|
||||
<guid isPermaLink="true">${config.site_url}/post/${i}</guid>
|
||||
<pubDate>${unix_time_to_rss_date(posts.posts[i]['pubdate'])}</pubDate>`
|
||||
for (let j = 0; j < posts.posts[i]['tags'].length; j++) {
|
||||
rss_content += `<category><![CDATA[${posts.posts[i]['tags'][j]}]]></category>`
|
||||
};
|
||||
rss_content += "</item>"
|
||||
}
|
||||
rss_content += `
|
||||
</channel>
|
||||
</rss>`
|
||||
res.setHeader('content-type', 'application/rss+xml');
|
||||
res.send(rss_content)
|
||||
};
|
||||
});
|
||||
|
||||
app.get("/", (req,res) => {
|
||||
header_div = config.timeline_header
|
||||
header_div = replace_format_indicators(header_div, 0);
|
||||
header_div = replace_format_indicators(header_div);
|
||||
posts_div = "";
|
||||
counter = posts.posts.length - 1;
|
||||
while ((counter >= 0) && (counter > (posts.posts.length - (config.timeline_length + 1))))
|
||||
@@ -51,13 +114,13 @@ app.get("/", (req,res) => {
|
||||
posts_div += replace_format_indicators(post, counter);
|
||||
counter -= 1;
|
||||
}
|
||||
res.send(`<html><body><div id="header">${header_div}</div><div id="posts">${posts_div}</div></body></html>`);
|
||||
res.send(`<html><style>${config.css}</style><body><div id="header">${header_div}</div><div id="posts">${posts_div}</div></body></html>`);
|
||||
});
|
||||
|
||||
app.get("/post", (req,res) => {
|
||||
res.send(`</html><form action="/submit_post" method="POST" onsubmit="sha512password()">
|
||||
res.send(`</html><style>${config.css}</style><form action="/submit_post" method="POST" onsubmit="sha512password()">
|
||||
<label>Username: </label><input required name="username"><br/>
|
||||
<label>Password: </label><input required id="password" name="password"><br/>
|
||||
<label>Password: </label><input type="password" required id="password" name="password"><br/>
|
||||
<label>Title: </label><input required name="title"><br/>
|
||||
<label>Content: </label><textarea required name="content"></textarea><br/>
|
||||
<label>Tags (comma seperated): </label><input name="tags"><br/>
|
||||
@@ -69,21 +132,35 @@ app.get("/edit", (req,res) => {
|
||||
});
|
||||
|
||||
app.get("/user/:username", (req, res) => {
|
||||
header_div = `<h1>${req.params.username}</h1>`
|
||||
header_div = config.user_page_header
|
||||
header_div = replace_format_indicators(header_div)
|
||||
posts_div = "";
|
||||
for (let post_index = posts.posts.length-1; post_index >= 0; post_index--) {
|
||||
if (posts.posts[post_index]["poster"] == req.params.username) {
|
||||
if (users.users[posts.posts[post_index]["userID"]]["username"] == req.params.username) {
|
||||
let post = config.user_post_format;
|
||||
posts_div += replace_format_indicators(post, post_index);
|
||||
}
|
||||
}
|
||||
res.send(`<html><body><div id="header">${header_div}</div><div id="posts">${posts_div}</div></body></html>`);
|
||||
res.send(`<html><style>${config.css}</style><body><div id="header">${header_div}</div><div id="posts">${posts_div}</div></body></html>`);
|
||||
});
|
||||
app.get("/post/:post_index", (req, res) => {
|
||||
post_div = "";
|
||||
let post = config.post_page_format;
|
||||
post_div += replace_format_indicators(post, req.params.post_index);
|
||||
res.send(`<html><body><div id="posts">${post_div}</div></body></html>`);
|
||||
res.send(`<html><style>${config.css}</style><body><div id="posts">${post_div}</div></body></html>`);
|
||||
});
|
||||
app.get("/tag/:tag", (req,res) => {
|
||||
const tag = req.params.tag
|
||||
let header_div = config.tag_page_header
|
||||
header_div = replace_format_indicators(header_div,0,tag)
|
||||
let page_content = ""
|
||||
for (let i = posts.posts.length-1; i >= 0; i--) {
|
||||
if (posts.posts[i]['tags'].includes(tag)) {
|
||||
let post = config.tag_post_format;
|
||||
page_content += replace_format_indicators(post, i);
|
||||
};
|
||||
};
|
||||
res.send(`<html><style>${config.css}</style><body><div id="header">${header_div}</div><div id="posts">${page_content}</div></body></html>`);
|
||||
});
|
||||
|
||||
app.post("/submit_post", (req,res) => {
|
||||
@@ -92,19 +169,23 @@ app.post("/submit_post", (req,res) => {
|
||||
const title = req.body.title
|
||||
const content = req.body.content
|
||||
const tags = req.body.tags.split(',');
|
||||
const datetime = new Date().getTime()
|
||||
const unix_timestamp = getUnixTime(new Date())
|
||||
console.log(username, "is submitting a post titled:", title);
|
||||
|
||||
if (users.users[username] == password) { // Password matches
|
||||
if (get_userID(username) == -1) {
|
||||
res.send("User does not exist")
|
||||
}
|
||||
|
||||
else if (users.users[get_userID(username)]['hash'] == password) { // Password matches
|
||||
posts.posts.push({
|
||||
"poster": username,
|
||||
"userID": get_userID(username),
|
||||
"title": title,
|
||||
"content": content,
|
||||
"pubdate": datetime,
|
||||
"editdate": datetime,
|
||||
"pubdate": unix_timestamp,
|
||||
"editdate": unix_timestamp,
|
||||
"tags": tags,
|
||||
})
|
||||
fs.writeFileSync(`${config.root_path}/posts.js`, `export const posts = ${JSON.stringify(posts.posts)}`, 'utf-8');
|
||||
fs.writeFileSync(`${__dirname}/posts.js`, `export const posts = ${JSON.stringify(posts.posts)}`, 'utf-8');
|
||||
res.redirect(302, "/");
|
||||
}
|
||||
else {
|
||||
@@ -113,5 +194,5 @@ app.post("/submit_post", (req,res) => {
|
||||
});
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Server is running at http://localhost:${port}`);
|
||||
console.log(`Server is running at http://localhost:${port} in ${config.root_path}`);
|
||||
});
|
||||
|
Reference in New Issue
Block a user