The Server has overcome it's early Development Steps. although it still is a bit unstable it works in it's actual state
199 lines
7.7 KiB
JavaScript
199 lines
7.7 KiB
JavaScript
const WebSocket = require('ws'); // Websocket Frame
|
|
const sql = require('mysql'); // SQL frame
|
|
const db = require('./bin/config/sql.json'); // SQL Config
|
|
const net = require('net'); // TCP Connection
|
|
const readline = require('readline'); // Console Input
|
|
const colors = require('colors'); // Console Colours
|
|
let config = require('./bin/config/server.json'); // Server Config
|
|
|
|
// Socket
|
|
let socket = require('./bin/classes/websocket'); // Requires Websocket Object
|
|
let wss = socket(WebSocket, config); // Asignes Websocket
|
|
//Classes
|
|
let crypt = require('./bin/classes/decrypt'); // Cryption Class
|
|
let IsJsonString = require('./bin/classes/IsJsonString'); // JSON Validator
|
|
let listener = require('./bin/classes/events/listener'); // Event Listener
|
|
|
|
// Events
|
|
let tcp_login = require('./bin/classes/events/tcp/login'); // TCP Login Event
|
|
let ws_login = require('./bin/classes/events/ws/login'); // WSS Login Event
|
|
let ws_logout = require('./bin/classes/events/ws/logout'); // WSS Logout Event
|
|
|
|
// Database Definition
|
|
var db_con = sql.createConnection({
|
|
host : db.host,
|
|
user : db.user,
|
|
password : db.pw,
|
|
database : db.name
|
|
});
|
|
|
|
// Console Input
|
|
const rl = readline.createInterface({input: process.stdin, output: process.stdout});
|
|
|
|
wss.on('connection', (ws) => {
|
|
ws.on('message', function incoming(data) {
|
|
if(IsJsonString(data)){
|
|
let payload = JSON.parse(data);
|
|
//console.log('WSS: ' + payload['event']);
|
|
let events = [
|
|
{name:'login', function() {ws_login(payload, db_con, ws, crypt)}},
|
|
{name:'logout', function() {ws_logout(payload, db_con, ws)}},
|
|
];
|
|
listener(events,payload.event);
|
|
/**
|
|
* logout:
|
|
* Removes Session Key
|
|
* and sends packet to redirect from the user area
|
|
* ends connection
|
|
* register:
|
|
* User Folder Structure:
|
|
* Usersroot(named like the user) I--> space (where files get stored)
|
|
* I--> meta (Where user infos get stored)
|
|
* Ends Connection
|
|
* Database Oriented Data Management
|
|
* getData
|
|
* Sends Requested data
|
|
*
|
|
* Ends Connection
|
|
* writeData
|
|
* Wrights Data to the Database
|
|
* Check if user id is given
|
|
* Ends Connection
|
|
* Physical Data management
|
|
* updload
|
|
* Takes Uploaded Data and places it in the Users Space
|
|
* Ends Connection
|
|
* download
|
|
* Serves Requested Files from the Users Space
|
|
* Ends Connection
|
|
*/
|
|
}
|
|
});
|
|
});
|
|
|
|
let server = net.createServer((socket) => {
|
|
socket.on('data', (data) => {
|
|
if(IsJsonString(data)){
|
|
let payload = JSON.parse(data);
|
|
console.log('TCP: ' + payload['event']);
|
|
if(IsJsonString(data)){
|
|
let payload = JSON.parse(data);
|
|
let events = [
|
|
{name:'login', function() { tcp_login(payload, db_con, socket, crypt) } },
|
|
{name:'test', function() { console.log('test 1111') } },
|
|
];
|
|
listener(events,payload.event);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
// ========================================================================
|
|
// * The Console Input *
|
|
// ========================================================================
|
|
rl.on('line', (input) => {
|
|
//TODO: change all Console output to following Format console.log(colors.grey(`test ${colors.yellow("text")}`));
|
|
let messageArray = input.split(" ");
|
|
let cmd = messageArray[0];
|
|
let args = messageArray.slice(0);
|
|
|
|
console.log(args);
|
|
switch(args[0].toLowerCase()){
|
|
case 'help':
|
|
console.log(colors.grey('=================================== ') + colors.yellow('Help') + colors.grey(' ==================================='));
|
|
console.log(colors.yellow('Help:') + colors.grey(' Shows a list of all avaiable Comamnds.'));
|
|
console.log(colors.yellow('Shutdown:') + colors.grey(' shuts down the Server.'));
|
|
console.log(colors.grey('============================================================================'));
|
|
break;
|
|
case 'shutdown':
|
|
rl.question(colors.grey('Are you sure you want to shut down the Server?')+'\n'+colors.yellow('(Yes, y) = Yes, (No, n) = No: '), (reply) => {
|
|
let answer = reply.toLowerCase();
|
|
//Askes if the Server should be shutdown
|
|
if(answer === 'yes' || answer === 'y'){
|
|
process.exit(0);
|
|
}else if(answer === 'no' || answer === 'n'){
|
|
return;
|
|
}else{
|
|
return;
|
|
}
|
|
});
|
|
break;
|
|
case 'maintance':
|
|
let config = file.import('./bin/config/server.json');
|
|
switch(args[1]){
|
|
default:
|
|
console.log(colors.grey(`Please Enter a Parameter you can use <${colors.yellow("enable")}, ${colors.yellow("disable")}, ${colors.yellow("current")}>`));
|
|
break;
|
|
case 'disable':
|
|
rl.question(colors.grey('Are you sure you want disable Maintance Mode?')+'\n'+colors.yellow('(Yes, y) = Yes, (No, n) = No: '), (reply) => {
|
|
let answer = reply.toLowerCase();
|
|
//Askes if the Server should be shutdown
|
|
if(answer === 'yes' || answer === 'y'){
|
|
config.maintance = 'true';
|
|
console.log(colors.green('Maintance Mode disabled'));
|
|
file.save('./bin/config/server.json', config);
|
|
}else if(answer === 'no' || answer === 'n'){
|
|
return;
|
|
}else{
|
|
return;
|
|
}
|
|
file.save('./bin/config/server.json', config);
|
|
});
|
|
break;
|
|
case 'enable':
|
|
rl.question(colors.grey('Are you sure you want disable Maintance Mode?')+'\n'+colors.yellow('(Yes, y) = Yes, (No, n) = No: '), (reply) => {
|
|
let answer = reply.toLowerCase();
|
|
//Askes if the Server should be shutdown
|
|
if(answer === 'yes' || answer === 'y'){
|
|
config.maintance = 'false';
|
|
console.log(colors.green('Maintance Mode disabled'));
|
|
file.save('./bin/config/server.json', config);
|
|
}else if(answer === 'no' || answer === 'n'){
|
|
return;
|
|
}else{
|
|
return;
|
|
}
|
|
file.save('./bin/config/server.json', config);
|
|
});
|
|
break;
|
|
case 'current':
|
|
if(config.maintance == 'true'){
|
|
console.log(colors.grey('Maintance Mode is ')+colors.yellow('Activated'));
|
|
}else{
|
|
console.log(colors.grey('Maintance Mode is ')+colors.yellow('Deactivated'));
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
console.log(colors.grey('Invalid Command.. Type ')+colors.yellow('Help')+colors.grey(', to get a list of avaiable Comamnds.'));
|
|
break;
|
|
}
|
|
});
|
|
|
|
// =========================================
|
|
// * Starts Services with all needed ports *
|
|
// =========================================
|
|
//Gets core-node Connections
|
|
server.listen(1337, '127.0.0.1', () => {
|
|
console.log(colors.grey('TCP Server online on Port: ') + colors.yellow(config.tcpserver));
|
|
console.log(colors.grey('WSS Server online on Port: ') + colors.yellow(config.websocket));
|
|
});
|
|
|
|
// ==================================
|
|
// * Checks if the Port is avaiable *
|
|
// * If Yes Run else Restart *
|
|
// ==================================
|
|
server.on('error', (e) => {
|
|
if (e.code === 'EADDRINUSE') {
|
|
console.log('Address in use, retrying...');
|
|
setTimeout(() => {
|
|
|
|
server.close();
|
|
// Gets Server Connections
|
|
server.listen(config.tcpserver, '127.0.0.1', () => {
|
|
console.log('Server online on Port:' + config.tcpserver);
|
|
});
|
|
}, 1000);
|
|
}
|
|
}); |