diff --git a/README.md b/README.md index ec2efd3..61dbf3a 100644 --- a/README.md +++ b/README.md @@ -54,16 +54,19 @@ Akf-forum has got an API for AJAX (fetch), other clients etc. And, you can learn - Add a feature list to README.md - delete admin??? - change category name -- theme support++, directly edit html! +- theme support++, directly edit html! patch user support! +- enchanted theme: not take all of the public! "/css + ### front-end - better usermenu for user profile - old contents / titles add to forum interface - categories page is need a update, thread count in category (?) - add ban button to user profile.? - who liked a message for web. -- edit config from web admin panel. +- give admin button ## Major Version History +- V5: Enchanted theme support - V4: Caching - V3: New Theme - V2: Backend fix, mongoose is fixed. Really big fix. diff --git a/config.json.example b/config.json.example index 2bf0dc7..b419ed6 100644 --- a/config.json.example +++ b/config.json.example @@ -1,5 +1,9 @@ { - "def_theme": "default", + "def_theme": { + "name": "white", + "color": "black", + "language": "en" + }, "forum_name": "akf", "description": "Akf-forum!", "limits": { diff --git a/index.js b/index.js index d5e88c2..5bb8d3f 100644 --- a/index.js +++ b/index.js @@ -30,8 +30,15 @@ app.use(express.static("public", { maxAge: 86400 * 1000 }), express.json(), expr req.user = req.session.userID ? await UserModel.findOneAndUpdate({ id: req.session.userID }, { lastSeen: Date.now(), $addToSet: { ips: req.clientIp } }) : null; - res.reply = (page, options = {}, status = 200) => res.status(status) - .render(page, { user: req.user, theme: req.user?.theme || def_theme, forum_name, description, ...options }); + + const theme = require(`./themes/${req.user?.theme?.name || def_theme.name}`); + res.reply = (page, data = {}, status = 200) => + theme.render(page, { user: req.user, ...data }, { + color: req.user?.theme?.color || def_theme.color, + lang: req.user?.theme?.language || def_theme.language, + forum_name, + description + }, res.status(status)); res.error = (type, error) => res.reply("error", { type, error }, type); diff --git a/lib.js b/lib.js index 6c5d1c3..b57e8fa 100644 --- a/lib.js +++ b/lib.js @@ -5,7 +5,6 @@ require("dotenv").config(); module.exports = { threadEnum: ["OPEN", "APPROVAL", "DELETED"], userEnum: ["ACTIVE", "APPROVAL", "DELETED", "BANNED"], - themes: ["default", "black"], RL(windowMs = 60_000, max = 1) { return RL({ windowMs, max, standardHeaders: true, legacyHeaders: false, diff --git a/models/User.js b/models/User.js index b429320..a12222e 100644 --- a/models/User.js +++ b/models/User.js @@ -11,7 +11,11 @@ const schema = new mongoose.Schema({ edited: { type: Boolean, default: false }, about: { type: String, default: "", maxlength: limits.desp }, admin: { type: Boolean, default: false }, - theme: { type: String, default: def_theme }, + theme: { + name: { type: String, default: def_theme.name }, + color: { type: String, default: def_theme.color }, + language: { type: String, default: def_theme.language } + }, lastSeen: { type: Date, default: Date.now, select: false }, hideLastSeen: { type: Boolean, default: false }, ips: { type: [String], default: [], select: false }, diff --git a/public/css/themes/default.css b/public/css/themes/white.css similarity index 100% rename from public/css/themes/default.css rename to public/css/themes/white.css diff --git a/routes/api/routes/users.js b/routes/api/routes/users.js index fcc9132..a68a7c3 100644 --- a/routes/api/routes/users.js +++ b/routes/api/routes/users.js @@ -1,7 +1,6 @@ const { UserModel, BanModel } = require("../../../models"); const { Router } = require("express"); const multer = require("multer"); -const { themes } = require("../../../lib"); const app = Router(); @@ -52,7 +51,7 @@ app.patch("/:id", async (req, res) => { if (about.length > desp) return res.error(400, `About must be under ${desp} characters`); member.about = about; } - if (theme || themes.includes(theme)) member.theme = theme; + // if (theme || themes.includes(theme)) member.theme = theme; if (typeof admin === "boolean" || ["false", "true"].includes(admin)) member.admin = admin; if (deleted === false) member.deleted = false; diff --git a/views/admin.ejs b/themes/default/admin.ejs similarity index 100% rename from views/admin.ejs rename to themes/default/admin.ejs diff --git a/views/avatar_upload.ejs b/themes/default/avatar_upload.ejs similarity index 100% rename from views/avatar_upload.ejs rename to themes/default/avatar_upload.ejs diff --git a/views/categories.ejs b/themes/default/categories.ejs similarity index 100% rename from views/categories.ejs rename to themes/default/categories.ejs diff --git a/views/config.ejs b/themes/default/config.ejs similarity index 100% rename from views/config.ejs rename to themes/default/config.ejs diff --git a/views/create_category.ejs b/themes/default/create_category.ejs similarity index 100% rename from views/create_category.ejs rename to themes/default/create_category.ejs diff --git a/views/create_thread.ejs b/themes/default/create_thread.ejs similarity index 100% rename from views/create_thread.ejs rename to themes/default/create_thread.ejs diff --git a/views/error.ejs b/themes/default/error.ejs similarity index 100% rename from views/error.ejs rename to themes/default/error.ejs diff --git a/views/extra/footer.ejs b/themes/default/extra/footer.ejs similarity index 79% rename from views/extra/footer.ejs rename to themes/default/extra/footer.ejs index a2de9b6..b363a4c 100644 --- a/views/extra/footer.ejs +++ b/themes/default/extra/footer.ejs @@ -1,12 +1,13 @@