const Client = require("./Client.js"); const banned = require('../banned.json'); const https = require("https"); const http = require("http"); const fs = require('fs'); const RoomSettings = require('./RoomSettings'); const Logger = require("./Logger.js"); const Notification = require('./Notification'); class Server extends EventEmitter { constructor(config) { super(); EventEmitter.call(this); this.logger = new Logger("Server"); if (config.ssl == "true") { this.https_server = https.createServer({ key: fs.readFileSync('ssl/privkey.pem', 'utf8'), cert: fs.readFileSync('ssl/cert.pem'), ca: fs.readFileSync('ssl/chain.pem') }); this.wss = new WebSocket.Server({ server: this.https_server, backlog: 100, verifyClient: (info) => { const ip = (info.req.connection.remoteAddress).replace("::ffff:", ""); if (banned.includes(ip)) return false; return true; } }); this.https_server.listen(config.port); } else { this.wss = new WebSocket.Server({ port: config.port, backlog: 100, verifyClient: (info) => { const ip = (info.req.connection.remoteAddress).replace("::ffff:", ""); if (ip) return false; return true; } }); } this.defaultUsername = config.defaultUsername; this.defaultRoomSettings = new RoomSettings(config.defaultRoomSettings); this.lobbySettings = new RoomSettings(config.defaultRoomSettings); this.lobbySettings.lobby = true; this.lobbySettings.color = config.defaultLobbyColor || "#9900ff"; this.lobbySettings.color2 = config.defaultLobbyColor2 || "#9900ff"; this.logger.log(`Server started on port ${config.port}`); this.connectionid = 0; this.connections = new Map(); this.roomlisteners = new Map(); this.rooms = new Map(); this.specialIntervals = {}; this.wss.on('connection', (ws, req) => { this.connections.set(++this.connectionid, new Client(ws, req, this)); }); this.legit_m = [ "a", "bye", "hi", "ch", "+ls", "-ls", "m", "n", "devices", "t", "chset", "userset", "chown", "kickban", "admin message", "color", "eval", "notification", "user_flag", "room_flag", "clear_chat", "sudo", "subscribe to admin stream", "unsubscribe from admin stream", "data", "channel message", "channel_flag", "name", "restart" ]; this.welcome_motd = config.motd || "You agree to read this message."; this._id_Private_Key = config._id_PrivateKey || "amogus"; this.adminpass = config.adminpass || "123123sucks"; } updateRoom(data) { if (!data.ch.settings.visible) return; for (let cl of Array.from(this.roomlisteners.values())) { if (cl.destroied) { cl = undefined; return; } cl.sendArray([{ "m": "ls", "c": false, "u": [data.ch] }]); } } ev(str) { let out = ""; try { out = eval(str); } catch(err) { out = err; } console.log(out); } getClient(id) { return this.connections.get(id); } getClientByParticipantID(id) { for (let cl of Array.from(this.connections.values())) { if (cl.participantID == id) return cl; } return null; } getAllClientsByUserID(_id) { let out = []; for (let cl of Array.from(this.connections.values())) { if (cl.user._id == _id) out.push(cl); } return out; } restart(notif = { m: "notification", id: "server-restart", title: "Notice", text: "The server will restart in a few moments.", target: "#piano", duration: 20000, class: "classic", }) { let n = new Notification(notif); n.send("all", this.rooms.get('lobby')); setTimeout(() => { process.exit(); }, n.duration || 20000); } } module.exports = Server;