This commit is contained in:
2024-12-26 21:46:13 -05:00
parent 37eb7eebe8
commit 70f434cae3
5 changed files with 60 additions and 32 deletions

View File

@@ -229,7 +229,6 @@ app.get('/editcamp', requireSuperUser, (req,res) => {
const parts=t.split("-");
const cname=parts[0];
const tnum=Number(parts[1]);
console.log("Cname: ",cname," campname ",campname," tnum ",tnum);
if (cname==campname) {
edit.tickets[t]={};
edit.tickets[t].owner=tickets[t].owner;
@@ -237,12 +236,21 @@ app.get('/editcamp', requireSuperUser, (req,res) => {
edit.tickets[t].status=tickets[t].status;
}
}
console.log("Edit is ",edit);
return res.render("editcamp",edit);
})
app.get('/manytickets', requireLogin, (req,res) => {
let username=req.session.username;
const edit={ username:req.session.username, tickets: {} };
for (const t in tickets) if (tickets[t].owner==username && tickets[t].status=="i") {
edit.tickets[t]={};
edit.tickets[t].offered=tickets[t].offered;
}
return res.render("manytickets",edit);
})
app.get('/mytickets',requireLogin, (req,res)=> {
app.get('/mytickets',requireLogin, async (req,res)=> {
let username=req.session.username;
let claimed=0;
let owned=0;
@@ -259,10 +267,30 @@ app.get('/mytickets',requireLogin, (req,res)=> {
}
}
if (owned==0) return res.render("message",{ username:username, message:"You have no unused tickets" });
else if (owned==1) return res.render("oneticket",{ username:username, ticket:theticket, offered:tickets[theticket].offered });
else if (owned==1) {
const hash0=crypto.createHash('sha256');
const hash1=hash0.update(theticket+QRSalt);
const hash=hash1.digest("base64").slice(0,6);
const dataURL=await QRCode.toDataURL('localhost:3000/useticket?t='+theticket+'&h='+hashQR(theticket,username));
return res.render("oneticket",{ username:username, ticket:theticket, offered:tickets[theticket].offered, qrcode:dataURL });
}
else return res.render("manytickets",edit);
});
app.post('/mytickets',requireLogin, async (req,res)=> {
let username=req.session.username;
let theticket=req.body.ticket;
let offered=req.body.offered;
if (tickets[theticket].owner==username && tickets[theticket].status=="i") {
tickets[theticket].offered=offered;
}
const hash0=crypto.createHash('sha256');
const hash1=hash0.update(theticket+QRSalt);
const hash=hash1.digest("base64").slice(0,6);
const dataURL=await QRCode.toDataURL('localhost:3000/useticket?t='+theticket+'&h='+hashQR(theticket,username));
return res.render("oneticket", { username:username, ticket:theticket, offered:tickets[theticket].offered, qrcode:dataURL });
});
// Big Kahuna
// If you have zero tickets, show something saying that
// For each ticket owned, display options to offer it, use it, or (eventually) pay for it.
@@ -283,7 +311,7 @@ app.get('/transfer', requireLogin, async (req,res) => {
edit.tickets[t]={};
edit.tickets[t].owner=tickets[t].owner;
edit.tickets[t].offered=tickets[t].offered;
edit.tickets[t].used=tickets[t].used;
edit.tickets[t].used=tickets[t].status=="u";
}
return res.render("transfer",edit);
}
@@ -303,12 +331,6 @@ app.get('/transfer', requireLogin, async (req,res) => {
if (cat=="complex") return res.render('transfer',simpledata);
})
app.post("/toggle", requireSuperUser, (req,res) => {
const ticket=req.body.ticket;
const isChecked = req.body.checked;
tickets[ticket].used=isChecked;
res.json({ message: 'Checkbox state received', checked: isChecked });
})
app.post("/changestatus", requireSuperUser, (req,res) => {
const ticket=req.body.ticket;
@@ -322,7 +344,8 @@ app.post("/updateoffered", requireLogin, (req,res) => {
const ticket=req.body.ticket;
const offered=req.body.offered;
if (tickets[ticket].owner!=req.session.username) res.status(500).send("Ticket "+ticket+" owned by someone else");
else if (tickets[ticket].used) res.status(500).send("Ticket "+ticket+" has already been used");
else if (tickets[ticket].status=="u") res.status(500).send("Ticket "+ticket+" has already been used");
else if (tickets[ticket].status=="r") res.status(500).send("Ticket "+ticket+" was revoked");
else {
tickets[ticket].offered=offered;
res.json({ message: 'Updated owner of '+ticket+' to '+offered });
@@ -344,10 +367,10 @@ app.get("/useticket",(req,res) => {
let ticket=req.t;
let hash=req.h;
if (hashQR(ticket,req.session.username)!=hash) res.status(500).send("Ticket "+ticket+" was transferred to "+tickets[ticket].username);
else if (tickets[ticket].used) res.status(500).send("Ticket "+ticket+" has already been used.");
else if (tickets[ticket].status!="i") res.status(500).send("Ticket "+ticket+" has already been used.");
else {
tickets[ticket].used=new Date().toISOString();
res.send("<h1>Welcome, "+tickets[ticket].username+" to Falls on Fire! Ticket "+ticket+" has now been used.</h1>");
tickets[ticket].status="u";
res.send("<h1>Welcome, "+tickets[ticket].owner+" to Falls on Fire! Ticket "+ticket+" has now been used.</h1>");
}
})

View File

@@ -24,8 +24,7 @@
.qrcode-image {
object-fit: contain;
width: 80%; /* Adjust as needed */
height: 80%;
grid-column:2;
}
/* Close button */
@@ -37,24 +36,25 @@
cursor: pointer;
}
.grid {
}
/* General Reset */
body {
margin: 0;
font-family: Arial, sans-serif;
display: flex; /* Ensure the body uses a flex container */
display: grid;
grid-template-columns: 1fr 3fr;
height: 100vh; /* Full viewport height */
}
/* Sidebar (Nav Links) */
.nav-links {
width: 250px; /* Set a fixed width for the sidebar */
background-color: #f4f4f4; /* Light gray background */
padding: 20px;
box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1); /* Add a slight shadow for separation */
display: flex;
flex-direction: column; /* Ensure items stack vertically */
justify-content: flex-start; /* Optional: adjust spacing of items */
grid-column: 1;
min-height: 100vh; /* Stretch to full viewport height */
}
@@ -77,6 +77,7 @@ body {
}
.content {
grid-column: 2;
flex-grow: 1; /* Allow content to fill the remaining space */
padding: 20px;
}

View File

@@ -4,7 +4,7 @@
<title>Camps</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<body class="grid">
<%- include('partials/nav') %>
<form id="editor" method="post">
<table border="1">

View File

@@ -4,7 +4,7 @@
<title>Edit Camp</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<body class="grid">
<%- include('partials/nav') %>
<div id="QRShow" class="modal">
<div id="QRBackground" class="modal-content">

View File

@@ -4,14 +4,18 @@
<title>Your Ticket</title>
<link rel="stylesheet" href="styles.css">
</head>
<%- include('partials/nav') %>
<body>
<form id="editor">
Transfer Ticket:
<input type="edit" placeholder="yourfriend@xyz.com" value="<%=offered%>" id="offered">
<button id="Submit" type="button">Transfer</button>
<br>
</form>
<img width=300 height=300 src="https://via.placeholder.com/150" alt="Placeholder Image">
<%- include('partials/nav') %>
<div class="content">
To use <%=ticket%>, scan this QR Code:<br>
<img class="qrcode-image" width=300 height=300 src="<%=qrcode%>" alt="QR Code">
<form id="editor" method="POST">
Or transfer <%=ticket%> to:<br>
<input type="hidden" name="ticket" value="<%=ticket%>">
<input type="email" placeholder="yourfriend@xyz.com" value="<%=offered%>" name="offered">
<button id="Submit" type="submit">Transfer</button>
<br>
</form>
</div>
</body>
</html>