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

Avonyel's Solution' #16

Open
wants to merge 34 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
30a77f4
started setting up redis wrapper
svbarker Jul 26, 2017
467126c
working on redis wrapper
gregfilipczak Jul 26, 2017
f51f73c
can load messages! :D
svbarker Jul 26, 2017
6dd1627
saving things
svbarker Jul 26, 2017
68c3374
working on sockets
gregfilipczak Jul 26, 2017
eafbfe0
fixing merge conflicts
svbarker Jul 26, 2017
9e7c22a
still working with sockets
svbarker Jul 26, 2017
120668d
tomato
gregfilipczak Jul 26, 2017
9bd564e
working sockets!
svbarker Jul 26, 2017
aace93f
finished log out
gregfilipczak Jul 26, 2017
b1e00eb
working on multiple chat rooms
svbarker Jul 26, 2017
5e6f3e7
added room
gregfilipczak Jul 26, 2017
10db5fb
working on displaying rooms
svbarker Jul 26, 2017
e927c19
working! with bugs :(
gregfilipczak Jul 26, 2017
773ce1e
fixed weird message appending issue
svbarker Jul 26, 2017
7fe8c2c
working on partials
gregfilipczak Jul 27, 2017
b04c100
moved ugly jquery stuff to handlebars template
svbarker Jul 27, 2017
14c012f
styling :(
gregfilipczak Jul 27, 2017
f17249e
styling :)
svbarker Jul 27, 2017
836a874
bugs
gregfilipczak Jul 27, 2017
c90ebd1
tweaked views
svbarker Jul 27, 2017
f45b35e
styling :(
gregfilipczak Jul 27, 2017
f5b414a
labels and starting to attempt to let users save rooms
svbarker Jul 27, 2017
75b786d
working on delete
gregfilipczak Jul 27, 2017
86e88f8
working on making room leaving work
svbarker Jul 27, 2017
840b013
arghh
svbarker Jul 27, 2017
1d51edc
everthing is wrecked
gregfilipczak Jul 27, 2017
3271fe7
screw up
gregfilipczak Jul 27, 2017
b950833
fuck
svbarker Jul 27, 2017
14ec30d
Merge branch 'master' of https://github.com/gregfilipczak/project_sup…
svbarker Jul 27, 2017
f5411f1
unbroke things
svbarker Jul 27, 2017
a805d66
fix X's to leave rooms disappearing
svbarker Jul 27, 2017
1bd7a2e
fixed some styling stuff
svbarker Jul 27, 2017
66759d2
fixed leaveRoom handler attaching to new rooms
svbarker Jul 27, 2017
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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules/
data-structure.txt
89 changes: 89 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
const http = require("http");
const express = require("express");
const app = express();
const hbs = require("express-handlebars");
const bodyParser = require("body-parser");
const redis = require("./lib/redisWrapper.js");
const cookieParser = require("cookie-parser");
const server = http.createServer(app);
const io = require("socket.io")(server);
const cookie = require("cookie");
app.engine("handlebars", hbs({ defaultLayout: "main" }));
app.set("view engine", "handlebars");

app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(
"/socket.io",
express.static(__dirname + "/node_modules/socket.io-client/dist/")
);

app.use("/", express.static(__dirname + "/public"));
app.use(
"/handlebars",
express.static(__dirname + "/node_modules/handlebars/dist/")
);

app.get("/", (req, res) => {
if (!req.cookies.user) {
res.render("login");
} else {
console.log(req.cookies.user);
redis.getRooms(req.cookies.user).then(rooms => {
console.log(rooms);
res.render("index", {
rooms: rooms,
user: req.cookies.user
});
});
}
});

app.post("/", (req, res) => {
let user = req.body.user;
redis.saveUser(user);
res.cookie("user", user, { httpOnly: false });

res.redirect("/");
});

app.post("/logout", (req, res) => {
res.clearCookie("user");
res.redirect("/");
});

io.on("connection", client => {
let cookies = client.handshake.headers.cookie;
let user = cookie.parse(cookies).user;
console.log("New connection");

client.on("newMessage", data => {
redis.saveMessage(data.body, data.author, data.room).then(() => {
io.emit("updateMessages", data);
});
});

client.on("newRoom", data => {
redis.saveRoom(user, data).then(() => {
client.emit("updateRooms", data);
});
});

client.on("showRoom", data => {
redis.loadRoomMessages(data, messages => {
let output = {
messages: messages,
room: data
};
client.emit("roomLoaded", output);
});
});

client.on("leaveRoom", room => {
redis.leaveRoom(user, room).then(() => {
client.emit("leftRoom", room);
});
});
});

server.listen(3000);
74 changes: 74 additions & 0 deletions lib/redisWrapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
const redisClient = require("redis").createClient();
const shortid = require("shortid");

var wrapperStuff = {
saveMessage: (body, author, room) => {
return new Promise((resolve, reject) => {
var messageID = "message-" + shortid.generate();
redisClient.lpush([room, messageID]);
redisClient.hmset(messageID, [
"body",
body,
"author",
author,
"room",
room
]);
resolve(true);
});
},

loadRoomMessages: (roomName, callback) => {
redisClient.lrange(roomName, 0, -1, (err, messages) => {
messages = messages.map(message => {
let p = new Promise((resolve, reject) => {
redisClient.hgetall(message, (err, obj) => {
let newObj = {
body: obj.body,
author: obj.author,
room: obj.room
};

resolve(newObj);
});
});
return p;
});

Promise.all(messages).then(resolvedMessages => {
callback(resolvedMessages);
});
});
},

saveUser: user => {
redisClient.hsetnx("users", user, user);
redisClient.hsetnx(`user-${user}`, "main-room", "main-room");
},

saveRoom: (user, roomName) => {
return new Promise((resolve, reject) => {
redisClient.lpush(["rooms", roomName]);
redisClient.hsetnx(`user-${user}`, roomName, roomName);
resolve();
});
},

leaveRoom: (user, roomName) => {
return new Promise((resolve, reject) => {
redisClient.hdel(`user-${user}`, roomName);
resolve();
});
},

getRooms: user => {
return new Promise((resolve, reject) => {
redisClient.hgetall(`user-${user}`, (err, rooms) => {
console.log(rooms);
resolve(rooms);
});
});
}
};

module.exports = wrapperStuff;
31 changes: 31 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "project_superchat",
"version": "1.0.0",
"description": "Super Simple Chat Client",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Avonyel/project_superchat.git"
},
"author": "Stephanie and Greg",
"license": "ISC",
"bugs": {
"url": "https://github.com/Avonyel/project_superchat/issues"
},
"homepage": "https://github.com/Avonyel/project_superchat#readme",
"dependencies": {
"body-parser": "^1.17.2",
"cookie": "^0.3.1",
"cookie-parser": "^1.4.3",
"express": "^4.15.3",
"express-handlebars": "^3.0.0",
"handlebars": "^4.0.10",
"redis": "^2.7.1",
"shortid": "^2.2.8",
"socket.io": "^2.0.3",
"socket.io-client": "^2.0.3"
}
}
102 changes: 102 additions & 0 deletions public/javascripts/message_form_compiled.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
(function() {
var template = Handlebars.template,
templates = (Handlebars.templates = Handlebars.templates || {});
templates["message_form_compiled.js"] = template({
compiler: [7, ">= 4.0.0"],
main: function(container, depth0, helpers, partials, data) {
return "";
},
useData: true
});
templates["message_form"] = template({
"1": function(container, depth0, helpers, partials, data, blockParams) {
var stack1,
alias1 = container.lambda,
alias2 = container.escapeExpression;

return (
' <div class="message row">\r\n <div class="col-xs-12">\r\n <p>\r\n <span class="author">' +
alias2(
alias1(
(stack1 = blockParams[0][0]) != null ? stack1.author : stack1,
depth0
)
) +
": </span>\r\n " +
alias2(
alias1(
(stack1 = blockParams[0][0]) != null ? stack1.body : stack1,
depth0
)
) +
"\r\n </p>\r\n </div>\r\n </div>\r\n"
);
},
compiler: [7, ">= 4.0.0"],
main: function(container, depth0, helpers, partials, data, blockParams) {
var stack1,
helper,
alias1 = depth0 != null ? depth0 : container.nullContext || {},
alias2 = helpers.helperMissing,
alias3 = "function",
alias4 = container.escapeExpression;

return (
'<div class="form form-group">\r\n <form class="messageForm" id="' +
alias4(
(
(helper =
(helper =
helpers.room || (depth0 != null ? depth0.room : depth0)) != null
? helper
: alias2),
typeof helper === alias3
? helper.call(alias1, {
name: "room",
hash: {},
data: data,
blockParams: blockParams
})
: helper
)
) +
'">\r\n <div class="form-group">\r\n <input type="text" name="message" class="form-control"/>\r\n </div>\r\n <button class="btn btn-default">Send Message</button>\r\n </form>\r\n</div>\r\n\r\n<div id="messages' +
alias4(
(
(helper =
(helper =
helpers.room || (depth0 != null ? depth0.room : depth0)) != null
? helper
: alias2),
typeof helper === alias3
? helper.call(alias1, {
name: "room",
hash: {},
data: data,
blockParams: blockParams
})
: helper
)
) +
'" class="container scrolling">\r\n' +
((stack1 = helpers.each.call(
alias1,
depth0 != null ? depth0.messages : depth0,
{
name: "each",
hash: {},
fn: container.program(1, data, 1, blockParams),
inverse: container.noop,
data: data,
blockParams: blockParams
}
)) != null
? stack1
: "") +
"</div>\r\n"
);
},
useData: true,
useBlockParams: true
});
})();
88 changes: 88 additions & 0 deletions public/javascripts/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
var socket = io.connect("http://localhost:3000");

