Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chuck Michael's Solution #12

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# ----------------------------------------
# NPM
# ----------------------------------------
node_modules/*
npm-debug.log
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,8 @@
# project_superchat
Build a realtime multi-room chat application. Make it super.

Chuck Michael's (https://github.com/chuckinabox/) Solution

Instruct:
1. npm start (redis-server & node)
2. Enter a username and chat.
Binary file added dump.rdb
Binary file not shown.
139 changes: 139 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
const express = require('express');
const exhbs = require('express-handlebars');
const bodyParser = require('body-parser');
const socketIo = require('socket.io');
const redis = require('redis');
const http = require('http');
const cookieParser = require("cookie-parser");
var cookieSession = require('cookie-session');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

const chatRooms = require("./modules/chatRooms");

app.use(
"/socket.io",
express.static(__dirname + "node_modules/socket.io-client/dist/")
);
//Set Directory for public folder
app.use(express.static(__dirname + "/public"));

app.use(bodyParser.urlencoded({
extended: true
}));

// Set up cookies

app.use(cookieParser());
// ----------------------------------------
// Sessions/Cookies
// ----------------------------------------

app.use(cookieSession({
name: 'session',
keys: ['asdf1234567890qwer']
}));

// Set up handlebars
const exphbs = require("express-handlebars");
app.engine("handlebars", exphbs({
defaultLayout: "main",
partialsDir: 'views/'
}));
app.set("view engine", "handlebars");

app.get("/", (req,res) => {
const userCook = req.cookies['userName'];
if (userCook === '' || userCook === undefined) {
res.render("login");
}
else {
res.redirect(`/${userCook}/rooms`)
}
})

app.get("/logout", (req,res) => {
res.cookie('userName', "");
res.redirect("/");
})

app.get("/:user/rooms", (req, res) => {
const user = req.params.user;
res.cookie('userName', user);
Promise.resolve(
chatRooms.getRooms()
).then ( (values)=> {
let roomNames = values
res.render("rooms", {roomNames, user});
})

});

app.get("/:user/rooms/:roomName", (req, res) => {
const user = req.params.user;
const roomName = req.params.roomName
Promise.all([
chatRooms.getRoomMessages(roomName),
chatRooms.getRoomAuthors(roomName)
]).then ( (values)=> {
let roomMessages = values[0]
let roomAuthors = values[1]
res.render("chatRoom", {roomMessages, roomAuthors, roomName, user});
})

});



app.post("/newUser", (req,res)=>{
const user = req.body.UserName;
if (user === "") {
res.redirect('back');
}
else {
chatRooms.setUser(user);
res.redirect(`/${user}/rooms`);
}
})

app.post("/:user/rooms/newRoom", (req,res) => {
// const user = req.params.user;
// const newRoom = req.body.textNewRoom;
// Promise.resolve(
// chatRooms.setRoom(newRoom)
// ).then( ()=> {
// res.redirect("back");
// })
res.redirect("back");
});

app.post("/:user/rooms/:roomName/newMessage", (req,res) => {
// const roomName = req.params.roomName;
// const user = req.params.user;
// const message = req.body.textNewMessage;
// chatRooms.setRoomMessage(message, roomName);
// chatRooms.setRoomAuthor(user, roomName);
res.redirect("back");
})



io.on('connection', function(socket){
console.log('a user connected');
socket.on('disconnect', function(){
console.log('user disconnected');
});
socket.on('newMessageSubmit', function(data) {
chatRooms.setRoomMessage(data.newEnteredMessage, "Cats");
chatRooms.setRoomAuthor(data.newEnteredUser, "Cats");
io.emit('newMessage', {data})
})
socket.on('newRoomSubmit', function(data) {
chatRooms.setRoom(data.newEnteredRoom);
io.emit('newRoom', {data})
})
})

server.listen(process.env.PORT || 3000);
89 changes: 89 additions & 0 deletions modules/chatRooms.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
const redisClient = require("redis").createClient();

var redisClientObject = {
setUser: function(name) {
redisClient.LPUSH("users", name);
},

getUsers: function() {
return new Promise ((resolve, reject) => {
redisClient.LRANGE("users", 0, -1, function(err,res) {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
})
},

setRoom: function(name) {
redisClient.LPUSH("rooms", name);
},

getRooms: function() {
return new Promise ((resolve, reject) => {
redisClient.LRANGE("rooms", 0, -1, function(err,res) {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
})
},

getRoomsMessageLength: function() {
return new Promise ((resolve, reject) => {
redisClient.LRANGE("rooms", 0, -1, function(err,res) {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
})
},

setRoomMessage: function(msg, roomName) {
redisClient.LPUSH( ("roomMessages" + roomName) , msg);
},

getRoomMessages: function(roomName) {
return new Promise ((resolve, reject) => {
redisClient.LRANGE( ("roomMessages" + roomName), 0, -1, function(err,res) {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
})
},

setRoomAuthor: function(name, roomName) {
redisClient.LPUSH( ("roomAuthors" + roomName) , name);
},

getRoomAuthors: function(roomName) {
return new Promise ((resolve, reject) => {
redisClient.LRANGE( ("roomAuthors" + roomName), 0, -1, function(err,res) {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
})
}



}

module.exports = redisClientObject;
Loading