Skip to content

Commit 78bdd8b

Browse files
authored
Merge pull request #233 from UTDallasEPICS/Damian
fixed code so that player object is sent with new magic link authenti…
2 parents 1169c51 + da18c61 commit 78bdd8b

File tree

14 files changed

+163
-78
lines changed

14 files changed

+163
-78
lines changed

components/Queue/Queue.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,16 @@ const changeButton = () => {
6464
//if button is teal and it's pressed, have user join queue and change color to read.
6565
if(buttonColor.value == '#5FE0B7')
6666
{
67+
console.log("🟢 Emitting join-queue event")
6768
emit("join-queue")
6869
buttonColor.value = '#FF0000';
6970
buttonStatus.value = 'Leave Queue';
7071
}
7172
//if button is red (in queue) and its pressed, have user leave queue and change color to teal.
7273
else
7374
{
75+
76+
console.log("🔴 Emitting leave-queue event")
7477
emit("leave-queue")
7578
buttonColor.value = '#5FE0B7'
7679
buttonStatus.value = 'Join Queue';

components/Queue/QueueContainer.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<template>
44
<div class="w-[340px] h-full">
5+
56
<Upcoming :queue="queueUsers" />
67
<LeaderBoardHomepage :theme="theme"/>
78
<div v-if="isLoggedIn">
@@ -13,13 +14,16 @@
1314
<script setup lang="ts">
1415
//need to pass in the queue of all users here.
1516
import Upcoming from '~/components/Gameplay/UpComing.vue'
16-
17+
import Queue from '~/components/Queue/Queue.vue'
1718
const props = defineProps({
18-
queueUsers: { type: Array<string>, default: [] },
19+
queueUsers: { type: Array<string>, default: () => [] },
1920
theme: {type: String, default: "light"}
2021
})
2122
23+
2224
const sruser = useCookie('sruser');
25+
console.log("sruser cookie value: ", sruser.value);
2326
const isLoggedIn = computed(() => !!sruser.value)
27+
console.log("Is user logged in? ", isLoggedIn.value);
2428
2529
</script>

components/userauth/Profile.vue

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,10 @@ import { navigateTo } from '#app'
2828
let username = getUser.value?.username as string
2929
//clear cookis and send user to homepage
3030
const logout = async () => {
31+
console.log("Logging out user from Profile.vue");
3132
try {
3233
33-
await $fetch('/api/user.logout', { method: 'POST' })
34-
35-
document.cookie = 'sruser=; Max-Age=0; path=/;'
36-
37-
34+
await $fetch('/api/user-logout', { method: 'POST' })
3835
await navigateTo('/')
3936
4037
} catch (error) {

pages/player.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!--The main file for the page, that has embedded in it all the UI components from the components folder.-->
22
<template>
3-
<button class="fixed bottom-4 right-4 p-2 bg-gray-200 dark:bg-gray-700 rounded text-gray-800 dark:text-gray-200 shadow-lg" @click="toggleTheme" > 🌓</button>
3+
<button class="fixed bottom-4 right-4 p-2 bg-gray-200 dark:bg-gray-700 rounded text-gray-800 dark:text-gray-200 shadow-lg" @click="toggleTheme" > 🌓</button>
44

55
<div class="min-h-screen w-screen overflow-x-hidden dark:bg-[#333333]">
66
<div>
@@ -11,8 +11,8 @@
1111
<Scoreboard :timer="Number(timer ?? 0)" :user1="player1?.username ?? ''" :user2="player2?.username ?? ''" :user1score="player1?.score ?? 0 " :user2score="player2?.score ?? 0"></Scoreboard>
1212
<span class="py-4">
1313

14-
<VideoStream streamType="twitch"></VideoStream>
15-
</span>
14+
<VideoStream streamType="twitch"></VideoStream>
15+
</span>
1616
</div>
1717
<!--when user tries to join or leave queue, run the according functions in this file.-->
1818
<QueueContainer :queueUsers="queue" :theme="theme" @join-queue="joinQueue" @leave-queue="leaveQueue"></QueueContainer>
@@ -44,7 +44,7 @@ onMounted(() => {
4444
applyTheme()
4545
})
4646
47-
// 3️⃣ toggle & persist
47+
// toggle & persist
4848
function toggleTheme() {
4949
theme.value = theme.value === 'light' ? 'dark' : 'light'
5050
localStorage.setItem('theme', theme.value)

prisma/ERD.svg

Lines changed: 1 addition & 0 deletions
Loading

prisma/dev.db

68 KB
Binary file not shown.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
Warnings:
3+
4+
- A unique constraint covering the columns `[authToken]` on the table `Player` will be added. If there are existing duplicate values, this will fail.
5+
6+
*/
7+
-- AlterTable
8+
ALTER TABLE "Player" ADD COLUMN "authExpiry" DATETIME;
9+
ALTER TABLE "Player" ADD COLUMN "authToken" TEXT;
10+
11+
-- CreateIndex
12+
CREATE UNIQUE INDEX "Player_authToken_key" ON "Player"("authToken");
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
Warnings:
3+
4+
- You are about to drop the column `authExpiry` on the `Player` table. All the data in the column will be lost.
5+
- You are about to drop the column `authToken` on the `Player` table. All the data in the column will be lost.
6+
7+
*/
8+
-- RedefineTables
9+
PRAGMA defer_foreign_keys=ON;
10+
PRAGMA foreign_keys=OFF;
11+
CREATE TABLE "new_Player" (
12+
"user_id" TEXT NOT NULL PRIMARY KEY,
13+
"username" TEXT NOT NULL,
14+
"email" TEXT NOT NULL,
15+
"magicToken" TEXT,
16+
"tokenExpiry" DATETIME,
17+
"sessionToken" TEXT,
18+
"wins" INTEGER NOT NULL DEFAULT 0,
19+
"goals" INTEGER NOT NULL DEFAULT 0,
20+
"games" INTEGER NOT NULL DEFAULT 0,
21+
"losses" INTEGER NOT NULL DEFAULT 0,
22+
"ratio" REAL,
23+
"role" TEXT NOT NULL DEFAULT 'player'
24+
);
25+
INSERT INTO "new_Player" ("email", "games", "goals", "losses", "magicToken", "ratio", "role", "tokenExpiry", "user_id", "username", "wins") SELECT "email", "games", "goals", "losses", "magicToken", "ratio", "role", "tokenExpiry", "user_id", "username", "wins" FROM "Player";
26+
DROP TABLE "Player";
27+
ALTER TABLE "new_Player" RENAME TO "Player";
28+
CREATE UNIQUE INDEX "Player_username_key" ON "Player"("username");
29+
CREATE UNIQUE INDEX "Player_email_key" ON "Player"("email");
30+
CREATE UNIQUE INDEX "Player_magicToken_key" ON "Player"("magicToken");
31+
CREATE UNIQUE INDEX "Player_sessionToken_key" ON "Player"("sessionToken");
32+
PRAGMA foreign_keys=ON;
33+
PRAGMA defer_foreign_keys=OFF;

prisma/schema.prisma

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@ model Player {
1616
user_id String @id
1717
username String @unique
1818
email String @unique
19+
1920
magicToken String? @unique
2021
tokenExpiry DateTime?
22+
23+
sessionToken String? @unique
24+
2125
wins Int @default(0)
2226
goals Int @default(0)
2327
games Int @default(0)

server/Game_Manager/src/index.ts

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ import cors from "cors"
44
import { WebSocket, WebSocketServer } from "ws"
55
import { createServer, IncomingMessage } from "http"
66
// import { createServer } from "https"
7-
import jwt from "jsonwebtoken"
8-
import fs from "fs"
97
import { PrismaClient } from "@prisma/client"
108
import { nanoid } from "nanoid"
11-
import type {Player as PlayerType} from "@prisma/client"
9+
import type {Player as PlayerType} from "@prisma/client"
1210

1311
const prisma = new PrismaClient()
1412

@@ -110,7 +108,7 @@ const gameCycle = setInterval( async () => {
110108
}
111109

112110
//checks if the amount of accepted players is equal to total number of players
113-
if(numAccepted = numPlayers*2)
111+
if(numAccepted == numPlayers*2)
114112
{
115113

116114
game_state = GAME_STATE.PLAYING
@@ -307,7 +305,6 @@ const gameCycle = setInterval( async () => {
307305
games: {increment: 1},
308306
ratio: ((player1 as PlayerType).wins) / ((player1 as PlayerType).losses + 1),
309307
goals: {increment: score1}
310-
311308
}
312309

313310
}),
@@ -461,38 +458,27 @@ server_wss_CLIENT_GM.on("upgrade", async (request, socket, head) => {
461458
return
462459
}
463460

464-
// Authenticate using jwt from cookie srtoken
465461
const srtoken = cookieObj["srtoken"]
466-
const claims: any = jwt.verify(srtoken, fs.readFileSync(process.cwd()+"/cert-dev.pem"), (error, decoded) => {
467-
//if error, close connection, otherwise return the decoded token
468-
if(error){
469-
socket.destroy()
470-
return
471-
}
472-
return decoded
473-
})
474462

475-
if(!(claims instanceof Object && claims["sub"])){ // if jwt is invalid, close connection
463+
if(!srtoken){ // if srtoken cookie is empty, close connection
476464
socket.destroy()
477465
return
478466
}
479467

480-
//else, get user id from the token
481-
const user_id: string = claims["sub"]
482-
//make sure user is actually in the database already
483-
const find_user = await prisma.player.findUnique({
468+
const find_user = await prisma.player.findFirst({
484469
where: {
485-
user_id: user_id
470+
sessionToken: srtoken
486471
}
487-
})
488-
if(!find_user){ // if user is not in database, close connection
472+
});
473+
474+
if(!find_user){ // if token is not in database, close connection
489475
socket.destroy()
490476
return
491477
}
492478

493479
// valid logged in user, upgrade connection to websocket
494480
wss_client_gm.handleUpgrade(request, socket, head, (ws) => {
495-
wss_client_gm.emit("connection", ws, request, find_user.username, user_id)
481+
wss_client_gm.emit("connection", ws, request, find_user.username, find_user.user_id)
496482
})
497483
})
498484

@@ -586,7 +572,7 @@ ws_raspberry.onopen = (event) => {
586572
}
587573

588574
ws_raspberry.onerror = (error) => {
589-
console.log("WS_RASPBERRY error: " + error)
575+
console.log("WS_RASPBERRY error: " , error)
590576
}
591577
ws_raspberry.onclose = (event) => {
592578
console.log("WS_RASPBERRY closed")

0 commit comments

Comments
 (0)