Commit 85a01308 authored by 神楽坂玲奈's avatar 神楽坂玲奈

class Room

parent 06e55585
{
"name": "ygopro-server",
"version": "2.0.0",
"description": "a server for ygopro",
"repository": {
"type": "git",
"url": "https://github.com/mycard/ygopro-server.git"
},
"keywords": [
"mycard",
"ygopro",
"server"
],
"author": "zh99998 <zh99998@gmail.com>",
"dependencies": {
"underscore": "*",
"freeport": "*",
"struct": "*",
"inotify": "*"
},
"license": "GPLv3",
"main": "ygopro-server.js",
"scripts": {
"start": "forever start mycard-server-match.js",
"build": "coffee -c mycard-server-match.coffee"
},
"engines": {
"node": "*"
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
// Generated by CoffeeScript 1.6.3
(function() {
var Inotify, Struct, constants, ctos_follow, ctos_follows, ctos_send, declaration, field, freeport, fs, http, inotify, listener, name, net, path, proto_structs, result, rooms, rooms_port_process, server_listener, settings, spawn, stoc_follow, stoc_follows, stoc_send, structs, structs_declaration, taici, type, typedefs, url, _, _i, _len;
var Inotify, Room, Struct, constants, ctos_follow, ctos_follows, ctos_send, debug, declaration, field, freeport, fs, http, inotify, listener, name, net, path, proto_structs, result, server_listener, settings, spawn, stoc_follow, stoc_follows, stoc_send, structs, structs_declaration, taici, type, typedefs, url, _, _i, _len;
net = require('net');
......@@ -8,6 +8,10 @@
url = require('url');
path = require('path');
fs = require('fs');
spawn = require('child_process').spawn;
freeport = require('freeport');
......@@ -16,6 +20,8 @@
_ = require('underscore');
Inotify = require('inotify').Inotify;
structs_declaration = require('./structs.json');
typedefs = require('./typedefs.json');
......@@ -26,9 +32,59 @@
settings = require('./config.json');
Room = (function() {
Room.all = [];
function Room(name, port, client) {
this.name = name;
this.port = port;
this.alive = true;
this.players = [];
this.add_client(client);
Room.all.push(this);
}
Room.prototype["delete"] = function(room) {
return delete Room.all[_.indexOf(Room.all, room)];
};
Room.prototype.add_client = function(client) {
return this.players.push({
client: client,
name: client.player
});
};
Room.find_by_name = function(name) {
return _.find(this.all, function(room) {
return room.name === name;
});
};
Room.find_by_port = function(port) {
return _.find(this.all, function(room) {
return room.name === port;
});
};
Room.find_by_client = function(client) {
return _.find(this.all, function(room) {
return _.some(room.players, function(player) {
return player.client === client;
});
});
};
return Room;
})();
debug = false;
if (process.argv[2] === '--debug') {
settings.port++;
settings.http_port++;
debug = true;
}
structs = {};
......@@ -143,7 +199,9 @@
if (buffer.length) {
socket.write(buffer);
}
return console.log('stoc_sent:', buffer);
if (debug) {
return console.log('stoc_sent:', buffer);
}
};
ctos_send = function(socket, proto, info) {
......@@ -178,7 +236,9 @@
if (buffer.length) {
socket.write(buffer);
}
return console.log('ctos_sent:', buffer);
if (debug) {
return console.log('ctos_sent:', buffer);
}
};
server_listener = function(port, client, server) {
......@@ -195,7 +255,9 @@
}
server.on("data", function(data) {
var b, struct;
console.log('server: ', data);
if (debug) {
console.log('server: ', data);
}
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length);
while (true) {
if (stoc_message_length === 0) {
......@@ -212,7 +274,9 @@
}
} else {
if (stoc_buffer.length >= 2 + stoc_message_length) {
console.log(constants.STOC[stoc_proto]);
if (debug) {
console.log(constants.STOC[stoc_proto]);
}
if (stoc_follows[stoc_proto]) {
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3);
if (struct = structs[proto_structs.STOC[constants.STOC[stoc_proto]]]) {
......@@ -244,10 +308,6 @@
});
};
rooms = {};
rooms_port_process = {};
listener = net.createServer(function(client) {
var ctos_buffer, ctos_message_length, ctos_proto, server;
client.connected = false;
......@@ -261,7 +321,9 @@
});
client.on("data", function(data) {
var b, struct;
console.log('client: ', data);
if (debug) {
console.log('client: ', data);
}
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length);
while (true) {
if (ctos_message_length === 0) {
......@@ -278,7 +340,9 @@
}
} else {
if (ctos_buffer.length >= 2 + ctos_message_length) {
console.log(constants.CTOS[ctos_proto]);
if (debug) {
console.log(constants.CTOS[ctos_proto]);
}
if (ctos_follows[ctos_proto]) {
b = ctos_buffer.slice(3, ctos_message_length - 1 + 3);
if (struct = structs[proto_structs.CTOS[constants.CTOS[ctos_proto]]]) {
......@@ -321,7 +385,7 @@
});
ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) {
var room_name;
var room, room_name;
room_name = info.pass;
if (info.version !== settings.version) {
stoc_send(client, 'ERROR_MSG', {
......@@ -343,24 +407,24 @@
return client.end();
} else {
if (client.player !== '[INCORRECT]') {
if (rooms[room_name]) {
if (typeof rooms[room_name] === 'number') {
return server.connect(rooms[room_name], '127.0.0.1', function() {
return server_listener(rooms[room_name], client, server);
room = Room.find_by_name(room_name);
if (room) {
room.add_client(client);
if (room.established) {
return server.connect(room.port, '127.0.0.1', function() {
return server_listener(room.port, client, server);
});
} else {
return rooms[room_name].push(client);
}
} else {
return freeport(function(err, port) {
var param, room;
if (rooms[room_name]) {
if (typeof rooms[room_name] === 'number') {
return server.connect(rooms[room_name], '127.0.0.1', function() {
return server_listener(rooms[room_name], client, server);
var param, process;
room = Room.find_by_name(room_name);
if (room) {
room.add_client(client);
if (room.established) {
return server.connect(room.port, '127.0.0.1', function() {
return server_listener(room.port, client, server);
});
} else {
return rooms[room_name].push(client);
}
} else {
if (err) {
......@@ -370,7 +434,7 @@
});
return client.end();
} else {
rooms[room_name] = [client];
room = new Room(room_name, port, client);
if (room_name.slice(0, 2) === 'M#') {
param = [0, 0, 1, 'F', 'F', 'F', 8000, 5, 1];
} else if (room_name.slice(0, 2) === 'T#') {
......@@ -382,26 +446,20 @@
param = [0, 0, 0, 'F', 'F', 'F', 8000, 5, 1];
}
param.unshift(port);
room = spawn('./ygopro', param, {
process = spawn('./ygopro', param, {
cwd: 'ygocore'
});
room.alive = true;
rooms_port_process[port] = room;
room.on('exit', function(code) {
delete rooms[room_name];
return delete rooms_port_process[port];
room.process = process;
process.on('exit', function(code) {
return room["delete"]();
});
return room.stdout.once('data', function(data) {
if (rooms[room_name]) {
rooms[room_name].forEach(function(c) {
return server.connect(port, '127.0.0.1', function() {
return server_listener(port, c, server);
});
return process.stdout.once('data', function(data) {
room.established = true;
return _.each(room.players, function(player) {
return server.connect(port, '127.0.0.1', function() {
return server_listener(port, player.client, server);
});
return rooms[room_name] = port;
} else {
return room.kill();
}
});
});
}
}
......@@ -453,19 +511,13 @@
http.createServer(function(request, response) {
if (url.parse(request.url).pathname === '/count.json') {
response.writeHead(200);
return response.end(Object.keys(rooms).length.toString());
return response.end(rooms.length.toString());
} else {
response.writeHead(404);
return response.end();
}
}).listen(settings.http_port);
path = require('path');
fs = require('fs');
Inotify = require('inotify').Inotify;
inotify = new Inotify();
inotify.addWatch({
......@@ -476,7 +528,7 @@
mask = event.mask;
if (event.name) {
port = parseInt(path.basename(event.name, '.yrp'));
room = rooms_port_process[port];
room = Room.find_by_port(port);
if (room) {
if (mask & Inotify.IN_CREATE) {
......@@ -493,15 +545,15 @@
});
setInterval(function() {
var port, room, _results;
var room, _j, _len1, _results;
_results = [];
for (port in rooms_port_process) {
room = rooms_port_process[port];
for (_j = 0, _len1 = rooms.length; _j < _len1; _j++) {
room = rooms[_j];
if (room.alive) {
_results.push(room.alive = false);
} else {
console.log("killed " + port + " " + room);
_results.push(room.kill());
console.log("kill " + port + " " + room);
_results.push(room.process.kill());
}
}
return _results;
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment