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

Finished Assignment: Project SuperChat #9

Open
wants to merge 38 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
3483054
Update README.md
KaraThrash Jul 26, 2017
ae76b7f
first commit
KaraThrash Jul 26, 2017
1abb2dc
planning
KaraThrash Jul 26, 2017
0ed6ba7
nom
KaraThrash Jul 26, 2017
6faf674
started added functionality
Alex-Willenbrink Jul 26, 2017
1d3fd29
ignore me
KaraThrash Jul 26, 2017
bd06ca2
post from login works
KaraThrash Jul 26, 2017
164ba05
trying username stuff
Alex-Willenbrink Jul 26, 2017
363f352
fun with sockets
KaraThrash Jul 26, 2017
c50999b
working with sockets
Alex-Willenbrink Jul 26, 2017
8a918df
chat submitworks
KaraThrash Jul 26, 2017
5404fbc
socket is up to date
Alex-Willenbrink Jul 26, 2017
20cf722
Merge branch 'master' of https://github.com/Alex-Willenbrink/project_…
KaraThrash Jul 26, 2017
0a06459
chat log works
KaraThrash Jul 26, 2017
8367f04
added messages to redis
Alex-Willenbrink Jul 26, 2017
59abea3
LRANGE 0 -1 for redis
KaraThrash Jul 26, 2017
f7498f7
get messages
Alex-Willenbrink Jul 26, 2017
f2c9bf4
what broke
KaraThrash Jul 26, 2017
084e89d
Merge branch 'master' of https://github.com/Alex-Willenbrink/project_…
KaraThrash Jul 26, 2017
5f8969e
loads last 10 on login
KaraThrash Jul 26, 2017
fbf1622
new message populate to top
KaraThrash Jul 26, 2017
3dc22db
updated database
Alex-Willenbrink Jul 27, 2017
ac5d9fe
Merge branch 'master' of https://github.com/Alex-Willenbrink/project_…
KaraThrash Jul 27, 2017
edc3bed
message memory updated
Alex-Willenbrink Jul 27, 2017
8eb03ca
conflicts
KaraThrash Jul 27, 2017
72e2d2c
unique login check
KaraThrash Jul 27, 2017
aa75a75
still working
Alex-Willenbrink Jul 27, 2017
bf773d7
working version (show for demonstration purposes)
Alex-Willenbrink Jul 27, 2017
d74df60
started messages
Alex-Willenbrink Jul 27, 2017
bb56606
borked
KaraThrash Jul 27, 2017
1bbafe9
Merge branch 'master' of https://github.com/Alex-Willenbrink/project_…
KaraThrash Jul 27, 2017
321da3a
should work
KaraThrash Jul 27, 2017
b5d6ca8
adding chatscreen
Alex-Willenbrink Jul 27, 2017
5c07ef8
working on messages
KaraThrash Jul 27, 2017
3cd6836
working along
Alex-Willenbrink Jul 27, 2017
d8a800a
chatroom
KaraThrash Jul 27, 2017
d8fcf32
fjf
Alex-Willenbrink Jul 27, 2017
9ae4e4e
messages on sockets
Alex-Willenbrink 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
Dan Donato

# project_superchat
Build a realtime multi-room chat application. Make it super.
88 changes: 88 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const hbs = require("express-handlebars");
const server = require("http").createServer(app);
const io = require("socket.io")(server);
const cookieParser = require("cookie-parser");
const redisTools = require("./lib/redis_tools");

// const { getUserIds, getUsername } = require("./lib/get_user_info");
const { getUsernames } = require("./lib/get_user_info");
const { getRoomNames } = require("./lib/room_info");
const { generateUserInfo, generateRoomInfo } = require("./lib/redis_tools");

app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.engine("handlebars", hbs({ defaultLayout: "main" }));
app.set("view engine", "handlebars");
app.use(express.static(`${__dirname}/public`));

app.use(
"/socket.io",
express.static(`${__dirname}/node_modules/socket.io-client/dist/`)
);

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

io.on("connection", client => {
// send all current chats to rooms
getRoomNames().then(roomNames => {
client.emit("updateRooms", roomNames);
});

client.on("newChatRoom", newChatRoom => {
io.emit("newChatRoomFromServer", newChatRoom);
console.log(`newchatRoom: ${newChatRoom}`);
generateRoomInfo(newChatRoom).then(() => {
console.log("worked");
});
});

client.on("newMessage", newMessage => {
io.emit("newMessageFromServer", newMessage);
});
});

app.get("/", (req, res) => {
console.log(req.cookies);
req.cookies.username ? res.redirect("/chatrooms") : res.render("loginScreen");
});

app.post("/", (req, res) => {
console.log(req.body.name);
res.cookie("username", req.body.name);

// Safety make sure we don't make 2 USER_IDS
getUsernames().then(usernames => {
console.log(usernames);
if (usernames.includes(req.body.name)) {
res.redirect("/");
} else {
generateUserInfo(req.body.name).then(() => {
res.redirect("/");
});
}
});
});

app.get("/chatrooms", (req, res) => {
res.render("chatLobby", { username: req.cookies.username });
});

app.get("/chatrooms/:chatroom", (req, res) => {
let chatRoom = req.params.chatroom;
console.log(req.params.chatroom);
if (!req.cookies.username) {
res.redirect("/");
} else {
res.render("chatScreen", {
roomName: chatRoom,
username: req.cookies.username
});
}
});

server.listen(3000, () => {
console.log("Serving gormet lobster!");
});
19 changes: 19 additions & 0 deletions lib/get_message_helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const redisClient = require("redis").createClient();

module.exports = {
getMessage: (messageId) => {
return new Promise((resolve, reject) => {
redisClient.hmget(messageId, (err, message) => {
(err) ? reject(err) : resolve(message);
})
})
},

getMessageIds: () => {
return new Promise((resolve, reject) => {
redisClient.lrange("MESSAGE_IDS", 0, -1, (err, messageIds) => {
(err) ? reject(err) : resolve(messageIds);
})
})
}
}
20 changes: 20 additions & 0 deletions lib/get_room_info_helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

const redisClient = require("redis").createClient();

module.exports = {
getRoomName: (roomId) => {
return new Promise((resolve, reject) => {
redisClient.get(roomId, (err, username) => {
(err) ? reject(err) : resolve(username);
})
})
},

getRoomIds: () => {
return new Promise((resolve, reject) => {
redisClient.lrange("ROOM_IDS", 0, -1, (err, roomIds) => {
(err) ? reject(err) : resolve(roomIds);
})
})
}
}
32 changes: 32 additions & 0 deletions lib/get_user_info.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
const redisClient = require("redis").createClient();
const { getUsername, getUserIds } = require("./get_user_info_helpers");

module.exports = {
storeUserId: userId => {
return new Promise((resolve, reject) => {
redisClient.lpush("USER_IDS", userId, (err, reply) => {
err ? reject(err) : resolve(userId);
});
});
},

storeUsername: (userId, username) => {
return new Promise((resolve, reject) => {
console.log(userId);
console.log(username);
redisClient.set(userId, username, (err, reply) => {
err ? reject(err) : resolve();
});
});
},

getUsernames: () => {
return getUserIds().then(userIds => {
return Promise.all(
userIds.map(userId => {
return getUsername(userId);
})
);
});
}
};
20 changes: 20 additions & 0 deletions lib/get_user_info_helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const redisClient = require("redis").createClient();

module.exports = {
getUsername: (userId) => {
return new Promise((resolve, reject) => {
redisClient.get(userId, (err, username) => {
// console.log(username);
(err) ? reject(err) : resolve(username);
})
})
},

getUserIds: () => {
return new Promise((resolve, reject) => {
redisClient.lrange("USER_IDS", 0, -1, (err, userIds) => {
(err) ? reject(err) : resolve(userIds);
})
})
}
}
5 changes: 5 additions & 0 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const redisTools = require("./redis_tools");

module.exports = {
redisTools
}
34 changes: 34 additions & 0 deletions lib/redis_messages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const redisClient = require("redis").createClient();
const { getMessageIds, getMessage } = require("./get_message_helpers");

module.exports = {
storeMessageId: (messageId) => {
return new Promise((resolve, reject) => {
redisClient.lpush("MESSAGE",messageId,
(error,data) => {if(error) throw error; resolve();});
})
},

storeMessage: (messageId, message, username, roomName) => {
return new Promise((resolve, reject) => {
redisClient.hmset(messageId, {
message: message,
username: username,
roomName: roomName
}, (error,data) => {
if(error) throw error;
resolve();
})
})
},

getMessages: () => {
return getMessageIds.then(messageIds => {
return Promise.all(
messagesIds.map(messageId => {
return getMessage(messageId);
})
)
})
}
}
27 changes: 27 additions & 0 deletions lib/redis_tools.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const usernameHelpers = require("./get_user_info");
const chatroomHelpers = require("./room_info");
const messageHelpers = require("./redis_messages");
const shortid = require("shortid");

module.exports = {
generateUserInfo: username => {
const userId = shortid.generate();
return usernameHelpers
.storeUserId(userId)
.then(userId => usernameHelpers.storeUsername(userId, username));
},

generateRoomInfo: roomName => {
const roomId = shortid.generate();
return chatroomHelpers
.storeRoomId(roomId)
.then(roomId => chatroomHelpers.storeRoomName(roomId, roomName));
},

generateMessageInfo: (message, username, roomName) => {
const messageId = shortid.generate()
return messageHelpers
.storeMessageId(messageId)
.then(messageId => messageHelpers.storeMessage(messageId, message, username, roomName));
}
};
32 changes: 32 additions & 0 deletions lib/room_info.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
const redisClient = require("redis").createClient();
const { getRoomName, getRoomIds } = require("./get_room_info_helpers");

module.exports = {
storeRoomId: (roomId) => {
return new Promise((resolve, reject) => {
redisClient.lpush("ROOM_IDS", roomId, (err, reply) => {
(err)
? reject(err)
: resolve(roomId);
})
})
},

storeRoomName: (roomId, roomName) => {
return new Promise((resolve, reject) => {
redisClient.set(roomId, roomName, (err, reply) => {
(err)
? reject(err)
: resolve();
});
})
},

getRoomNames: () => {
return (getRoomIds().then((roomIds) => {
return Promise.all(roomIds.map((roomId) => {
return getRoomName(roomId);
}))
}))
}
}
27 changes: 27 additions & 0 deletions npm-debug.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
0 info it worked if it ends with ok
1 verbose cli [ '/home/alex/.nvm/versions/node/v6.0.0/bin/node',
1 verbose cli '/home/alex/.nvm/versions/node/v6.0.0/bin/npm',
1 verbose cli 'run',
1 verbose cli 'init' ]
2 info using [email protected]
3 info using [email protected]
4 verbose stack Error: missing script: init
4 verbose stack at run (/home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/lib/run-script.js:147:19)
4 verbose stack at /home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/lib/run-script.js:57:5
4 verbose stack at /home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/node_modules/read-package-json/read-json.js:345:5
4 verbose stack at checkBinReferences_ (/home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/node_modules/read-package-json/read-json.js:309:45)
4 verbose stack at final (/home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/node_modules/read-package-json/read-json.js:343:3)
4 verbose stack at then (/home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/node_modules/read-package-json/read-json.js:113:5)
4 verbose stack at /home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/node_modules/read-package-json/read-json.js:300:12
4 verbose stack at /home/alex/.nvm/versions/node/v6.0.0/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:78:16
4 verbose stack at tryToString (fs.js:449:3)
4 verbose stack at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:436:12)
5 verbose cwd /home/alex/vcs/assignments_course/project_superchat
6 error Linux 4.10.0-27-generic
7 error argv "/home/alex/.nvm/versions/node/v6.0.0/bin/node" "/home/alex/.nvm/versions/node/v6.0.0/bin/npm" "run" "init"
8 error node v6.0.0
9 error npm v3.8.6
10 error missing script: init
11 error If you need help, you may report this error at:
11 error <https://github.com/npm/npm/issues>
12 verbose exit [ 1, true ]
29 changes: 29 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "project_superchat",
"version": "1.0.0",
"description": "Dan Donato",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon index.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Alex-Willenbrink/project_superchat.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/Alex-Willenbrink/project_superchat/issues"
},
"homepage": "https://github.com/Alex-Willenbrink/project_superchat#readme",
"dependencies": {
"body-parser": "^1.17.2",
"cookie-parser": "^1.4.3",
"express": "^4.15.3",
"express-handlebars": "^3.0.0",
"redis": "^2.7.1",
"shortid": "^2.2.8",
"socket.io": "^2.0.3"
}
}
20 changes: 20 additions & 0 deletions plan.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Login screen:
message [rm# user: text]
counter when 10
///later on save: move all the messages to external file

message list push pop
[] of last n messages


ChatRoom:
{message: {user:
text: }}
Display previous n messages
display username next to messages

redisserver.
rediserver.users if user exists append x
redisserver.rooms.messages[room:msg1,msg2]
>>>save user with cookie
jack: im the all thin::::::::king all seeing
25 changes: 25 additions & 0 deletions public/js/chat_room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const socket = io.connect("http://localhost:3000");

// $(".roomName").text();
// $(".storedName").text();
socket.on("newMessageFromServer", newChatMessage => {
let chatMessage = createNewMessage(newChatMessage);
$("#PostedMessages").prepend($(`${chatMessage}`));
});

function createNewMessage(passedMessage) {
console.log(passedMessage);
return `
<h3>Author: ${passedMessage.username} </h3>
<p><strong>Message:</strong> ${passedMessage.message} </p>
`;
}

$("#submitPost").on("click", e => {
console.log("fjfjf");
e.preventDefault();
socket.emit("newMessage", {
username: $(".storedName").text(),
message: $(".message").val()
});
});
Loading