Demo : http://goo.gl/6kvuf
Down : http://www.mediafire.com/?yst7xorshdrjx8g

Kullanılan kütüphaneler socket.io , jade , express
clientside kütüphaneler jquery + colorpicker

Db gerektirmez

app.js dosyası :

var express = require('express');
var crypto = require('crypto');
var app = module.exports = express.createServer();

// <Ayar>
var adminler = {"admin":"admin","r10":"r10"};
var rooms = ["Genel","Facebook","Aşk","Felsefe","Üniversiteliler","15+","25+","40+","Spor","Gündem","Islam","Programlama","Counter-Strike","Private"];
var ozelodalar = {"Private":{}};
var onlinesayisi=0; 
var privatepassword="~|~";
var banlilar={};
var renktest = /^(#)?([0-9a-fA-F]{3})([0-9a-fA-F]{3})?$/;
//var iptest = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;
var gizlikey="1jb3h65787n6mnsdjaknm2k1n4";
var nicktest=/[^a-z-0-9çışğüö_\-\:]/gi;
var kullanilacak_port = process.env.PORT || 8080;
//var kullanilacak_port = 8080;
// </Ayar>

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.set('view options', { pretty: true });
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});


app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});


function explode(delimiter,string,limit){if(arguments.length<2||typeof delimiter=='undefined'||typeof string=='undefined')return null;if(delimiter===''||delimiter===false||delimiter===null)return false;if(typeof delimiter=='function'||typeof delimiter=='object'||typeof string=='function'||typeof string=='object'){return{0:''};}if(delimiter===true)delimiter='1';delimiter+='';string+='';var s=string.split(delimiter);if(typeof limit==='undefined')return s;if(limit===0)limit=1;if(limit>0){if(limit>=s.length)return s;return s.slice(0,limit-1).concat([s.slice(limit-1).join(delimiter)]);}if(-limit>=s.length)return[];s.splice(s.length+limit);return s;}

function encrypt(text){
  var cipher = crypto.createCipher('aes-256-cbc',gizlikey)
  var crypted = cipher.update(text,'utf8','hex')
  crypted += cipher.final('hex');
  return crypted;
}

function decrypt(text){
  var decipher = crypto.createDecipher('aes-256-cbc',gizlikey)
  var dec = decipher.update(text,'hex','utf8')
  dec += decipher.final('utf8');
  return dec;
}

app.get('/', function(req, res){
  res.render('chat',  { layout:false,title: 'Hemen Arkadasliklar Edin',online:onlinesayisi,odalar:rooms})
});

app.listen(kullanilacak_port);

console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

// Socket bağlantısı kurulur
var io = require('socket.io').listen(app, { log: false });

// Kullanıcı Listesinin tutulacağı Object
var kullanicilar = {};
var kucuknickler = {};


io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10); 
});

// Bağlantı kurulduğunda çalışacak kısım
io.sockets.on('connection', function(socket){


  

    // Kullanıcı Ekleme Fonksiyonu
    socket.on("kullaniciEkle", function(kullaniciadi,oda){



    if((kullaniciadi.search(/[a-z]/i) === -1) || (kullaniciadi.length<3))  {

    kullaniciadi="nicksiz"+Math.floor(Math.random() * 9999999);

    }

        // Kullanıcı session'nda bilgileri saklıyoruz
		if(!rooms[oda]){oda=0;}
        girisyap = 1;
		//ipz=decrypt(ipz);
		ipz=socket.handshake.headers['x-forwarded-for'] || socket.handshake.address.address;
      if (ozelodalar[rooms[oda]]) {

        if (kullaniciadi.indexOf(privatepassword)>-1) {

          kullaniciadi=kullaniciadi.replace(privatepassword, "");
          girisyap=1;

        }else {
          socket.emit("uyari", "Bu odaya girmek için yetkiniz yok");
          girisyap=0;
          socket.emit("kopgit");
        }
      }


        if(adminler[kullaniciadi])
        {
          socket.emit("uyari", "Bu Nick Adminler Tarafindan Kullanılıyor.");
          girisyap=0;
		  socket.emit("kopgit");
        }
		
		/*
		if(!iptest.test(ipz))
        {
          socket.emit("uyari", "Çakalmısın olm sen?.");
          girisyap=0;
		  socket.emit("kopgit");
        }
		*/
		
        if(kullaniciadi.indexOf(':')>-1)
        {
          verikul=explode(':',kullaniciadi,2);
          kullaniciadi=verikul[0];
          sifre=verikul[1];
          if(adminler[kullaniciadi]!=sifre) 
          { 
           socket.emit("uyari", "Şifre Yanlış.");
           girisyap=0;
		   socket.emit("kopgit");
          } 
          else if(kullanicilar[kullaniciadi])
          { 
            socket.emit("uyari", "Admin zaten şuan giriş yapmış.");
            girisyap=0;
			socket.emit("kopgit");
          }

          else
          {
            girisyap=1;
          }
        }
		kullaniciadi = kullaniciadi.replace(nicktest, "");
        socket.kullaniciAdi = kullaniciadi;
        socket.userId = Object.keys(kullanicilar).length;
		socket.room=oda;
        
      if(banlilar[ipz])
      {
        socket.emit("uzaklas","");
        girisyap = 0;
      }

		if(!kucuknickler[kullaniciadi.toLowerCase()] && girisyap)
        {
		kucuknickler[kullaniciadi.toLowerCase()] = {nick:kullaniciadi.toLowerCase(),ip:encrypt(ipz)};
        // Array'e kullanıcı bilgilerini ekliyoruz
        kullanicilar[kullaniciadi] = {
            userName : kullaniciadi,
            userId : Object.keys(kullanicilar).length,
            room : oda,
            socketid : encrypt(socket.id)
        };
		
		//odaya sokuyoruz
		socket.join(oda);
		
        // Bağlanan kullanıcıya hoşgeldin mesajı yolluyoruz
        socket.emit("mesajGonder", "Sistem", rooms[oda] + " Kanalına Hoşgeldiniz.",'000000',0);

        // Bütün kullanıcılara yeni kullanıcı bağlandı mesajı yolluyoruz

        socket.broadcast.to(oda).emit("mesajGonder", "<font color='#006400'>Sistem</font>", kullaniciadi + " sohbete bağlandı. (y)",'000000',0);
        // Bağlı kullanıcılarda Kullanıcı listesini yeniliyoruz
        //io.sockets.emit("kullanicilariYenile", kullanicilar,Object.keys(kullanicilar).length);
		io.sockets.in(oda).emit("kullanicilariYenile", kullanicilar,io.sockets.clients(oda).length);
		onlinesayisi=Object.keys(kullanicilar).length;
        socket.emit("girisyap", "");
      }
      else
      {
        if(girisyap)
        {
        socket.emit("uyari", "Bu  Nick kullanılıyor lütfen başka nick seçin.");
		socket.emit("kopgit");
        }
      }
    });

    // Bağlantı kesildiği takdirde çalışacak fonksiyon.
    socket.on("disconnect", function(){
		try {
		if(socket.id==decrypt(kullanicilar[socket.kullaniciAdi]["socketid"]))
		{
    delete kullanicilar[socket.kullaniciAdi];
		delete kucuknickler[socket.kullaniciAdi.toLowerCase()];
		io.sockets.in(socket.room).emit("kullanicilariYenile", kullanicilar,io.sockets.clients(socket.room).length);
		onlinesayisi=Object.keys(kullanicilar).length;
		socket.leave(socket.room);
        if(socket.kullaniciAdi)
        {
        socket.broadcast.to(socket.room).emit("mesajGonder", "<font color='#b22222'>Sistem</font>", socket.kullaniciAdi + " sohbetten ayrıldı (n)",'000000',0);
        }
		}
		} catch(e){}
    });


    socket.on("mesajYolla", function(data,renk){
		if(!renktest.test(renk)){renk='000000';}
        if(data.length>400 || data.length <1)
        {
          socket.emit("uyari", "Mesaj 400 karakteri geçemez veya boş olamaz!");
        }
        else
        {
		//ozel mesaj
        if(data.indexOf(':')>-1)
        {
          veri=explode(':',data,2);
          if(kullanicilar[veri[0]])
          {
            kime=veri[0];
            mesaj=veri[1];
            io.sockets.socket(decrypt(kullanicilar[kime].socketid)).emit("mesajGonder",[socket.kullaniciAdi,kime],mesaj,renk,1,1);
			io.sockets.socket(socket.id).emit("mesajGonder",[socket.kullaniciAdi,kime],mesaj,renk,1,0);
          }


        else
        { 
		  if(adminler[socket.kullaniciAdi]) {
          io.sockets.in(socket.room).emit("mesajGonder", socket.kullaniciAdi, data,renk,0,1);
		  }
		  else
		  {
		  io.sockets.in(socket.room).emit("mesajGonder", socket.kullaniciAdi, data,renk,0,0);
		  }
        }

        }


        else if(data.indexOf('/kick ')=='0' && adminler[socket.kullaniciAdi])
          {
            kim=data.split('/kick ')[1];
            if(kullanicilar[kim] && !adminler[kim])
            {
           socket.broadcast.to(socket.room).emit("mesajGonder", "Sistem", kim + " uzaklaştırıldı (n)",'000000',0,0);
           io.sockets.socket(decrypt(kullanicilar[kim].socketid)).emit("uzaklas","");
           delete kullanicilar[kim];
		   delete kucuknickler[kim.toLowerCase()];
		   io.sockets.in(socket.room).emit("kullanicilariYenile", kullanicilar,io.sockets.clients(socket.room).length);
		   onlinesayisi=Object.keys(kullanicilar).length;
          }
		  else
		  {
		 io.sockets.socket(decrypt(kullanicilar[kim].socketid)).emit("mesajGonder",["Sistem",kim],socket.kullaniciAdi+" seni atmaya calisti ayik ol",renk,1,0);
		  }
		  
		  
        }
		
		     else if(data.indexOf('/adminkick ')=='0' && adminler[socket.kullaniciAdi])
          {
            kim=data.split('/adminkick ')[1];
            if(kullanicilar[kim] && kim!="root")
            {
           socket.broadcast.to(socket.room).emit("mesajGonder", "Sistem", kim + " uzaklaştırıldı (n)",'000000',0,0);
           io.sockets.socket(decrypt(kullanicilar[kim].socketid)).emit("uzaklas","");
           delete kullanicilar[kim];
		   delete kucuknickler[kim.toLowerCase()];
		   io.sockets.in(socket.room).emit("kullanicilariYenile", kullanicilar,io.sockets.clients(socket.room).length);
		   onlinesayisi=Object.keys(kullanicilar).length;
          }
        }
		
		

        else if(data.indexOf('/ban ')=='0' && adminler[socket.kullaniciAdi])
          {
            kim=data.split('/ban ')[1];
            if(kullanicilar[kim] && !adminler[kim])
            {
            banlilar[decrypt(kucuknickler[kim.toLowerCase()].ip)]={"ip" : decrypt(kucuknickler[kim.toLowerCase()].ip)};
           socket.emit("mesajGonder","Sistem", kim+" ipsi : "+decrypt(kucuknickler[kim.toLowerCase()].ip),'000000',0,0);
           socket.broadcast.to(socket.room).emit("mesajGonder", "Sistem", kim + " banlandı (n)",'000000',0,0);
           io.sockets.socket(decrypt(kullanicilar[kim].socketid)).emit("uzaklas","");
           delete kullanicilar[kim];
		   delete kucuknickler[kim.toLowerCase()];
           io.sockets.in(socket.room).emit("kullanicilariYenile", kullanicilar,io.sockets.clients(socket.room).length);
           onlinesayisi=Object.keys(kullanicilar).length;          
          }
        }
	
		 

          else if(data.indexOf('/unban ')=='0' && adminler[socket.kullaniciAdi])
          {
            kim=data.split('/unban ')[1];
            if(banlilar[kim])
            {
           delete banlilar[kim];
           socket.emit("mesajGonder","Sistem", kim+" ipsinin bani kalkti.",'000000',0,0);
          }
        }
        else	
        {
		if(adminler[socket.kullaniciAdi]) {
          io.sockets.in(socket.room).emit("mesajGonder", socket.kullaniciAdi, data,renk,0,1);
		  }
		  else
		  {
		  io.sockets.in(socket.room).emit("mesajGonder", socket.kullaniciAdi, data,renk,0,0);
		  }
        }
        }
    });
});