/* client.io module load; socket server start*/ var io = require('../root/node_modules/socket.io/').listen(8080,{ 'log level':2, 'transports':['xhr-polling','flashsocket','jsonp-polling'] }); var mysql = require('../root/node_modules/mysql/'); //Loading mysql module console.log(" Server has started!"); var mods = []; var blocked = []; var ids = []; var clients = []; var actions = { '/pvt': 1, '/block': 2, '/unblock': 3, '/restart': 4 }; var dbdata = { host:'localhost', port: 3320, user:'forum', password:'1sxgUSBnPxgVB1C', database:'forum' } /* server functions */ function trim( dataText ){ dataText = dataText.replace(/^\s+(.*?)\s+$/,'$1'); return dataText; } function rsort(array){ var length = (array.length-1); var array2 = []; for(i in array){ array2[length] = array[i]; length--; } return array2; } function addslashes(text){ return text.replace(/\\/g,"\\\\").replace(/'/g,"\\'"); } function getCookies(client){ var cookiesList = {}; var cookies = client.handshake.headers.cookie; if( cookies ) { cookies = JSON.stringify(cookies).split('; '); for(i in cookies){ var h = cookies[i].split('='); cookiesList[ h[0].trim() ] = h[1]; } } return cookiesList; } /* User connecting */ io.sockets.on('connection',function(client){ /* user trying to log in */ client.on("login", function(){ var connection = mysql.createConnection(dbdata); connection.connect(function(error){ if(error) console.log(' [MySQL Error] '+error); }); var cookies = getCookies(client); if( cookies['mybbuser'] && cookies['sid'] ){ var mybbuser; mybbuser = cookies['mybbuser'].split("_"); var uid = mybbuser[0];var key = mybbuser[1]; delete mybbuser; var sid = cookies['sid']; var banned = false; connection.query("SELECT * FROM mybb_banned WHERE uid='"+parseInt(uid)+"'", function(error,rows){ if(rows.length != 0){ client.emit('banned',rows.reason); banned = true; client.disconnect(); } }); if( banned == false ){ connection.query("SELECT s.sid,s.uid, u.uid,u.loginkey,u.username,u.username,u.usergroup,u.displaygroup, g.gid,g.namestyle,g.cancp,g.canwarnusers FROM mybb_sessions s, mybb_users u, mybb_usergroups g WHERE (s.uid=u.uid) AND ( (u.usergroup=g.gid AND u.displaygroup=0) OR u.displaygroup=g.gid) AND u.uid="+parseInt(uid), function(error,rows){ rows = rows[0]; if(rows.sid == sid && key == rows.loginkey){ var nick = rows.namestyle.replace("{username}",rows.username); clients[uid] = nick; ids[client.id] = uid; if ( rows.canwarnusers == 1 ){ mods[client.id] = uid } client.join('users_logged'); client.join('user_'+uid); client.to(client.id).emit('logged','true'); } else { client.disconnect(); } }); connection.query("SELECT shid AS shout_id, author AS nick, aid AS uid, toid AS to_uid, tonick AS to_user, message, time FROM mybb_sb WHERE toid=0 OR toid="+uid+" or (aid="+uid+" AND toid!=0) ORDER by shid DESC LIMIT 25", function(error,rows){ if(error){ console.log(' [MySQL Error] '+error); } else { rows = rsort(rows); for(i in rows){ data = rows[i]; data.time = parseInt(data.time); client.to(client.id).emit("message",data); } } }); } } else { client.disconnect(); } connection.end(function(error){ if(error) console.log(" [MySQL Error] "+error); }); }); /* when user sends a message */ client.on('message',function(message){ if( typeof(ids[client.id]) !== "undefined" && typeof(clients[ids[client.id]]) !== "undefined" ){ var socketToGroup = 'users_logged'; var d = new Date(); var uid = ids[client.id]; var data = { "nick":addslashes(clients[uid]), "uid":uid, "to_uid":0, "to_user":0, "time":d.getTime(), "message": false }; message = trim(message); var msg = message.split(' '); var isAction = ( typeof(actions[msg[0]]) == "undefined" ? false : true ); if( isAction == true ){ switch( actions[msg[0]] ){ case 1: if( typeof(clients[msg[1]]) !== "undefined"){ socketToGroup = parseInt(msg[1]); delete msg[0];delete msg[1]; data.to_uid = socketToGroup; data.to_user = clients[socketToGroup]; message = trim(msg.join(' ')); socketToGroup = "user_"+socketToGroup; } else { message = false; client.to("user_"+clients[client.id]).emit('user_not_logged'); } break; /* Moderators actions */ case 2: case 3: case 4: if( typeof(mods[client.id]) != "undefined" && mods[client.id] == ids[client.id] ){ switch(actions[msg[0]]){ case 2: blocked[parseInt(msg[1])] = true; break; case 3: delete blocked[parseInt(msg[1])]; break; case 4: client.removeAllListeners(); break; } } message = false; break; } } if( message !== false && message != '' && typeof(blocked[ids[client.id]]) == "undefined" ){ /* parse msg to entites */ message = message.replace(//g,'>'); message = message.replace(/(http:\/\/|https:\/\/|www\.)([^\s]+)/g,"$1$2"); data.message = message; message = addslashes(message); /* create class instance and connect to sql server */ var connection = mysql.createConnection(dbdata);connection.connect(); /* create syntax */ var to_user = (data.to_user != 0 ? addslashes(data.to_user) : data.to_user); var syntax = "INSERT INTO mybb_sb VALUES (NULL,'"+parseInt(data.uid)+"','"+data.nick+"','"+data.to_uid+"','"+to_user+"','"+message+"','"+data.time+"')"; /* perform a query */ connection.query(syntax, function(error,rows){ if(error){ console.log(" [MySQL Error] "+error+"\n "+syntax); } else { data.shout_id = rows.insertId; client.to(client.id).emit("message",data); // send data to sending user client.to(socketToGroup).broadcast.emit("message",data); // send data to specified user/logged users group } }); /* close sql connection */ connection.end(); } else if( typeof(blocked[ids[client.id]]) != "undefined" ) { console.log(" Klient zablokowany:"+ids[client.id]); } } }); client.on('disconnect',function(){ delete ids[client.id]; if( typeof(mods[client.id]) != "undefined"){ delete mods[client.id]; } }); });