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.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

View file

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

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()
{
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);
});
}
}

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