The code sets up an Express app, importing necessary modules and variables, and defining several routes to handle requests, including token endpoint, root, and directory requests. The app also defines a discordLogin
function to handle Discord login requests and generates HTML code using the directoryToHtml
function, but does not start the server instance, which is stored in the server
variable.
npm run import -- "discord music player server"
const {handleDirectory, BASE_DIRECTORY} = importer.import("node express directory handler")
const {DEFAULT_APPLICATION} = importer.import("discord configuration")
const getToken = importer.import("discord express token endpoint")
const path = require('path')
//const {registerInstance, authenticateRoute} = importer.import("discord authenticate instances")
const directoryToHtml = importer.import("directory to html")
const {authenticateRoute} = importer.import("discord authenticate instances")
const INSTANCES = {}
const express = require('express')
const cors = require('cors')
const cookieParser = require('cookie-parser');
const app = express()
const BASE_URI = `https://${DEFAULT_APPLICATION}.discordsays.com/.proxy/`
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
app.use(cors({
credentials: true,
origin: '*'
}))
app.use(express.json())
app.use(cookieParser())
app.post('/api/token', getToken)
//app.post('/register', registerInstance)
app.get('/', authenticateRoute, discordLogin.bind(null, BASE_URI))
app.get('*', authenticateRoute, handleDirectory)
//app.use('/Music', express.static(path.join(BASE_DIRECTORY, 'Music')))
app.get('/amplitude.js', (req, res) => {
return res.sendFile(path.join(__dirname, '../amplitude.js'))
})
app.get('/amplitude.css', (req, res) => {
return res.sendFile(path.join(__dirname, '../amplitude.css'))
})
// TODO: share the rest of the files but only with logged in user
// return express.static(path.join(__dirname, 'public'));
let server
async function discordLogin(baseURI, req, res, next) {
let basePath = path.resolve(BASE_DIRECTORY)
let combined = path.join(basePath, decodeURIComponent(req.path))
console.log(combined)
if(!fs.existsSync(combined)) {
return next()
}
if(!fs.statSync(combined).isDirectory()) {
return next()
}
// this is exclusively a discord function so it has to be appended somewhere before using the generic directory lister
let htmlCode = await directoryToHtml(combined, req.path.split('/').length > 2, req.authenticated)
htmlCode = htmlCode.replace('<head>', `<head>
<base href="/.proxy/" />
<script type="text/javascript">
${importer.interpret('discord client auth code').code
.replaceAll('{CLIENT_ID}', DEFAULT_APPLICATION)
.replaceAll('{BASE_URI}', baseURI)}
</script>`)
return res.send(htmlCode)
}
async function discordExpress(activity) {
if(!express) {
return false
}
//process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
if(activity.participants.length == 0 && server) {
server.close()
server = null
}
if(activity.length > 1 || server) {
return
}
return (server = await app.listen(process.env.EXPRESS_PORT || 3001, () => {
console.log('Listening on: ', process.env.EXPRESS_PORT || 3001)
}))
}
function closeExpress(activity) {
if(activity) {
return
}
if(server) {
server.close()
server = null
}
}
module.exports = {
discordExpress,
closeExpress,
INSTANCES
}
// Import required modules and functions
const { importer } = require('./importer');
const { express, path, cors, cookieParser } = require('express');
const { v4: uuidv4 } = require('uuid');
const fs = require('fs');
const directoryToHtml = importer.import('directory to html');
const authenticateRoute = importer.import('discord authenticate instances');
const getToken = importer.import('discord express token endpoint');
// Define constants
const BASE_DIRECTORY = process.env.BASE_DIRECTORY;
const DEFAULT_APPLICATION = importer.import('discord configuration');
const BASE_URI = `https://${DEFAULT_APPLICATION}.discordsays.com/.proxy/`;
const EXPRESS_PORT = process.env.EXPRESS_PORT || 3001;
// Create the Express application
const app = express();
// Enable CORS, JSON parsing, and cookie parsing
app.use(cors({ credentials: true, origin: '*' }));
app.use(express.json());
app.use(cookieParser());
// Set up routes
app.post('/api/token', getToken);
// app.post('/register', registerInstance);
app.get('/', authenticateRoute, discordLogin);
app.get('*', authenticateRoute, handleDirectory);
// Serve static files
// app.use('/Music', express.static(path.join(BASE_DIRECTORY, 'Music')));
app.get('/amplitude.js', (req, res) => {
return res.sendFile(path.join(__dirname, '../amplitude.js'));
});
app.get('/amplitude.css', (req, res) => {
return res.sendFile(path.join(__dirname, '../amplitude.css'));
});
// Create a unique instance for each request
const INSTANCES = {};
// Define the discordLogin function
async function discordLogin(baseURI, req, res, next) {
try {
const basePath = path.resolve(BASE_DIRECTORY);
const combined = path.join(basePath, decodeURIComponent(req.path));
const isDirectory = fs.existsSync(combined) && fs.statSync(combined).isDirectory();
if (!isDirectory) {
return next();
}
const htmlCode = await directoryToHtml(combined, req.path.split('/').length > 2, req.authenticated);
const clientAuthCode = importer.interpret('discord client auth code')
.code
.replaceAll('{CLIENT_ID}', DEFAULT_APPLICATION)
.replaceAll('{BASE_URI}', baseURI);
htmlCode = htmlCode.replace('', `
`);
return res.send(htmlCode);
} catch (error) {
console.error(error);
return next(error);
}
}
// Define the handleDirectory function
async function handleDirectory(req, res, next) {
try {
const basePath = path.resolve(BASE_DIRECTORY);
const combined = path.join(basePath, decodeURIComponent(req.path));
const isDirectory = fs.existsSync(combined) && fs.statSync(combined).isDirectory();
if (!isDirectory) {
return next();
}
const htmlCode = await directoryToHtml(combined, req.path.split('/').length > 2, req.authenticated);
return res.send(htmlCode);
} catch (error) {
console.error(error);
return next(error);
}
}
// Define the discordExpress function
async function discordExpress(activity) {
if (!express) {
return false;
}
if (activity.participants.length === 0 && server) {
server.close();
server = null;
}
if (activity.length > 1 || server) {
return;
}
const server = await app.listen(EXPRESS_PORT, () => {
console.log(`Listening on: ${EXPRESS_PORT}`);
});
return { server };
}
// Define the closeExpress function
function closeExpress(activity) {
if (!activity) {
return;
}
if (server) {
server.close();
server = null;
}
}
module.exports = {
discordExpress,
closeExpress,
INSTANCES,
};
Code Breakdown
The code starts by importing various modules and variables using the importer
module. The imported modules and variables include:
handleDirectory
and BASE_DIRECTORY
from node express directory handler
DEFAULT_APPLICATION
from discord configuration
getToken
from discord express token endpoint
directoryToHtml
from directory to html
authenticateRoute
from discord authenticate instances
The code then sets up an Express app by:
NODE_TLS_REJECT_UNAUTHORIZED
environment variable to 0The code defines several routes for the Express app:
/api/token
: Handles token endpoint requests using the getToken
function/
: Handles root requests and redirects to the Discord login page*
: Handles all other requests using the handleDirectory
function/amplitude.js
and /amplitude.css
: Serves the Amplitude JavaScript and CSS filesThe code defines a function called discordLogin
which is used to handle Discord login requests. The function:
directoryToHtml
function and returns it as a responseThe code creates an instance of the Express server but does not start it. The server instance is stored in the server
variable.
The code has several TODO comments indicating areas that need to be implemented, such as sharing files with logged-in users.