New system finished, Ready to use?

This commit is contained in:
2022-11-19 19:37:43 +05:30
parent cde178a4ac
commit 6375434aaa
3 changed files with 73 additions and 10 deletions
+42 -3
View File
@@ -1,4 +1,43 @@
# CupidServer # Cupid Server - Matchmake with Dedicated Servers. NOT RELAYS
This is the Server daemon for Cupid Matchmaking system for Mirror unity. Cupid is a Matchmaking backend that can open game instances on demand. Just like making rooms in a relay server, This will open Game instance for each room so the Rooms can be dedicated servers instead of making the players the host.
You have to run this program on the same server where you'll be hosting your game This consists of two parts, This is the server backend written in NodeJS. Client will communicate with this and this will manage rooms and game instances.
# How to install
To install the server application, Download the repo or clone it using git command.</br>
``git clone https://github.com/Sewmina7/CupidServer.git``
Then get inside the directory where the ``app.js`` is locted, and enter </br>
``node app``</br>
to run the application.
** Make sure to Allow the API listening port and Port range for Rooms.
For default config: </br>``sudo ufw allow 1601 && sudo ufw allow 2000:3000/tcp && sudo ufw allow 2000:3000/udp``</br> (You can open only the chosen Protocol if you are worried about safety when opening both)
# Configuration
Inside the directory, There is a file called ``settings.json`` . Default Settings are like this
```
{
"port":1601,
"password":"xyz@123",
"game_exe":"/root/Unity/CupidSample/Builds/Linux/Cupid.x86_64",
"minimum_players": 2,
"maximum_players": 5,
"waiting_time": 30000,
"port_range_min":2000,
"port_range_max":3000,
"log_level":3
}
```
Let me explain what each parameter does.
``port`` : The port on server which will listen to clients. This port must be open / allowed by firewall (ex: ``ufw allow 1601``)</br></br>
``password`` : API key to validate the client. You can enter a safe phrase to make it secure.</br></br>
``game_exe`` : Where the ``Server Build`` Of the game is located. This is the file which will be opened when making a new room. (This instance is passed the argument ``-port``. Look on Unity implementation for further details.</br></br>
``minimum_players`` : Minimum players required to start a new Room.</br></br>
``maximum_players`` : Limit of players that can be on a single Room.</br></br>
``waiting_tiem`` : Time (in miliseconds) before the Room expires. Each room will only last this amount of time</br></br>
``port_range_min`` : Lower bound of the Port range available for Rooms. </br></br>
``port_range_max`` : Higher bound of the Port range available for Rooms.</br></br>
``log_level`` : What the application will spit. ( 0:only necessary, 1:debug, 2:verbose )
+9 -6
View File
@@ -3,8 +3,6 @@ console.log("Starting Cupid Matchmaker for unity " + version);
console.log("") console.log("")
const { response } = require('express'); const { response } = require('express');
const { exec, execFile } = require('child_process');
var spawn = require('child_process').spawn;
const express = require('express') const express = require('express')
const app = express() const app = express()
require('./settings')(); require('./settings')();
@@ -18,6 +16,7 @@ const queueGraceTime = 2000;
var settings = ReadSettings(); var settings = ReadSettings();
if (settings == null) { return; } if (settings == null) { return; }
const logLevel = settings.log_level; const logLevel = settings.log_level;
LogVerbose(settings); LogVerbose(settings);
var Rooms = []; var Rooms = [];
@@ -89,8 +88,10 @@ app.get('/', (req, res) => {
//Neither in a room nor in queue, Let's see //Neither in a room nor in queue, Let's see
if(possibleRoom == null){ if(possibleRoom == null){
if(Queue.length >= settings.minimum_players){ if(Queue.length >= settings.minimum_players){
var newRoom = {Players:[{Name:username, LastSeen: Date.now()}], Port: Helpers.GetRandomPort(settings.port_range_min, settings.port_range_max), InitTime: Date.now()}; var newPort = Helpers.GetRandomPort(settings.port_range_min, settings.port_range_max);
var newRoom = {Players:[{Name:username, LastSeen: Date.now()}], Port: newPort, InitTime: Date.now()};
Rooms.push(newRoom); Rooms.push(newRoom);
Helpers.OpenGameInstance(settings.game_exe, newPort);
res.send(newRoom); // <------- Exit [ Made a new room ] res.send(newRoom); // <------- Exit [ Made a new room ]
return; return;
} }
@@ -122,16 +123,18 @@ app.get('/cancel', (req,res)=>{
if(!ValidateRequest(req,res)){ if(!ValidateRequest(req,res)){
return; return;
} }
var foundUser = false;
Queue.forEach((element)=>{ Queue.forEach((element)=>{
if(element.Name == username){ if(element.Name == username){
Queue.pop(element); Queue.pop(element);
res.send("1"); res.send("1");
foundUser=true;
return; return;
} }
}) })
if(!foundUser){
res.send("Couldn't find user " + username + " in the queue"); res.send("Couldn't find user " + username + " in the queue");
}
}) })
function ValidateRequest(req, res){ function ValidateRequest(req, res){
+22 -1
View File
@@ -1,10 +1,31 @@
var spawn = require('child_process').spawn;
exports.GetRandomPort =function(min,max){ exports.GetRandomPort =function(min,max){
var port = randomIntFromInterval(min,max); var port = randomIntFromInterval(min,max);
// console.log("min:"+min+", max:"+max+" = "+port); // console.log("min:"+min+", max:"+max+" = "+port);
return port; return port;
}; };
exports.OpenGameInstance = function(path,port){
var arguments = ["-port", port];
var child = spawn(path, arguments);
child.stdout.on('data', function (data) {
// console.log('stdout: ' + data);
});
child.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
child.on('close', function (code) {
console.log('Game instance with port ' + port + " exited with code " + code);
});
};
function randomIntFromInterval(min, max) { // min and max included function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min) return Math.floor(Math.random() * (max - min + 1) + min)
} }