Gautam Anand
I expertise in building/scaling web backends, experienced in data engineering & IoT apps and code/audit smart contracts
Presented for NEAN-Meetup #2
Created by Gautam Anand
"Looking for Speakers for the community, Buzz - me@gautamanand.in"
http://socket.io/docs/#using-with-the-express-framework
$ npm install socket-io
$ npm install generator-node
$ yo node
$ express -e App_name
$ git clone https://github.com/angular/angular-seed.git
$ cd angular-seed
{
"name": "NEANRealtimeChat",
"version": "0.0.1",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"express": "~3.5.0",
"gravatar": "~1.0.6",
"socket.io": "~0.9.16",
"ejs": "~0.8.5"
}
}
$npm install
# Go to the local directory and update the npm. All are stored in node_modules
var express = require('express'),
app = express();
var port = process.env.PORT || 8080;
var io = require('socket.io').listen(app.listen(port));
require('./config')(app, io);
require('./routes')(app, io);
console.log('Check the app at Port :' + port);
var express = require('express');
module.exports = function(app, io){
app.set('view engine', 'html');
app.engine('html', require('ejs').renderFile);
app.set('views', __dirname + '/views');
app.use(express.static(__dirname + '/public'));
io.set('log level', 1);
};
var gravatar = require('gravatar');
module.exports = function(app,io){
// The code comes here that is discussed in next few slides
};
app.get('/', function(req, res){
res.render('home');
});
app.get('/create', function(req,res){
var id = Math.round((Math.random() * 1000000));
res.redirect('/chat/'+id);
});
app.get('/chat/:id', function(req,res){
res.render('chat');
});
var chat = io.of('/socket').on('connection', function (socket) {
//All the socket.IO config comes here
});
socket.on('load',function(data){
if(chat.clients(data).length === 0 ) {
socket.emit('peopleinchat', {number: 0});
}
else if(chat.clients(data).length === 1) {
socket.emit('peopleinchat', {
number: 1,
user: chat.clients(data)[0].username,
avatar: chat.clients(data)[0].avatar,
id: data
});
}
else if(chat.clients(data).length >= 2) {
chat.emit('tooMany', {boolean: true});
}
});
socket.on('login', function(data) {
if(chat.clients(data.id).length < 2){
socket.username = data.user;
socket.room = data.id;
socket.avatar = gravatar.url(data.avatar, {s: '140', r: 'x', d: 'mm'});
socket.emit('img', socket.avatar);
socket.join(data.id);
if(chat.clients(data.id).length == 2) {
var usernames = [],
avatars = [];
usernames.push(chat.clients(data.id)[0].username);
usernames.push(chat.clients(data.id)[1].username);
avatars.push(chat.clients(data.id)[0].avatar);
avatars.push(chat.clients(data.id)[1].avatar);
chat.in(data.id).emit('startChat', {
boolean: true,
id: data.id,
users: usernames,
avatars: avatars
});
}
}
else {
socket.emit('tooMany', {boolean: true});
}
});
socket.on('disconnect', function() {
socket.broadcast.to(this.room).emit('leave', {
boolean: true,
room: this.room,
user: this.username,
avatar: this.avatar
});
socket.leave(socket.room);
});
socket.on('msg', function(data){
socket.broadcast.to(socket.room).emit('receive', {msg: data.msg, user: data.user, img: data.img});
});
socket.on('peopleinchat', function(data){
if(data.number === 0){
showMessage("connected");
loginForm.on('submit', function(e){
e.preventDefault();
name = $.trim(yourName.val());
if(name.length < 1){
alert("Please enter a nick name longer than 1 character!");
return;
}
email = yourEmail.val();
if(!isValid(email)) {
alert("Please enter a valid email!");
}
else {
showMessage("inviteSomebody");
// call the server-side function 'login' and send user's parameters
socket.emit('login', {user: name, avatar: email, id: id});
}
});
}
else if(data.number === 1) {
showMessage("personinchat",data);
loginForm.on('submit', function(e){
e.preventDefault();
name = $.trim(hisName.val());
if(name.length < 1){
alert("Please enter a nick name longer than 1 character!");
return;
}
if(name == data.user){
alert("There already is a \"" + name + "\" in this room!");
return;
}
email = hisEmail.val();
if(!isValid(email)){
alert("Wrong e-mail format!");
}
else{
socket.emit('login', {user: name, avatar: email, id: id});
}
});
}
else {
showMessage("tooManyPeople");
}
});
socket.on('tooMany', function(data){
if(data.boolean && name.length === 0) {
showMessage('tooManyPeople');
}
});
function createChatMessage(msg,user,imgg,now){
var who = '';
if(user===name) {
who = 'me';
}
else {
who = 'you';
}
chats.append(li);
messageTimeSent = $(".timesent");
messageTimeSent.last().text(now.fromNow());
}
function showMessage(status,data){
if(status === "connected"){
}
else if(status === "inviteSomebody"){
}
else if(status === "personinchat"){
}
else if(status === "youStartedChatWithNoMessages") {
});
}
else if(status === "heStartedChatWithNoMessages") {
});
}
else if(status === "chatStarted"){
}
else if(status === "somebodyLeft"){
}
else if(status === "tooManyPeople") {
}
}
By Gautam Anand
Singapore Node.js Community Meetup#2
I expertise in building/scaling web backends, experienced in data engineering & IoT apps and code/audit smart contracts