This commit is contained in:
2024-12-29 17:20:34 -05:00
parent 846450022b
commit e9a652dd31
4 changed files with 114 additions and 124 deletions

View File

@@ -27,9 +27,11 @@ const QRSalt ="!SaltyMagic5392370662";
// + Claim Any Tickets
// + Purge Revoked Function (Admin)
// + Issue Tickets from Camp Admin Page
// Make one Update button on manytickets (User)
// Make one Update button on editcamp (Admin)
// Send email when new tickets are issued/offered
// + Send email when new tickets are issued/offered
// + Make one Update button on editcamp (Admin)
// + Make one Update button on manytickets (User)
// Turn ticket use on/off from Settings (Admin)
// Turn email on/off from Settings (Admin)
// Magic-link Login System
// Deactivate individual magic links (User)
// Deactivate individual magic links (Admin)
@@ -39,8 +41,9 @@ const QRSalt ="!SaltyMagic5392370662";
// + Use a templating engine
// + Store password hashed and salted
// Make all HTML look nice
// Logging and Replay system
// Logging and Replay system(?)
// Stripe Integration
// More efficent data structure: TicketsByCamp, TicketsByOffered, TicketsByOwner
//
//
@@ -110,6 +113,7 @@ function MagicLinkValid(email,hash) {
const users={};
const tickets={};
const camps={};
const settings={};
function InitDatabase() {
for (const key in users ) delete users[key];
@@ -206,6 +210,7 @@ app.post("/camps",requireSuperUser,(req,res) => {
app.get('/editcamp', requireSuperUser, (req,res) => {
let campname=req.query.campname;
if (!camps[campname]) return res.redirect("/");
const edit={ username:req.session.username, superuser:req.session.superuser, campname:campname, leader:camps[campname].leader, tickets: {} };
for (const t in tickets) {
const parts=t.split("-");
@@ -328,6 +333,27 @@ app.post("/updateoffered2", requireLogin, (req,res) => {
})
app.post("/updateoffered2su", requireSuperUser, (req,res) => {
const emaillist={};
for (name in req.body) {
let ticket=0;
if (name.endsWith("-owner" )) { ticket=name.slice(0,-6); tickets[ticket].owner =req.body[name]; }
else if (name.endsWith("-status" )) { ticket=name.slice(0,-7); tickets[ticket].status =req.body[name]; }
else if (name.endsWith("-offered")) {
ticket=name.slice(0,-8);
if (tickets[ticket].offered!=req.body[name]) {
tickets[ticket].offered=req.body[name];
emaillist[req.body[name]]=1;
}
}
}
for (email in emaillist) EmailTickets(email);
const referer = req.get('Referer');
if (referer) return res.redirect(referer);
else return res.redirect('/');
})
app.post("/updateticketsu", requireSuperUser, (req,res) => {
const ticket=req.body.ticket;
const owner=req.body.owner;
@@ -344,13 +370,16 @@ app.get("/useticket",(req,res) => {
if (!tickets[ticket]) return res.status(500).send("Ticket "+ticket+" not found.");
if (hashQR(ticket,tickets[ticket].owner)!=hash) return res.status(500).send("Ticket "+ticket+" was transferred to "+tickets[ticket].owner);
if (tickets[ticket].status!="i") return res.status(500).send("Ticket "+ticket+" has already been used.");
tickets[ticket].status="u"; // LOG
return res.send("<h1>Welcome, "+tickets[ticket].owner+" to Falls on Fire! Ticket "+ticket+" has now been used.</h1>");
})
if (settings['enable-email']) {
tickets[ticket].status="u"; // LOG
return res.send("<h1>Welcome, "+tickets[ticket].owner+" to Falls on Fire! Ticket "+ticket+" has now been used.</h1>");
} else return res.send("<h1>Your ticket is good, "+tickets[ticket].owner+", but the server is not in Event Mode, so Ticket "+ticket+" is still valid.");
})
async function EmailTickets(email) {
if (!settings['enable-email']) return;
let offered=0;
for (const ticket in tickets) if (tickets[ticket].offered==email) offered++;
if (offered==0) return;
@@ -505,6 +534,11 @@ app.post('/purge',requireSuperUser, (req,res) => {
res.render('settings',{ username:req.session.username, superuser:req.session.superuser, message: "Purged "+count+" revoked tickets" })
});
app.post('/update-setting', requireSuperUser, (req, res) => {
settings[req.body.name]=req.body.checked;
res.json({ success: true, message: 'Checkbox state updated successfully' });
});
// Start the server
app.listen(PORT, () => {