UNPKG

discord-media-server

Version:

Self-hosted Discord bot for scanning and serving information on local media files.

99 lines (80 loc) 2.98 kB
import express from 'express'; import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { createTables } from './setupDatabase.js'; import { CONFIG_DIR, DATA_DIR } from './setupConfig.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const PORT = 8080; const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.get('/', (req, res) => { res.sendFile(path.join(__dirname, '../public/setup.html')); }); app.get('/setup', (req, res) => { res.sendFile(path.join(__dirname, '../public/setup.html')); }); app.post('/submit', async (req, res) => { const dbPath = path.join(DATA_DIR, `${req.body.dbName}.sqlite`); const config = { dbType: req.body.dbType, dbConfig: req.body.dbType === 'sqlite' ? { filename: dbPath, database: req.body.dbName } : { host: req.body.dbHost, user: req.body.dbUser, password: req.body.dbPass, database: req.body.dbName } }; const env = [ `MEDIA_DIR=${req.body.mediaDirectory}`, `DISCORD_TOKEN=${req.body.discordToken}`, `DISCORD_CLIENT_ID=${req.body.discordClientId}`, `TMDB_API_KEY=${req.body.tmdbKey}`, `DB_TYPE=${req.body.dbType}`, `DB_FILE=${dbPath}`, `DB_HOST=${req.body.dbHost}`, `DB_USER=${req.body.dbUser}`, `DB_PASS=${req.body.dbPass}`, `DB_NAME=${req.body.dbName}`, `PORT=${req.body.port || PORT}`, `CONFIG_DIR=${CONFIG_DIR}`, `DATA_DIR=${DATA_DIR}` ]; fs.writeFileSync(path.join(CONFIG_DIR, '.env'), env.join('\n')); if (fs.existsSync(CONFIG_DIR)) { console.log(`.env created at: ${path.join(CONFIG_DIR, '.env')}`); } try { await createTables(config); console.log('Database configured.'); } catch (err) { res.status(500).send(`<pre>Database error:\n${err.stack}</pre>`); return; } res.redirect('/done?client_id='+req.body.discordClientId); }); app.get('/done', (req, res) => { const client_id = req.query.client_id; console.log('client id: '+client_id); if (client_id) { console.log(`\nInvite your bot with this link:\nhttps://discord.com/oauth2/authorize?client_id=${client_id}&scope=bot&permissions=274877975552`); } if (fs.existsSync(path.join(CONFIG_DIR, '.env')) && process.env.DISCORD_TOKEN && process.env.MEDIA_DIR) { console.log("Setup complete — exiting."); process.exit(0); } res.send('<h1>Setup complete! Restart the container to apply changes.</h1>'); }); app.post('/launch', async (req, res) => { try { await import('../bin/start.js'); res.send('<h2>Server & Bot started. You can close this window.</h2>'); } catch (err) { res.status(500).send(`<pre>${err.stack}</pre>`); } }); app.listen(PORT, () => console.log(`Setup dashboard running at http://localhost:${PORT}/setup`));