emit events instead of directly logging, add longjohn, add chat plugins

This commit is contained in:
Romain Beaumont 2015-08-26 21:41:59 +02:00
parent 8a4d7a7b9a
commit c3f0645771
8 changed files with 156 additions and 72 deletions

View file

@ -31,15 +31,26 @@
- [serv.players](#servplayers) - [serv.players](#servplayers)
- [serv.uuidToPlayer](#servuuidtoplayer) - [serv.uuidToPlayer](#servuuidtoplayer)
- [serv.world](#servworld) - [serv.world](#servworld)
- [Events](#events)
- ["error" (error)](#error-error)
- ["listening" (port)](#listening-port)
- [Methods](#methods) - [Methods](#methods)
- [serv.createLog()](#servcreatelog) - [serv.createLog()](#servcreatelog)
- [serv.log(message)](#servlogmessage) - [serv.log(message)](#servlogmessage)
- [serv.broadcast(message[,color])](#servbroadcastmessagecolor)
- [Player](#player) - [Player](#player)
- [Properties](#properties-1) - [Properties](#properties-1)
- [player.entity](#playerentity) - [player.entity](#playerentity)
- [Events](#events-1)
- ["connected"](#connected)
- ["spawned"](#spawned)
- ["disconnected"](#disconnected)
- ["error" (error)](#error-error-1)
- ["chat" (message)](#chat-message)
- [Methods](#methods-1) - [Methods](#methods-1)
- [player.login()](#playerlogin) - [player.login()](#playerlogin)
- [player.others()](#playerothers) - [player.others()](#playerothers)
- [player.chat(message)](#playerchatmessage)
- [Low level properties](#low-level-properties) - [Low level properties](#low-level-properties)
- [player._client](#player_client) - [player._client](#player_client)
- [Low level methods](#low-level-methods) - [Low level methods](#low-level-methods)
@ -157,16 +168,30 @@ Object uuid to players
The map The map
### Events
#### "error" (error)
Fires when there is an error.
#### "listening" (port)
Fires when the server is listening.
### Methods ### Methods
#### serv.createLog() #### serv.createLog()
create the log file creates the log file
#### serv.log(message) #### serv.log(message)
logs a `message` logs a `message`
#### serv.broadcast(message[,color])
broadcasts `message` to all the players with the optional `color`.
## Player ## Player
@ -176,6 +201,27 @@ logs a `message`
The entity of the player, of type `CraftyJS.Entity` 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 ### Methods
@ -187,6 +233,10 @@ login
return the other players than `player` return the other players than `player`
#### player.chat(message)
sends `message` to the player
### Low level properties ### Low level properties
#### player._client #### player._client

View file

@ -5,6 +5,8 @@ var path = require('path');
var requireIndex = require('requireindex'); var requireIndex = require('requireindex');
var serverPlugins = requireIndex(path.join(__dirname, 'lib', 'serverPlugins')); var serverPlugins = requireIndex(path.join(__dirname, 'lib', 'serverPlugins'));
var playerPlugins = requireIndex(path.join(__dirname, 'lib', 'playerPlugins')); var playerPlugins = requireIndex(path.join(__dirname, 'lib', 'playerPlugins'));
var Player=require("./lib/player");
require("longjohn");
module.exports = { module.exports = {
createMCServer:createMCServer createMCServer:createMCServer
@ -36,17 +38,15 @@ MCServer.prototype.connect = function(options) {
} }
self._server.on('error', function(error) { self._server.on('error', function(error) {
console.log('[ERR] ', error.stack); self.emit('error',error);
self.log('[ERR]: Server:', error.stack);
}); });
self._server.on('listening', function() { self._server.on('listening', function() {
console.log('[INFO]: Server listening on port', self._server.socketServer.address().port); self.emit('listening',self._server.socketServer.address().port);
self.log('[INFO]: Server listening on port', self._server.socketServer.address().port);
}); });
self._server.on('login', function (client) { self._server.on('login', function (client) {
var player={}; var player=new Player();
player._client=client; player._client=client;
for(var pluginName in playerPlugins) { for(var pluginName in playerPlugins) {
playerPlugins[pluginName](self, player, options); playerPlugins[pluginName](self, player, options);

12
lib/player.js Normal file
View file

@ -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);

15
lib/playerPlugins/chat.js Normal file
View file

@ -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;
}

33
lib/playerPlugins/log.js Normal file
View file

@ -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);
});
}

View file

@ -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() function fillTabList()
{ {
player._writeOthers('player_info',{ player._writeOthers('player_info',{
@ -146,48 +136,10 @@ function inject(serv,player)
function announceJoin() function announceJoin()
{ {
broadcast(player._client.username + ' joined the game.', "yellow"); serv.broadcast(player._client.username + ' joined the game.', "yellow");
var addr = player._client.socket.remoteAddress + ':' + player._client.socket.remotePort; player.emit("connected");
console.log("[INFO]: " + player._client.username + ' connected', '(' + addr + ')');
serv.log("[INFO]: " + player._client.username + ' connected', '(' + addr + ')');
} }
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() function login()
{ {
if (serv.uuidToPlayer[player._client.uuid]) { if (serv.uuidToPlayer[player._client.uuid]) {
@ -199,29 +151,24 @@ function inject(serv,player)
sendMap(); sendMap();
sendInitialPosition(); sendInitialPosition();
console.log("[INFO]: position written, player spawning..."); player.emit("spawned");
serv.log("[INFO]: position written, player spawning...");
updateTime(); updateTime();
updateGameState(); updateGameState();
announceLogin();
fillTabList(); fillTabList();
spawn(); spawn();
announceJoin(); announceJoin();
var addr = player._client.socket.remoteAddress + ':' + player._client.socket.remotePort;
player._client.on('end', function () { player._client.on('end', function () {
broadcast(player._client.username + ' joined the game.', "yellow"); serv.broadcast(player._client.username + ' quit the game.', "yellow");
console.log("[INFO]: " + player._client.username + ' disconnected', '(' + addr + ')'); player.emit('disconnect');
serv.log("[INFO]: " + player._client.username + ' disconnected', '(' + addr + ')');
}); });
player._client.on('error', function (error) { player._client.on('error', function (error) {
console.log('[ERR] ' + error.stack); player.emit('error',error);
serv.log('[ERR]: Client: ' + error.stack);
}); });
} }
} }

16
lib/serverPlugins/chat.js Normal file
View file

@ -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;
}

View file

@ -1,12 +1,21 @@
module.exports=inject;
var fs = require('fs'); var fs = require('fs');
var timeStarted = Math.floor(new Date() / 1000).toString(); var timeStarted = Math.floor(new Date() / 1000).toString();
function inject(serv,settings) {
serv.log=log; module.exports=inject;
serv.createLog=createLog;
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) { function log(message) {
if (settings.logging == true) { if (settings.logging == true) {
@ -15,10 +24,12 @@ function inject(serv,settings) {
} }
} }
function createLog() { function createLog() {
fs.writeFile("logs/" + timeStarted + ".log", "[INFO]: Started logging...\n", function (err, data) { fs.writeFile("logs/" + timeStarted + ".log", "[INFO]: Started logging...\n", function (err, data) {
if (err) return console.log(err); if (err) return console.log(err);
}); });
} }
}
serv.log=log;
serv.createLog=createLog;
}