const express = require('express'); const session = require('express-session'); const fs = require('fs'); const path = require('path'); require('dotenv').config(); const app = express(); const PORT = process.env.PORT || 3000; // Middleware app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(session({ secret: process.env.SESSION_SECRET || 'super-secret-key-change-this', resave: false, saveUninitialized: false, cookie: { secure: false } // Set to true if using HTTPS })); // Serve static files app.use(express.static('public')); // Data file path const SIGNATURES_FILE = path.join(__dirname, 'signatures.json'); // Initialize signatures file if it doesn't exist if (!fs.existsSync(SIGNATURES_FILE)) { fs.writeFileSync(SIGNATURES_FILE, JSON.stringify([])); } // Helper function to read signatures function getSignatures() { const data = fs.readFileSync(SIGNATURES_FILE, 'utf8'); return JSON.parse(data); } // Helper function to save signatures function saveSignatures(signatures) { fs.writeFileSync(SIGNATURES_FILE, JSON.stringify(signatures, null, 2)); } // Routes app.get('/', (req, res) => { const signatures = getSignatures(); const isSignedIn = req.session.user ? true : false; const userName = req.session.user ? req.session.user.name : ''; const userImage = req.session.user ? req.session.user.image : ''; const hasUserSigned = req.session.user ? signatures.some(s => s.userId === req.session.user.id) : false; res.send(` LYNN COME OUT!!!
⚠️ DISCLAIMER: This is a joke! Lynn should come out when she feels comfortable. ⚠️

🏳️‍⚧️ LYNN COME OUT!!! 🏳️‍⚧️

✨ LYNN COME OUT ✨ LYNN COME OUT ✨ LYNN COME OUT ✨
💖 Sign the Petition NOW!!! 💖
${isSignedIn ? `
User
Welcome, ${userName}! 🎉
Sign Out
${hasUserSigned ? `
✅ YOU ALREADY SIGNED! THANK YOU! ✅
` : `
`} ` : ` 🔐 SIGN IN WITH SLACK 🔐 `}
📝 TOTAL SIGNATURES: ${signatures.length} 📝

💫 SUPPORTERS 💫

${signatures.length === 0 ? '

No signatures yet! Be the first! 🎯

' : ''} ${signatures.map(sig => `
${sig.userName} ${sig.userName} ${new Date(sig.timestamp).toLocaleString()}
`).join('')}
🏳️‍⚧️ LYNN WE SUPPORT YOU 🏳️‍⚧️ COME OUT COME OUT WHEREVER YOU ARE 🏳️‍⚧️
`); }); // Slack OAuth - Start app.get('/auth/slack', (req, res) => { const clientId = process.env.SLACK_CLIENT_ID; const redirectUri = process.env.SLACK_REDIRECT_URI; const scopes = 'identity.basic,identity.avatar'; if (!clientId) { return res.send('

Error: SLACK_CLIENT_ID not configured

Please set up your .env file with Slack credentials.

'); } const authUrl = `https://slack.com/oauth/authorize?client_id=${clientId}&scope=${scopes}&redirect_uri=${encodeURIComponent(redirectUri)}`; res.redirect(authUrl); }); // Slack OAuth - Callback app.get('/auth/slack/callback', async (req, res) => { const code = req.query.code; const clientId = process.env.SLACK_CLIENT_ID; const clientSecret = process.env.SLACK_CLIENT_SECRET; const redirectUri = process.env.SLACK_REDIRECT_URI; if (!code) { return res.send('

Error: No authorization code received

Go back'); } try { // Exchange code for access token const tokenUrl = 'https://slack.com/api/oauth.access'; const params = new URLSearchParams({ client_id: clientId, client_secret: clientSecret, code: code, redirect_uri: redirectUri }); const response = await fetch(`${tokenUrl}?${params.toString()}`); const data = await response.json(); if (data.ok) { // Store user info in session req.session.user = { id: data.user_id, name: data.user.name, image: data.user.image_48 || data.user.image_72 || 'https://via.placeholder.com/48' }; res.redirect('/'); } else { res.send(`

Error: ${data.error}

Failed to authenticate with Slack

Go back`); } } catch (error) { res.send(`

Error: ${error.message}

Go back`); } }); // Sign the petition app.post('/sign', (req, res) => { if (!req.session.user) { return res.redirect('/'); } const signatures = getSignatures(); // Check if user already signed if (signatures.some(s => s.userId === req.session.user.id)) { return res.redirect('/'); } // Add signature signatures.push({ userId: req.session.user.id, userName: req.session.user.name, userImage: req.session.user.image, timestamp: new Date().toISOString() }); saveSignatures(signatures); res.redirect('/'); }); // Logout app.get('/logout', (req, res) => { req.session.destroy(); res.redirect('/'); }); // Start server app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); console.log('Make sure to set up your .env file with Slack credentials!'); });