/*Canopy - The next generation of stoner streaming software Copyright (C) 2024-2025 Rainbownapkin and the TTN Community This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .*/ //Define NPM imports const express = require('express'); const session = require('express-session'); const {createServer } = require('http'); const { Server } = require('socket.io'); const path = require('path'); const mongoStore = require('connect-mongo'); const mongoose = require('mongoose'); //Define global crypto variable for altcha globalThis.crypto = require('node:crypto').webcrypto; //Define Local Imports //Application const channelManager = require('./app/channel/channelManager'); //Util const configCheck = require('./utils/configCheck'); const scheduler = require('./utils/scheduler'); const {errorMiddleware} = require('./utils/loggerUtils'); //DB Model const statModel = require('./schemas/statSchema'); const flairModel = require('./schemas/flairSchema'); const emoteModel = require('./schemas/emoteSchema'); const tokeCommandModel = require('./schemas/tokebot/tokeCommandSchema'); //Controller const fileNotFoundController = require('./controllers/404Controller'); //Router //Humie-Friendly const indexRouter = require('./routers/indexRouter'); const registerRouter = require('./routers/registerRouter'); const loginRouter = require('./routers/loginRouter'); const profileRouter = require('./routers/profileRouter'); const adminPanelRouter = require('./routers/adminPanelRouter'); const channelRouter = require('./routers/channelRouter'); const newChannelRouter = require('./routers/newChannelRouter'); const passwordResetRouter = require('./routers/passwordResetRouter'); //Panel const panelRouter = require('./routers/panelRouter'); //Popup const popupRouter = require('./routers/popupRouter'); //Tooltip const tooltipRouter = require('./routers/tooltipRouter'); //Api const apiRouter = require('./routers/apiRouter'); //Define Config variables const config = require('../config.json'); const port = config.port; const dbUrl = `mongodb://${config.db.user}:${config.db.pass}@${config.db.address}:${config.db.port}/${config.db.database}`; //Check for insecure config configCheck.securityCheck(); //Define express const app = express(); //Define session-store (exported so we can kill sessions from user schema) module.exports.store = mongoStore.create({mongoUrl: dbUrl}); //define sessionMiddleware const sessionMiddleware = session({ secret: config.sessionSecret, resave: false, saveUninitialized: false, store: module.exports.store }); //Define http and socket.io servers const httpServer = createServer(app); const io = new Server(httpServer, {}); //Connect mongoose to the database mongoose.set("sanitizeFilter", true).connect(dbUrl).then(() => { console.log("Connected to DB"); }).catch((err) => { console.error("Unable to connecto to DB: "); console.error(err); process.exit(); }); //Set View Engine app.set('view engine', 'ejs'); app.set('views', __dirname + '/views'); //Middlware //Enable Express app.use(express.json()); //app.use(express.urlencoded()); //Enable Express-Sessions app.use(sessionMiddleware); //Enable Express-Session w/ Socket.IO io.engine.use(sessionMiddleware); //Routes //Humie-Friendly app.use('/', indexRouter); app.use('/register', registerRouter); app.use('/login', loginRouter); app.use('/profile', profileRouter); app.use('/adminPanel', adminPanelRouter); app.use('/c', channelRouter); app.use('/newChannel', newChannelRouter); app.use('/passwordReset', passwordResetRouter); //Panel app.use('/panel', panelRouter); //Popup app.use('/popup', popupRouter); //tooltip app.use('/tooltip', tooltipRouter); //Bot-Ready app.use('/api', apiRouter); //Static File Server //Serve bootstrap icons app.use('/lib/bootstrap-icons',express.static(path.join(__dirname, '../node_modules/bootstrap-icons'))); app.use('/lib/altcha',express.static(path.join(__dirname, '../node_modules/altcha/dist_external'))); //Server public 'www' folder app.use(express.static(path.join(__dirname, '../www'))); //Handle error checking app.use(errorMiddleware); //Basic 404 handler app.use(fileNotFoundController); //Increment launch counter statModel.incrementLaunchCount(); //Load default flairs flairModel.loadDefaults(); //Load default emotes emoteModel.loadDefaults(); //Load default toke commands tokeCommandModel.loadDefaults(); //Kick off scheduled-jobs scheduler.kickoff(); //Hand over general-namespace socket.io connections to the channel manager module.exports.channelManager = new channelManager(io) //Listen Function httpServer.listen(port, () => { console.log(`Opening port ${port}`); });