Skip to content

Commit 83ad5a1

Browse files
committed
Initial comit; working server.
1 parent 13445dc commit 83ad5a1

12 files changed

+258
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
config.json

command.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var Command = function(name, func) {
2+
this.name = name;
3+
this.func = func;
4+
}
5+
6+
Command.prototype.call = function(self, args, stanza) {
7+
this.func.call(self, args, stanza);
8+
}
9+
10+
module.exports = Command;

commands/register.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
var loglevel = require('../loglevel.js');
2+
var User = require('../user.js');
3+
var Command = require('../command.js');
4+
5+
module.exports = Object.keys(loglevel).map(function(key) {
6+
var value = loglevel[key];
7+
return new Command('!' + key.toLowerCase(), function(args, stanza) {
8+
var jid = stanza.attrs.from;
9+
var projectName = args[1];
10+
11+
this.users = this.users.filter(function(user) {
12+
return user.jid !== jid;
13+
});
14+
this.users.push(new User(jid, projectName, value));
15+
16+
if (value == loglevel.OFF)
17+
this.sendMessage(jid, 'Won\'t bother you anymore');
18+
else
19+
this.sendMessage(jid, 'Sending logs ' + key + ' for project "' + projectName + '"');
20+
});
21+
});

commands/status.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
var loglevel = require('../loglevel.js');
2+
var Command = require('../command.js');
3+
4+
var XmppWho = function(args, stanza) {
5+
var jid = stanza.attrs.from;
6+
7+
var user = this.users.filter(function(user) { return user.jid === jid; })[0];
8+
if (user === undefined || user.logLevel === loglevel.OFF) {
9+
this.sendMessage(jid, 'No logs are sent to you.');
10+
return;
11+
}
12+
13+
var levelName = loglevel(user.logLevel);
14+
this.sendMessage(jid, 'You are receiving logs ' + levelName + ' for project "' + user.projectName + '"');
15+
}
16+
17+
module.exports = [ '!st', '!status' ].map(function(name) {
18+
return new Command(name, XmppWho);
19+
});

commands/who.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
var loglevel = require('../loglevel.js');
2+
var Command = require('../command.js');
3+
4+
var XmppWho = function(args, stanza) {
5+
var msg = this.users.filter(function(user) {
6+
return user.logLevel != loglevel.OFF;
7+
}).reduce(function(str, user) {
8+
var level = loglevel(user.logLevel);
9+
return str + user.jid + ' ' + level + ' ' + user.projectName + '\n';
10+
}, '');
11+
12+
if (msg.length === 0)
13+
this.sendMessage(stanza.attrs.from, 'No one is listening.');
14+
else
15+
this.sendMessage(stanza.attrs.from, msg);
16+
}
17+
18+
module.exports = [ '!w', '!who' ].map(function(name) {
19+
return new Command(name, XmppWho);
20+
});

config.json.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
3+
"password": "",
4+
"port": 9989,
5+
"host": "localhost"
6+
}

loglevel.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
var loglevel = function(value) {
2+
return Object.keys(loglevel).filter(function(key) {return loglevel[key] === value})[0];
3+
}
4+
loglevel.TRACE = 0;
5+
loglevel.DEBUG = 1;
6+
loglevel.INFO = 2;
7+
loglevel.WARN = 3;
8+
loglevel.ERROR = 4;
9+
loglevel.OFF = 5;
10+
11+
module.exports = loglevel;

main.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
var config = require('./config.json');
2+
3+
var Xmpp = require('./xmpp.js');
4+
var commands = Array.prototype.concat(
5+
require('./commands/register.js'),
6+
require('./commands/status.js'),
7+
require('./commands/who.js')
8+
);
9+
10+
var xmpp = new Xmpp();
11+
xmpp.connect(config.jid, config.password);
12+
xmpp.setAvailable();
13+
xmpp.registerCommand(commands);
14+
15+
var Server = require('./server.js');
16+
var server = new Server(xmpp);
17+
server.listen(config.port, config.host);

message.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var qs = require('querystring');
2+
var url = require('url');
3+
4+
var Message = function(request, body) {
5+
var query = url.parse(request.url, true).query;
6+
7+
this.body = body;
8+
this.projectName = query.projectName;
9+
this.logLevel = query.level;
10+
}
11+
12+
module.exports = Message;

