diff --git a/app.js b/app.js index ea7b52e..a4e028d 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,10 @@ const rateLimit = require("express-rate-limit"); const serverRoutes = require("./routes/servers"); const registerRoutes = require("./routes/register"); const verifyRoutes = require("./routes/verify"); +const characterRoutes = require("./routes/character"); +const session = require("express-session"); +const loginRoutes = require("./routes/login"); +const launcherRoutes = require("./routes/launcher"); const app = express(); const PORT = process.env.PORT || 3000; @@ -29,6 +33,14 @@ const limiter = rateLimit({ app.use(limiter); +app.use( + session({ + secret: "dynastyofknights_secret", + resave: false, + saveUninitialized: false, + }), +); + /* ======================== Express Settings ======================== */ @@ -56,6 +68,9 @@ app.use(express.static(path.join(__dirname, "public"))); app.use("/", serverRoutes); app.use("/register", registerRoutes); app.use("/verify", verifyRoutes); +app.use("/create-character", characterRoutes); +app.use("/login", loginRoutes); +app.use("/launcher", launcherRoutes); /* ======================== 404 Handler diff --git a/public/images/dok_bg.png b/public/images/dok_bg.png new file mode 100644 index 0000000..5dc92c9 Binary files /dev/null and b/public/images/dok_bg.png differ diff --git a/routes/character.js b/routes/character.js new file mode 100644 index 0000000..d4bf69f --- /dev/null +++ b/routes/character.js @@ -0,0 +1,48 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../database/database"); + +/* Character erstellen Seite */ + +router.get("/", (req, res) => { + if (!req.session.user) { + return res.redirect("/"); + } + + res.render("create-character"); +}); + +/* Character speichern */ + +router.post("/", async (req, res) => { + const { ingame_name } = req.body; + const userId = req.session.user.id; + + const nameRegex = /^[a-zA-Z0-9_]{3,16}$/; + + if (!nameRegex.test(ingame_name)) { + return res.render("create-character", { + error: "Ungültiger Name", + }); + } + + const [existing] = await db.query( + "SELECT id FROM accounts WHERE ingame_name = ?", + [ingame_name], + ); + + if (existing.length > 0) { + return res.render("create-character", { + error: "Name bereits vergeben", + }); + } + + await db.query("UPDATE accounts SET ingame_name = ? WHERE id = ?", [ + ingame_name, + userId, + ]); + + res.redirect("/launcher"); +}); + +module.exports = router; diff --git a/routes/launcher.js b/routes/launcher.js new file mode 100644 index 0000000..48db35f --- /dev/null +++ b/routes/launcher.js @@ -0,0 +1,12 @@ +const express = require("express"); +const router = express.Router(); + +router.get("/", (req, res) => { + if (!req.session.user) { + return res.redirect("/"); + } + + res.render("launcher"); +}); + +module.exports = router; diff --git a/routes/login.js b/routes/login.js new file mode 100644 index 0000000..4ed6004 --- /dev/null +++ b/routes/login.js @@ -0,0 +1,57 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../database/database"); +const bcrypt = require("bcrypt"); + +/* ================================ + Login verarbeiten +================================ */ + +router.post("/", async (req, res) => { + const { username, password } = req.body; + + try { + const [rows] = await db.query( + "SELECT * FROM accounts WHERE username = ? AND verified = 1", + [username], + ); + + if (rows.length === 0) { + return res.render("index", { + error: "Login fehlgeschlagen", + }); + } + + const user = rows[0]; + + const passwordMatch = await bcrypt.compare(password, user.password); + + if (!passwordMatch) { + return res.render("index", { + error: "Login fehlgeschlagen", + }); + } + + /* Session speichern */ + + req.session.user = { + id: user.id, + username: user.username, + }; + + /* Wenn kein Charaktername existiert */ + + if (!user.ingame_name) { + return res.redirect("/create-character"); + } + + /* Wenn Charakter existiert */ + + res.redirect("/launcher"); + } catch (error) { + console.error(error); + res.send("Login Fehler"); + } +}); + +module.exports = router; diff --git a/views/create-character.ejs b/views/create-character.ejs new file mode 100644 index 0000000..9237e09 --- /dev/null +++ b/views/create-character.ejs @@ -0,0 +1,85 @@ + + +
+ +