diff --git a/changelog.txt b/changelog.txt index 3f67336..90ad678 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1 +1 @@ -added new project: crasher, update styles for tik tak toe \ No newline at end of file +New mayor project: TypeWord. Check it out in the projects tab \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 6af611d..869c2dd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,6 +11,7 @@ import { rooms } from "./routes/ttt.js"; import { readFileSync, writeFileSync } from "fs"; import { addClick, getClicks, getMessage, setMessage } from "./functions.js"; import * as discojs from "@thenamelessdev/discojs"; +import { typeWordRooms } from "./routes/typeword.js"; //vars and conf dotenv.config(); @@ -136,6 +137,27 @@ io.on("connection", async (socket) => { io.emit("delete", ({ room: room })); delete rooms[room]; }); + + socket.on("typewordstart", async (data) => { + try{ + const response = await fetch("https://random-word-api.herokuapp.com/word"); + const json = await response.json(); + if(response.ok){ + io.emit("typewordstart", {"room": data.room, "word": json[0]}); + } + else{ + io.emit("typewordstart", {"room": data.room, "word": "error"}); + } + } + catch{ + io.emit("typewordstart", {"room": data.room, "word": "error"}); + } + }); + + socket.on("typewordfinish", (data) => { + typeWordRooms[data.room].winner = data.player; + io.emit("typewordwinner", {"room": data.room, "player": data.player}); + }); }); server.listen({port, host: "0.0.0.0"}); \ No newline at end of file diff --git a/src/routes/projects.ts b/src/routes/projects.ts index fd63bd6..98c7354 100644 --- a/src/routes/projects.ts +++ b/src/routes/projects.ts @@ -4,6 +4,9 @@ const router = express.Router(); import tttRouter from "./ttt.js"; router.use("/ttt", tttRouter); +import typeWordRouter from "./typeword.js"; +router.use("/typeword", typeWordRouter); + router.get("/", (req: Request, res: Response) => { res.render("projects"); }); diff --git a/src/routes/typeword.ts b/src/routes/typeword.ts new file mode 100644 index 0000000..a53ebbe --- /dev/null +++ b/src/routes/typeword.ts @@ -0,0 +1,67 @@ +import express, { Request, Response } from "express"; +import { verify } from "../functions.js"; +import { io } from "../index.js"; +const router = express.Router(); + +interface typeWordRoom { + name: string, + host: string, + player?: string, + winner?: string, +} + +export let typeWordRooms: Record = {}; + +router.get("/", (req: Request, res: Response) => { + res.render("projects/typeword/index") +}); + +router.post("/create", async (req: Request, res: Response) => { + const { username, room } = req.body; + + if(username && room){ + if(await verify(req)){ + if(typeWordRooms[room]){ + res.render("error", { error: "Room name already exists" }); + } + else{ + typeWordRooms[room] = { + name: room, + host: username + } + res.render("projects/typeword/game", { room: room, user: username, host: username, player: "none" }); + } + } + else{ + res.render("error", { error: "Cloudflare turnstile failed" }); + } + } + else{ + res.status(400).render("error", { error: "missing username or room name" }); + } +}); + +router.post("/join", async (req: Request, res: Response) => { + const { username, room } = req.body; + + if(username && room){ + if(await verify(req)){ + if(typeWordRooms[room]){ + typeWordRooms[room].player = username; + io.emit("typewordjoin", {"room": room, "username": username}); + res.render("projects/typeword/game", { room: room, user: username, host: typeWordRooms[room].host, player: username }); + } + else{ + res.status(404).render("error", { error: "Room doesn't exists" }) + } + } + else{ + res.render("error", { error: "Cloudflare turnstile failed" }); + } + } + else{ + res.status(400).render("error", { error: "missing username or room name" }); + } +}); + +export default router; \ No newline at end of file diff --git a/views/projects.ejs b/views/projects.ejs index ccd74dd..96a39e9 100644 --- a/views/projects.ejs +++ b/views/projects.ejs @@ -40,6 +40,8 @@
Crasher
+ TypeWord +

© 2025 thenamelessdev. Licensed under the MIT license.

By using the website you aggree to our privacy policy

diff --git a/views/projects/typeword/game.ejs b/views/projects/typeword/game.ejs new file mode 100644 index 0000000..61b0c9d --- /dev/null +++ b/views/projects/typeword/game.ejs @@ -0,0 +1,104 @@ + + + + + + TypeWord - <%= room %> + + + + +

<%= room %>

+

Host: <%= host %>

+

You: <%= user %>

+

Player: <%= player %>

+
+ +

Word:

+

+
+ +
+
+

Time: 0s

+ + +
+ +
+ +
+ + + + \ No newline at end of file diff --git a/views/projects/typeword/index.ejs b/views/projects/typeword/index.ejs new file mode 100644 index 0000000..d04a021 --- /dev/null +++ b/views/projects/typeword/index.ejs @@ -0,0 +1,69 @@ + + + + + + TypeWord + + + + + +

TypeWord

+

A fun game to play with friends

+

How to play: after both players join the room the game will give you a world. You have to type the word as fast as you can and whoewer types it faster wins.

+
+
+
Create Room
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+ +
+ +
+
Join Room
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+ + \ No newline at end of file