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!!! 🏳️⚧️
💖 Sign the Petition NOW!!! 💖
${isSignedIn ? `
${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}
${new Date(sig.timestamp).toLocaleString()}
`).join('')}
`);
});
// 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!');
});