Created
April 16, 2014 04:33
-
-
Save pnegri/10807277 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Net = require 'net' | |
Dissolve = require 'dissolve' | |
Util = require "util" | |
Concentrate = require 'concentrate' | |
PCT_NOHUP = 1 | |
PCT_LOGINREQUEST = 2 | |
PCT_LOGINRESPONSE = 3 | |
PCT_ADM_SEND_MSG = 4 | |
PCT_ADM_MSG = 5 | |
clients = [] | |
# GameEventHandler - Handler Main Game Event | |
class GameEventHandler | |
dispatch: ( data ) -> | |
console.log data | |
switch data.packet_id | |
when PCT_NOHUP | |
response = Concentrate().uint8(PCT_LOGINRESPONSE).uint8(0) | |
data.socket.write(response.result()) | |
### | |
switch data.packet_id | |
when PCT_LOGINREQUEST | |
console.log("TRYING TO LOGIN") | |
Account.find({where: {name:data.login,password:data.password}}).success( (record) -> | |
if record != null | |
response = Concentrate().uint8(PCT_LOGINRESPONSE).uint8(0) | |
data.socket.write(response.result()) | |
data.socket.account = record | |
else | |
response = Concentrate().uint8(PCT_LOGINRESPONSE).uint8(1) | |
data.socket.write(response.result()) | |
) | |
when PCT_ADM_SEND_MSG | |
data.msg = data.socket.account.name + ": " + data.msg | |
size = data.msg.length | |
clients.forEach( (client) -> | |
response = Concentrate().uint8(PCT_ADM_MSG).uint16le(size+2).uint16le(size).string(data.msg, "utf-8") | |
client.write(response.result()) | |
) | |
### | |
# GameProtocolParser - Parses Data from Clients and other servers | |
GameProtocolParser = -> | |
Dissolve.call @ | |
@readPacket = -> | |
@uint8("packet_id").tap( @parsePackets ).tap( @transformToGameEvent ) | |
@parsePackets = -> | |
switch @vars.packet_id | |
when PCT_NOHUP then @uint16le("text_size").string("text","text_size") | |
## when PCT_LOGINREQUEST then @uint16le("login_size").string("login","login_size").uint16le("password_size").string("password","password_size") | |
## when PCT_ADM_SEND_MSG then @uint16le("packet_size").uint16le("msg_size").string("msg","msg_size") | |
@transformToGameEvent = -> | |
@push(@vars) | |
@vars = {} | |
@loop @readPacket | |
Util.inherits GameProtocolParser, Dissolve | |
GameProtocolParser.prototype._dissolveTransform = GameProtocolParser.prototype._transform | |
GameProtocolParser.prototype._transform = ( input, encoding, done ) -> | |
@vars["socket"] = input.socket | |
input = input.data | |
@_dissolveTransform input, encoding, done | |
# Server Logic (Initialize EventHandler and ProtocolParser) | |
gameEventHandler = new GameEventHandler() | |
gameProtocolParser = new GameProtocolParser() | |
gameProtocolParser.on 'readable', -> | |
while e = gameProtocolParser.read() | |
gameEventHandler.dispatch e | |
HOST = '0.0.0.0' | |
PORT = 50010 | |
server = Net.createServer() | |
server.listen PORT, HOST | |
server.on 'listening', -> | |
console.log 'Server listening on ' + server.address().address+':'+ server.address().port | |
server.on 'connection', ( socket ) -> | |
socket.key = socket.remoteAddress + ":" + socket.remotePort | |
clients.push socket | |
console.log 'New connection: ' + socket.key | |
socket.on 'data', ( data ) -> | |
console.log 'RECEIVING DATA: ' + socket.key | |
gameProtocolParser.write | |
socket: socket | |
data: data | |
socket.on 'close', -> | |
console.log 'ByeBye for client ' + socket.key | |
clients.splice(clients.indexOf(socket), 1) | |
server.on 'end', -> | |
console.log 'Goodbye' | |
server.on 'error', (e) -> | |
if e.code == 'EADDRINUSE' | |
console.log 'Address in use, retrying...' | |
setTimeout -> | |
server.close() | |
server.listen PORT, HOST | |
, 1000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
{
"name": "Netherdeep.js",
"description": "",
"version": "0.0.1",
"author": "Patrick Negri [email protected]",
"homepage": "http://github.com/pnegri/netherdeep",
"contributors": [],
"engines": {
"node": ">= 0.4.0 < 0.12.0"
},
"dependencies": {
"concentrate": "",
"dissolve": "",
"sequelize": "",
"mysql": "",
"async": "",
"underscore": "",
"node-schedule": "",
"express": "",
"ejs": "~0.8.5",
"ejs-locals": "~1.0.2",
"node-sass": "~0.8.1",
"merge-js": "~1.1.0",
"hashpool": "0.0.1"
},
"devDependencies": {}
}