Skip to content

Instantly share code, notes, and snippets.

@pnegri
Created April 16, 2014 04:33
Show Gist options
  • Save pnegri/10807277 to your computer and use it in GitHub Desktop.
Save pnegri/10807277 to your computer and use it in GitHub Desktop.
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
@pnegri
Copy link
Author

pnegri commented Apr 16, 2014

{
"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": {}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment