diff --git a/back/api/emojis.js b/back/api/emojis.js
new file mode 100644
index 0000000..dafd00b
--- /dev/null
+++ b/back/api/emojis.js
@@ -0,0 +1,102 @@
+const express = require('express');
+const { getConnection, getEmojis, addEmoji, getEmojiByName, deleteEmoji } = require('../libs/mysql');
+const { checkAuth } = require("../libs/middlewares")
+const multer = require('multer');
+const fs = require('node:fs');
+const path = require('node:path');
+
+const router = express.Router();
+
+const upload = multer({ dest: 'data/emojis/' })
+upload.limits = {
+ fileSize: 1024 * 1024 * 1,
+ files: 1,
+};
+
+router.get('/', async (req, res) => {
+ const connection = await getConnection();
+ const emojis = await getEmojis(connection);
+ connection.end();
+ res.send(emojis);
+});
+
+router.post('/add', upload.single("emoji"), checkAuth, async (req, res) => {
+ const { name } = req.body;
+ const file = req.file;
+
+ if (!name || !file) {
+ return res.status(400).send({ error: 'Invalid name or file' });
+ }
+
+ const connection = await getConnection();
+
+ const emoji = await getEmojiByName(connection, name);
+
+ if (emoji[0]) {
+ connection.end();
+ fs.unlinkSync(`data/emojis/${file.filename}`);
+ return res.status(400).send({ error: 'Emoji already exists' });
+ }
+
+ if (!/^[a-zA-Z0-9-_]+$/.test(name)) {
+ connection.end();
+ fs.unlinkSync(`data/emojis/${file.filename}`);
+ return res.status(400).send({ error: 'Invalid name' });
+ }
+
+ await addEmoji(connection, name, file.filename);
+ connection.end();
+
+ req.sockets.emit({
+ type: 'new_emoji'
+ });
+
+ res.send({ message: "Emoji added" });
+});
+
+router.get('/:name', async (req, res) => {
+ const { name } = req.params;
+
+ const connection = await getConnection();
+ const emoji = await getEmojiByName(connection, name);
+ connection.end();
+
+ if (!emoji[0]) {
+ return res.status(404).send({ error: 'Emoji not found' });
+ }
+
+ res.sendFile(path.join(__dirname, `../data/emojis/${emoji[0].file}`), { headers: { 'Content-Type': 'image' } });
+});
+
+router.post('/:name/delete', checkAuth, async (req, res) => {
+ const { name } = req.params;
+ const user = req.user;
+
+ const connection = await getConnection();
+ const emoji = await getEmojiByName(connection, name);
+
+ if (!emoji[0]) {
+ connection.end();
+ return res.status(404).send({ error: 'Emoji not found' });
+ }
+
+ if (user.admin !== 1) {
+ connection.end();
+ return res.status(401).send({ error: 'Unauthorized' });
+ }
+
+ if (fs.existsSync(`data/emojis/${emoji[0].file}`)) {
+ fs.unlinkSync(`data/emojis/${emoji[0].file}`);
+ }
+
+ await deleteEmoji(connection, emoji[0].id);
+ connection.end();
+
+ req.sockets.emit({
+ type: 'delete_emoji',
+ });
+
+ res.send({ message: "Emoji deleted" });
+});
+
+module.exports = router;
\ No newline at end of file
diff --git a/back/api/searchemojis.js b/back/api/searchemojis.js
new file mode 100644
index 0000000..d9f4e23
--- /dev/null
+++ b/back/api/searchemojis.js
@@ -0,0 +1,14 @@
+const express = require('express');
+const { getConnection, searchEmojis } = require('../libs/mysql');
+
+const router = express.Router();
+
+router.get('/', async (req, res) => {
+ const { search } = req.query;
+ const connection = await getConnection();
+ const emojis = await searchEmojis(connection, search);
+ connection.end();
+ res.send(emojis);
+});
+
+module.exports = router;
\ No newline at end of file
diff --git a/back/libs/mysql.js b/back/libs/mysql.js
index fadd56f..1fedcdf 100644
--- a/back/libs/mysql.js
+++ b/back/libs/mysql.js
@@ -477,6 +477,95 @@ function deleteUserMentions(connection, user_id) {
});
}
+function getEmojis(connection) {
+ return new Promise((resolve, reject) => {
+ connection.query(
+ `SELECT id, name FROM emojis`,
+ (error, result) => {
+ if (error) {
+ reject(new Error(error));
+ }
+ resolve(result);
+ }
+ );
+ });
+}
+
+function addEmoji(connection, name, file) {
+ return new Promise((resolve, reject) => {
+ connection.query(
+ `INSERT INTO emojis (name, file) VALUES (?, ?)`,
+ [name, file], // Use parameterized query
+ (error, result) => {
+ if (error) {
+ reject(new Error(error));
+ }
+ resolve(result);
+ }
+ );
+ });
+}
+
+function deleteEmoji(connection, id) {
+ return new Promise((resolve, reject) => {
+ connection.query(
+ `DELETE FROM emojis WHERE id = ?`,
+ [id], // Use parameterized query
+ (error, result) => {
+ if (error) {
+ reject(new Error(error));
+ }
+ resolve(result);
+ }
+ );
+ });
+}
+
+function getEmoji(connection, id) {
+ return new Promise((resolve, reject) => {
+ connection.query(
+ `SELECT * FROM emojis WHERE id = ?`,
+ [id], // Use parameterized query
+ (error, result) => {
+ if (error) {
+ reject(new Error(error));
+ }
+ resolve(result);
+ }
+ );
+ });
+}
+
+function getEmojiByName(connection, name) {
+ return new Promise((resolve, reject) => {
+ connection.query(
+ `SELECT * FROM emojis WHERE name = ?`,
+ [name], // Use parameterized query
+ (error, result) => {
+ if (error) {
+ reject(new Error(error));
+ }
+ resolve(result);
+ }
+ );
+ });
+}
+
+function searchEmojis(connection, search) {
+ return new Promise((resolve, reject) => {
+ connection.query(
+ `SELECT * FROM emojis WHERE name LIKE ? LIMIT 5`,
+ [`%${search}%`], // Use parameterized query
+ (error, result) => {
+ if (error) {
+ reject(new Error(error));
+ }
+ resolve(result);
+ }
+ );
+ });
+}
+
module.exports = {
getUsers,
getConnection,
@@ -508,4 +597,10 @@ module.exports = {
deleMentions,
deleteUserMentions,
deleteChannelMentions,
+ getEmojis,
+ addEmoji,
+ deleteEmoji,
+ getEmoji,
+ getEmojiByName,
+ searchEmojis,
};
diff --git a/front/src/components/MessageComponent.tsx b/front/src/components/MessageComponent.tsx
index cf9ab4e..f80702a 100644
--- a/front/src/components/MessageComponent.tsx
+++ b/front/src/components/MessageComponent.tsx
@@ -27,6 +27,10 @@ export default function MessageComponent({ message, user, channel, deleteMessage
array.push(string)
string = ''
array.push(word)
+ } else if (word.startsWith(":") && word.endsWith(":") && word.length > 2) {
+ array.push(string)
+ string = ''
+ array.push(word)
} else {
string += word + " "
}
@@ -47,6 +51,9 @@ export default function MessageComponent({ message, user, channel, deleteMessage
return {word}
} else if (word.startsWith("https://") || word.startsWith("http://")) {
return {word}
+ } else if (word.startsWith(":") && word.endsWith(":") && word.length > 2) {
+ const emojiName = word.substring(1, word.length - 1);
+ return
}
return {word} ;
})}
diff --git a/front/src/components/TopBar.tsx b/front/src/components/TopBar.tsx
index 4eda32b..56eadfa 100644
--- a/front/src/components/TopBar.tsx
+++ b/front/src/components/TopBar.tsx
@@ -13,6 +13,7 @@ export default function TopBar({ user }: { user: User | undefined }) {
Home
Channels
Users
+ Emojis
Loading...
+