let formHandler = function() {
$(".messageForm").on("submit", e => {
e.preventDefault();
var data = {};
data.body = $("input[name='message']").val();
$("input").val("");
data.author = document.cookie.replace(
/(?:(?:^|.*;\s*)user\s*\=\s*([^;]*).*$)|^.*$/,
"$1"
);
data.author = data.author.replace("%20", " ");
data.room = $(".messageForm").attr("id");
socket.emit("newMessage", data);
});
};

let onLeaveRoom = function() {
$(".leaveRoom").on("click", function(e) {
e.stopPropagation();
let roomName = $(this).parent().parent().attr("id");
socket.emit("leaveRoom", roomName);
});
};

$(document).ready(function() {
// Emit events

$("#create-room").on("submit", e => {
e.preventDefault();
let data = $("#create-room-form").val();
$("#create-room-form").val("");
socket.emit("newRoom", data);
});

$("#rooms").on("click", ".room", e => {
let $target = $(e.target);
let roomName = $target.parent().attr("id");
socket.emit("showRoom", roomName);
});

// Listen for events

socket.on("updateMessages", data => {
$(`#messages${data.room}`).prepend(
$(`<div class='message row'>
<div class='col-xs-12'>
<p><span class="author">${data.author}: </span>${data.body}</p>
</div>
</div>`)
);
if ($(`#messages${data.room}`).length === 0) {
$(`#newMessage${data.room}`).text("new");
}
});

socket.on("updateRooms", data => {
$("#rooms").prepend(
$(`<div class='room' id="${data}">
<h3>
<span class="leaveRoom">X</span>
${data}
<span id="newMessage${data}" class="label label-danger"></span>
</h3>
</div>`)
);

onLeaveRoom();
});

socket.on("roomLoaded", output => {
let messageFormHBS = Handlebars.templates["message_form"](output);
$(".active").removeClass("active");
$(`div#${output.room}`).addClass("active");
$messages = $("#messageContainer");
$messages.empty().append(messageFormHBS).addClass("panel-body");
$messages.parent().addClass("panel panel-default");
$(`#${output.room} span.label`).text("");
formHandler();
});

socket.on("leftRoom", room => {
$(`#${room}`).remove();
});

onLeaveRoom();
});
3 changes: 3 additions & 0 deletions public/socket.io.js

Large diffs are not rendered by default.

Loading