server.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
var http = require('http');
2+
var Message = require('./message.js');
3+
var credentials = 'superusr1245!:passpasspass123';
4+
5+
var HttpServer = function(xmpp) {
6+
var server = http.createServer();
7+
8+
server.on('request', function(request, response) {
9+
var auth = request.headers.authorization;
10+
if (auth === undefined || new Buffer(auth.replace(/Basic /, ''), 'base64').toString('utf-8') !== credentials) {
11+
response.writeHead(401);
12+
response.end('Not authorized.');
13+
return;
14+
}
15+
16+
if (request.method === 'GET') {
17+
var projectName = require('url').parse(request.url).path.substring(1);
18+
var level = xmpp.getLevel(projectName).toString();
19+
response.writeHead(200);
20+
response.end(level, 'utf-8');
21+
} else {
22+
var body = '';
23+
request.on('data', function(chunk) {
24+
body += chunk;
25+
});
26+
27+
request.on('end', function() {
28+
xmpp.log(new Message(request, body));
29+
response.writeHead(200);
30+
response.end();
31+
});
32+
}
33+
});
34+
35+
return server;
36+
}
37+
38+
module.exports = HttpServer;

user.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
var loglevel = require('./loglevel.js');
2+
var User = function(jid, projectName, logLevel) {
3+
this.jid = jid;
4+
this.projectName = projectName;
5+
this.logLevel = logLevel;
6+
}
7+
module.exports = User;

xmpp.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
var xmpp = require('node-xmpp');
2+
var loglevel = require('./loglevel.js');
3+
4+
var Xmpp = function() {
5+
this.client = null;
6+
this.users = [ ];
7+
this.jid = '';
8+
}
9+
10+
Xmpp.prototype = {
11+
respondToPings: function() {
12+
var self = this;
13+
self.client.on('stanza', function(stanza) {
14+
if (stanza.is('iq') && stanza.children.length == 1 && stanza.children[0].is('ping')) {
15+
var pong = new xmpp.Element('iq', {
16+
from: stanza.attrs.to,
17+
to: stanza.attrs.from,
18+
id: stanza.attrs.id,
19+
type: 'result'
20+
});
21+
self.client.send(pong);
22+
}
23+
});
24+
},
25+
connect: function(jid, password) {
26+
var self = this;
27+
28+
self.jid = jid;
29+
self.client = new xmpp.Client({
30+
jid: jid,
31+
password: password
32+
});
33+
self.client.setMaxListeners(100);
34+
self.client.connection.socket.setTimeout(0);
35+
self.client.connection.socket.setKeepAlive(true, 10000);
36+
self.respondToPings();
37+
38+
self.client.on('error', function(e) {
39+
console.error(e);
40+
process.exit(1);
41+
});
42+
},
43+
setAvailable: function() {
44+
var self = this;
45+
self.client.on('online', function() {
46+
self.client.send(
47+
new xmpp.Element('presence',{
48+
type: 'chat'
49+
}).c('show').t('chat').up()
50+
);
51+
});
52+
},
53+
registerCommand: function(command) {
54+
var self = this;
55+
if (Array.isArray(command)) {
56+
for (var i in command)
57+
self.registerCommand(command[i]);
58+
return;
59+
}
60+
61+
self.client.on('stanza', function(stanza) {
62+
var body = stanza.getChild('body');
63+
if (!stanza.is('message') || stanza.attrs.type !== 'chat' || body == undefined)
64+
return;
65+
66+
var msg = body.getText();
67+
var args = msg.split(/\s+/);
68+
if (args[0] === command.name)
69+
command.call(self, args, stanza);
70+
});
71+
},
72+
sendMessage: function(to, msg) {
73+
this.client.send(new xmpp.Element('message', {
74+
to: to,
75+
type: 'chat'
76+
}).c('body').t(msg));
77+
},
78+
log: function(msg) {
79+
for (var i in this.users) {
80+
var user = this.users[i];
81+
if (user.projectName == msg.projectName && user.logLevel <= msg.logLevel)
82+
this.sendMessage(user.jid, msg.body);
83+
}
84+
},
85+
getLevel: function(projectName) {
86+
return this.users.filter(function(user) {
87+
return user.projectName === projectName;
88+
}).map(function(user) {
89+
return user.logLevel;
90+
}).reduce(function(minLevel, level) {
91+
return Math.min(minLevel, level);
92+
}, loglevel.OFF);
93+
}
94+
}
95+
96+
module.exports = Xmpp;

0 commit comments

Comments
 (0)