discord-media-server
Version:
Self-hosted Discord bot for scanning and serving information on local media files.
124 lines (100 loc) • 3.73 kB
JavaScript
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.static(path.join(__dirname, 'public'))); // ✅ This line serves /public
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static('public'));
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, '../public/setup.html'));
});
app.get('/dashboard', (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 dbFile = `${req.body.dbName}.sqlite`;
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=${dbFile}`,
`DB_PATH=${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.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.get('/api/env', (req, res) => {
res.json({
MEDIA_DIR: process.env.MEDIA_DIR || '',
DISCORD_TOKEN: process.env.DISCORD_TOKEN || '',
DISCORD_CLIENT_ID: process.env.DISCORD_CLIENT_ID || '',
TMDB_API_KEY: process.env.TMDB_API_KEY || '',
DB_TYPE: process.env.DB_TYPE || '',
DB_NAME: process.env.DB_NAME || '',
DB_HOST: process.env.DB_HOST || '',
DB_USER: process.env.DB_USER || '',
DB_PASS: process.env.DB_PASS || ''
});
});
app.listen(PORT, () => console.log(`Setup dashboard running at http://localhost:${PORT}`));