diff --git a/doc/api.md b/doc/api.md index 62e0352..18f1946 100644 --- a/doc/api.md +++ b/doc/api.md @@ -31,15 +31,26 @@ - [serv.players](#servplayers) - [serv.uuidToPlayer](#servuuidtoplayer) - [serv.world](#servworld) + - [Events](#events) + - ["error" (error)](#error-error) + - ["listening" (port)](#listening-port) - [Methods](#methods) - [serv.createLog()](#servcreatelog) - [serv.log(message)](#servlogmessage) + - [serv.broadcast(message[,color])](#servbroadcastmessagecolor) - [Player](#player) - [Properties](#properties-1) - [player.entity](#playerentity) + - [Events](#events-1) + - ["connected"](#connected) + - ["spawned"](#spawned) + - ["disconnected"](#disconnected) + - ["error" (error)](#error-error-1) + - ["chat" (message)](#chat-message) - [Methods](#methods-1) - [player.login()](#playerlogin) - [player.others()](#playerothers) + - [player.chat(message)](#playerchatmessage) - [Low level properties](#low-level-properties) - [player._client](#player_client) - [Low level methods](#low-level-methods) @@ -157,16 +168,30 @@ Object uuid to players The map +### Events + +#### "error" (error) + +Fires when there is an error. + +#### "listening" (port) + +Fires when the server is listening. + ### Methods #### serv.createLog() -create the log file +creates the log file #### serv.log(message) logs a `message` +#### serv.broadcast(message[,color]) + +broadcasts `message` to all the players with the optional `color`. + ## Player @@ -176,6 +201,27 @@ logs a `message` The entity of the player, of type `CraftyJS.Entity` +### Events + +#### "connected" + +Fires when the player is connected + +#### "spawned" + +Fires when the player is spawned + +#### "disconnected" + +Fires when the player disconnected + +#### "error" (error) + +Fires when there is an error. + +#### "chat" (message) + +Fires when the player says `message`. ### Methods @@ -187,6 +233,10 @@ login return the other players than `player` +#### player.chat(message) + +sends `message` to the player + ### Low level properties #### player._client diff --git a/index.js b/index.js index 8e6e43d..782adea 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,8 @@ var path = require('path'); var requireIndex = require('requireindex'); var serverPlugins = requireIndex(path.join(__dirname, 'lib', 'serverPlugins')); var playerPlugins = requireIndex(path.join(__dirname, 'lib', 'playerPlugins')); +var Player=require("./lib/player"); +require("longjohn"); module.exports = { createMCServer:createMCServer @@ -36,17 +38,15 @@ MCServer.prototype.connect = function(options) { } self._server.on('error', function(error) { - console.log('[ERR] ', error.stack); - self.log('[ERR]: Server:', error.stack); + self.emit('error',error); }); self._server.on('listening', function() { - console.log('[INFO]: Server listening on port', self._server.socketServer.address().port); - self.log('[INFO]: Server listening on port', self._server.socketServer.address().port); + self.emit('listening',self._server.socketServer.address().port); }); self._server.on('login', function (client) { - var player={}; + var player=new Player(); player._client=client; for(var pluginName in playerPlugins) { playerPlugins[pluginName](self, player, options); diff --git a/lib/player.js b/lib/player.js new file mode 100644 index 0000000..91c92ae --- /dev/null +++ b/lib/player.js @@ -0,0 +1,12 @@ +var util = require('util'); +var EventEmitter = require('events').EventEmitter; + +module.exports = Player; + +function Player() +{ + EventEmitter.call(this); + this._client=null; + this._entity=null; +} +util.inherits(Player, EventEmitter); \ No newline at end of file diff --git a/lib/playerPlugins/chat.js b/lib/playerPlugins/chat.js new file mode 100644 index 0000000..9d98de7 --- /dev/null +++ b/lib/playerPlugins/chat.js @@ -0,0 +1,15 @@ +module.exports=inject; + +function inject(serv,player) +{ + player._client.on('chat', function (data) { + serv.broadcast('<' + player._client.username + '>' + ' ' + data.message); + player.emit("chat",data.message); + }); + + function chat(message) { + player._client.write('chat', { message: JSON.stringify(message), position: 0 }); + } + + player.chat=chat; +} \ No newline at end of file diff --git a/lib/playerPlugins/log.js b/lib/playerPlugins/log.js new file mode 100644 index 0000000..05b24e1 --- /dev/null +++ b/lib/playerPlugins/log.js @@ -0,0 +1,33 @@ +module.exports=inject; + +function inject(serv,player) +{ + + player.on("connected",function(){ + var addr = player._client.socket.remoteAddress + ':' + player._client.socket.remotePort; + console.log("[INFO]: " + player._client.username + ' connected', '(' + addr + ')'); + serv.log("[INFO]: " + player._client.username + ' connected', '(' + addr + ')'); + }); + + player.on("spawned",function(){ + console.log("[INFO]: position written, player spawning..."); + serv.log("[INFO]: position written, player spawning..."); + }); + + player.on("disconnected",function(){ + console.log("[INFO]: " + player._client.username + ' disconnected', '(' + addr + ')'); + serv.log("[INFO]: " + player._client.username + ' disconnected', '(' + addr + ')'); + }); + + player.on("error",function(error){ + console.log('[ERR] ' + error.stack); + serv.log('[ERR]: Client: ' + error.stack); + }); + + player.on("chat",function(message){ + message = '<' + player._client.username + '>' + ' ' + message; + console.log("[INFO] " + message); + serv.log("[INFO] " + message); + }); + +} \ No newline at end of file diff --git a/lib/playerPlugins/login.js b/lib/playerPlugins/login.js index fd6f6d8..950e9c7 100644 --- a/lib/playerPlugins/login.js +++ b/lib/playerPlugins/login.js @@ -72,16 +72,6 @@ function inject(serv,player) }); } - function announceLogin() - { - player._client.on('chat', function (data) { - var message = '<' + client.username + '>' + ' ' + data.message; - playerChat(message, client.username); - console.log("[INFO] " + message); - serv.log("[INFO] " + message); - }); - } - function fillTabList() { player._writeOthers('player_info',{ @@ -146,48 +136,10 @@ function inject(serv,player) function announceJoin() { - broadcast(player._client.username + ' joined the game.', "yellow"); - var addr = player._client.socket.remoteAddress + ':' + player._client.socket.remotePort; - console.log("[INFO]: " + player._client.username + ' connected', '(' + addr + ')'); - serv.log("[INFO]: " + player._client.username + ' connected', '(' + addr + ')'); + serv.broadcast(player._client.username + ' joined the game.', "yellow"); + player.emit("connected"); } - - function playerChat(message, exclude, username) { - var client; - //translate = username ? 'chat.type.text' : 'chat.type.text'; - username = username || ''; - for(var clientId in server.clients) { - if(!serv._server.clients.hasOwnProperty(clientId)) continue; - - client = serv._server.clients[clientId]; - if(client !== exclude) { - var msg = { - "text": username + message - }; - client.write('chat', { message: JSON.stringify(msg), position: 0 }); - } - } - } - - - - - function broadcast(message, color) { - var client; - for(var clientId in serv._server.clients) { - if(!serv._server.clients.hasOwnProperty(clientId)) continue; - - client = serv._server.clients[clientId]; - var msg = { - "text": message, - "color": color - }; - client.write('chat', { message: JSON.stringify(msg), position: 0 }); - } - } - - function login() { if (serv.uuidToPlayer[player._client.uuid]) { @@ -199,29 +151,24 @@ function inject(serv,player) sendMap(); sendInitialPosition(); - console.log("[INFO]: position written, player spawning..."); - serv.log("[INFO]: position written, player spawning..."); + player.emit("spawned"); updateTime(); updateGameState(); - announceLogin(); fillTabList(); spawn(); announceJoin(); - var addr = player._client.socket.remoteAddress + ':' + player._client.socket.remotePort; player._client.on('end', function () { - broadcast(player._client.username + ' joined the game.', "yellow"); - console.log("[INFO]: " + player._client.username + ' disconnected', '(' + addr + ')'); - serv.log("[INFO]: " + player._client.username + ' disconnected', '(' + addr + ')'); + serv.broadcast(player._client.username + ' quit the game.', "yellow"); + player.emit('disconnect'); }); player._client.on('error', function (error) { - console.log('[ERR] ' + error.stack); - serv.log('[ERR]: Client: ' + error.stack); + player.emit('error',error); }); } } \ No newline at end of file diff --git a/lib/serverPlugins/chat.js b/lib/serverPlugins/chat.js new file mode 100644 index 0000000..7d6aefc --- /dev/null +++ b/lib/serverPlugins/chat.js @@ -0,0 +1,16 @@ +module.exports=inject; + +function inject(serv) +{ + function broadcast(message, color) { + serv.players.forEach(function(player){ + var msg = { + "text": message, + "color": color + }; + player.chat(msg); + }); + } + + serv.broadcast=broadcast; +} \ No newline at end of file diff --git a/lib/serverPlugins/log.js b/lib/serverPlugins/log.js index 9da4bcf..a9c154e 100644 --- a/lib/serverPlugins/log.js +++ b/lib/serverPlugins/log.js @@ -1,12 +1,21 @@ -module.exports=inject; - var fs = require('fs'); var timeStarted = Math.floor(new Date() / 1000).toString(); -function inject(serv,settings) { - serv.log=log; - serv.createLog=createLog; +module.exports=inject; + +function inject(serv,settings) +{ + serv.on("error",function(error){ + console.log('[ERR] ', error.stack); + log('[ERR]: Server:', error.stack); + }); + + serv.on("listening",function(port){ + console.log('[INFO]: Server listening on port', port); + log('[INFO]: Server listening on port', port); + }); + function log(message) { if (settings.logging == true) { @@ -15,10 +24,12 @@ function inject(serv,settings) { } } - function createLog() { fs.writeFile("logs/" + timeStarted + ".log", "[INFO]: Started logging...\n", function (err, data) { if (err) return console.log(err); }); } -} + + serv.log=log; + serv.createLog=createLog; +} \ No newline at end of file