Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var http    = require('http'),
  2.     router  = require('choreographer').router(),
  3.     redis   = require('redis-node'),
  4.     io      = require('socket.io'),
  5.     fs      = require('fs'),
  6.     config  = require('./conf');
  7.  
  8. http.ServerResponse.prototype.serveFile = function(file, type) {
  9.     var res = this;
  10.     type = type || 'text/html';
  11.     fs.readFile('./public/' + file, function(err, data) {
  12.         if(err) {
  13.             res.writeHead(500);
  14.             res.end("Couldn't serve " + file + ". Error: " + err);
  15.         } else {
  16.             res.writeHead(200, {
  17.                 'Content-Type': type,
  18.                 'Content-Length': data.length
  19.             });
  20.             res.end(data);
  21.         }
  22.     });
  23. };
  24.  
  25. router.get('/', function(req, res) {
  26.     res.serveFile('index.html');
  27. }).get('/style.css', function(req, res) {
  28.     res.serveFile('style.css', 'text/css');
  29. }).get('/client.js', function(req, res) {
  30.     res.serveFile('client.js', 'text/javascript');
  31. });
  32.  
  33. var server = http.createServer(router);
  34. server.listen(config.port);
  35. var socket = io.listen(server);
  36.  
  37. socket.on('connection', function(client) {
  38.     var redis_client = redis.createClient();
  39.     var redis_subscriber;
  40.     var channel = null;
  41.     var nick = null;
  42.     client.on('message', function(data) {
  43.         var packet = JSON.parse(data);
  44.         switch(packet.cmd)
  45.         {
  46.         case 'join':
  47.             channel = packet.channel.replace(/[^A-Za-z0-9_\-']/,'');
  48.             nick = packet.nick;
  49.             redis_client.incr('channels:' + channel);
  50.             redis_client.sadd('channels', channel);
  51.             redis_client.publish(channel, JSON.stringify({
  52.                 ev: 'join',
  53.                 from: nick,
  54.                 time: Math.round(new Date().getTime() / 1000),
  55.                 msg: packet.msg
  56.             }));
  57.             redis_subscriber = redis.createClient();
  58.             redis_subscriber.subscribeTo(channel, function(channel, msg) {
  59.                 client.send(msg);
  60.             });
  61.             client.send(JSON.stringify({ev:'welcome'}));
  62.             break;
  63.         case 'part':
  64.             doPart();
  65.             break;
  66.         case 'list':
  67.             redis_client.smembers('channels', function(err, status) {
  68.                 client.send(JSON.stringify({
  69.                     ev: 'list',
  70.                     channels: status
  71.                 }));
  72.             });
  73.             break;
  74.         case 'msg':
  75.             if(channel == null)
  76.                 break;
  77.             redis_client.publish(channel, JSON.stringify({
  78.                 ev: 'msg',
  79.                 from: nick,
  80.                 time: Math.round(new Date().getTime() / 1000),
  81.                 msg: packet.msg
  82.             }));
  83.             break;
  84.         }
  85.     });
  86.     function doPart() {
  87.         if(channel != null) {
  88.             console.log(nick + " parted " + channel)
  89.             redis_client.decr('channels:' + channel);
  90.             redis_client.publish(channel, JSON.stringify({
  91.                 ev: 'part',
  92.                 from: nick,
  93.                 time: Math.round(new Date().getTime() / 1000)
  94.             }));
  95.         }
  96.         if(redis_subscriber != null) {
  97.             redis_subscriber.unsubscribe(channel);
  98.             redis_subscriber.close();
  99.             redis_subscriber = null;
  100.         }
  101.     }
  102.     client.on('disconnect', function() {
  103.         doPart();
  104.         redis_client.close();
  105.     });
  106. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement