Skip to content

Commit c14eb4a

Browse files
committed
Add ability to scrape og meta tags on first link in chat message and show them
1 parent 63dd2fe commit c14eb4a

File tree

9 files changed

+422
-20
lines changed

9 files changed

+422
-20
lines changed

server/package-lock.json

Lines changed: 321 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
"cors": "^2.8.5",
1717
"dotenv": "^8.2.0",
1818
"express": "^4.17.1",
19+
"open-graph-scraper": "^4.9.0",
1920
"peer": "^0.6.1",
2021
"socket.io": "^4.0.1",
21-
"uuid": "^8.3.2"
22+
"uuid": "^8.3.2",
23+
"validator": "^13.6.0"
2224
},
2325
"devDependencies": {
2426
"nodemon": "^2.0.7"

server/sockets/peerSocket.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ const peerSocketConnection = (server) => {
8585
socket.emit("messages-list", lastMessages);
8686
});
8787

88-
socket.on("send-message", (message) => {
89-
addMessage(roomID, message);
90-
io.to(roomID).emit("message-received", message);
88+
socket.on("send-message", async (message) => {
89+
const newMessage = await addMessage(roomID, message);
90+
io.to(roomID).emit("message-received", newMessage);
9191
});
9292

9393
socket.on("get-older-messages", offset => {

server/utils/messages.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const {v4: uuidV4} = require("uuid");
2+
const {isURL} = require("validator");
3+
const ogs = require("open-graph-scraper");
24

35
let messages = {};
46
// messages = {
@@ -13,8 +15,28 @@ const addMessageRoom = (id) => {
1315
};
1416

1517
const addMessage = (id, message) => {
16-
message.id = uuidV4() + message.createdAt;
17-
messages[id].messages.push(message);
18+
let messageArr = message.message.replace(/\n/g, " ").split(" ");
19+
let linksArray = messageArr.filter(msg => isURL(msg, {require_protocol: true}));
20+
21+
if(!linksArray.length) {
22+
message.id = uuidV4() + message.createdAt;
23+
messages[id].messages.push(message);
24+
return message;
25+
}
26+
27+
const options = {url: linksArray[0]};
28+
return ogs(options).then(data => {
29+
const {error, result} = data;
30+
message.id = uuidV4() + message.createdAt;
31+
messages[id].messages.push(message);
32+
message.ogMeta = {...result};
33+
return message;
34+
}).catch(err => {
35+
console.log(err);
36+
message.id = uuidV4() + message.createdAt;
37+
messages[id].messages.push(message);
38+
return message;
39+
});
1840
};
1941

2042
const getRoomMessages = (id) => {

streams-react/src/components/ChatMessages/ChatMessages.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,18 +67,22 @@ const ChatMessages = () => {
6767
let currentUser = messages[0];
6868
currentUser.message = [currentUser.message];
6969
currentUser.id = [currentUser.id];
70+
currentUser.ogMeta = [currentUser.ogMeta];
7071

7172
for(let i = 1; i < messages.length; i++) {
7273
if(!Array.isArray(currentUser.message)) currentUser.message = [currentUser.message];
7374
if(messages[i].streamID === currentUser.streamID) {
7475
currentUser.message = [...currentUser.message, messages[i].message];
7576
currentUser.id = [...currentUser.id, messages[i].id];
77+
currentUser.ogMeta = [...currentUser.ogMeta, messages[i].ogMeta];
78+
7679
}
7780
else {
7881
newMessages.push(currentUser);
7982
currentUser = messages[i];
8083
currentUser.message = [currentUser.message];
8184
currentUser.id = [currentUser.id];
85+
currentUser.ogMeta = [currentUser.ogMeta];
8286
}
8387
}
8488

streams-react/src/components/ChatUser/ChatUser.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const ChatUser = ({messageData}) => {
77

88
const renderMessage = () => {
99
return messageData.message.map((message, i) => {
10-
return <ChatUserMessage key={messageData.id[i]} message={message} />
10+
return <ChatUserMessage key={messageData.id[i]} message={message} ogMeta={messageData.ogMeta[i]} />
1111
});
1212
};
1313

streams-react/src/components/ChatUser/ChatUser.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
overflow: hidden;
1717
background-color: #212121;
1818
}
19-
.container img {
19+
.identicon img {
2020
height: 30px;
2121
}
2222
.message__header {

streams-react/src/components/ChatUserMessage/ChatUserMessage.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {useState, useEffect} from "react";
22
import isURL from "validator/lib/isURL";
33
import styles from "./ChatUserMessage.module.css";
44

5-
const ChatUserMessage = ({message}) => {
5+
const ChatUserMessage = ({message, ogMeta}) => {
66
const [hasURL, setHasURL] = useState(false);
77
const [srcURL, setSrcURL] = useState("");
88

@@ -53,7 +53,7 @@ const ChatUserMessage = ({message}) => {
5353

5454
return finalMessageArray.map((msg, i) => {
5555
if(typeof msg === "string") return <span key={i}>{msg}</span>
56-
return <a key={i} href={msg.link} className={styles.link} target="_blank" rel="noopener noreferrer" >{msg.link}</a>;
56+
return <a key={i} href={msg.link} className={styles.link} target="_blank" rel="noopener noreferrer">{msg.link}</a>;
5757
});
5858
};
5959

@@ -73,6 +73,18 @@ const ChatUserMessage = ({message}) => {
7373
></iframe>
7474
</div>
7575
}
76+
{!hasURL && ogMeta.success &&
77+
<div className={styles.ogCard__container}>
78+
<a href={ogMeta.requestUrl} className={styles.ogCard__link} target="_blank" rel="noopener noreferrer">
79+
<div className={styles.ogCard__image__container}>
80+
<img src={ogMeta.ogImage.url} alt={ogMeta.ogTitle} className={styles.ogCard__image} />
81+
</div>
82+
<div className={styles.ogCard__description__container}>
83+
<p className={styles.ogCard__description}>{ogMeta.ogTitle}</p>
84+
</div>
85+
</a>
86+
</div>
87+
}
7688
</div>
7789
);
7890
};

streams-react/src/components/ChatUserMessage/ChatUserMessage.module.css

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,55 @@
2626
}
2727
iframe {
2828
width: 100%;
29+
}
30+
.ogCard__container {
31+
white-space: pre-wrap;
32+
overflow-wrap: break-word;
33+
}
34+
.ogCard__link {
35+
display: flex;
36+
flex-direction: column;
37+
justify-content: center;
38+
align-items: center;
39+
width: 100%;
40+
}
41+
.ogCard__container:hover .ogCard__description__container,
42+
.ogCard__link:focus .ogCard__description__container {
43+
background-color: #C2C2C2;
44+
}
45+
.ogCard__container:hover .ogCard__image,
46+
.ogCard__link:focus .ogCard__image {
47+
transform: scale(1.1);
48+
}
49+
.ogCard__image__container {
50+
display: flex;
51+
justify-content: center;
52+
height: 150px;
53+
width: 100%;
54+
border-top: 2px solid #212121;
55+
overflow: hidden;
56+
}
57+
.ogCard__image {
58+
height: 100%;
59+
transition: all 0.1s ease-out;
60+
}
61+
.ogCard__description__container {
62+
display: flex;
63+
align-items: center;
64+
justify-content: center;
65+
text-align: center;
66+
width: 100%;
67+
min-height: 50px;
68+
padding: 5px;
69+
font-weight: bold;
70+
background-color: #DBDBDB;
71+
transition: all 0.1s ease-out;
72+
}
73+
.ogCard__description {
74+
display: -webkit-box;
75+
-webkit-box-orient: vertical;
76+
-webkit-line-clamp: 2;
77+
height: 100%;
78+
width: 100%;
79+
overflow: hidden;
2980
}

0 commit comments

Comments
 (0)