generated from lucien/api-template
add: added replies to messages
This commit is contained in:
parent
05dd75fa74
commit
b10a472ed7
10 changed files with 607 additions and 306 deletions
|
@ -9,6 +9,41 @@ function getConnection() {
|
|||
});
|
||||
}
|
||||
|
||||
// +---------------------------+
|
||||
// | Users |
|
||||
// +---------------------------+
|
||||
|
||||
function addUser(connection, username, password) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`INSERT INTO users (username, password) VALUES (?, ?)`,
|
||||
[username, password],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteUser(connection, id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM users WHERE id = ?`,
|
||||
[id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function getUsers(connection) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
|
@ -27,22 +62,7 @@ function getUser(connection, id) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT * FROM users WHERE id = ?`,
|
||||
[id], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function searchUser(connection, search) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT * FROM users WHERE username LIKE ? LIMIT 5`,
|
||||
[`%${search}%`], // Use parameterized query
|
||||
[id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -57,7 +77,7 @@ function getUserByUsername(connection, username) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT * FROM users WHERE username = ?`,
|
||||
[username], // Use parameterized query
|
||||
[username],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -68,11 +88,11 @@ function getUserByUsername(connection, username) {
|
|||
});
|
||||
}
|
||||
|
||||
function addUser(connection, username, password) {
|
||||
function searchUser(connection, search) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`INSERT INTO users (username, password) VALUES (?, ?)`,
|
||||
[username, password], // Use parameterized query
|
||||
`SELECT * FROM users WHERE username LIKE ? LIMIT 5`,
|
||||
[`%${search}%`],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -83,46 +103,11 @@ function addUser(connection, username, password) {
|
|||
});
|
||||
}
|
||||
|
||||
function getUserLastMessages(connection, username) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
WHERE username = ?
|
||||
ORDER BY date DESC LIMIT 5`,
|
||||
[username], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteUser(connection, id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM users WHERE id = ?`,
|
||||
[id], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
function setUserPfp(connection, id, pfp) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`UPDATE users SET pfp = ? WHERE id = ?`,
|
||||
[pfp, id], // Use parameterized query
|
||||
[pfp, id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -137,7 +122,7 @@ function setUserUsername(connection, id, username) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`UPDATE users SET username = ? WHERE id = ?`,
|
||||
[username, id], // Use parameterized query
|
||||
[username, id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -152,7 +137,41 @@ function setUserPassword(connection, id, password) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`UPDATE users SET password = ? WHERE id = ?`,
|
||||
[password, id], // Use parameterized query
|
||||
[password, id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// +---------------------------+
|
||||
// | Channels |
|
||||
// +---------------------------+
|
||||
|
||||
function addChannel(connection, name, description, owner_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`INSERT INTO channels (name, description, owner_id) VALUES (?, ?, ?)`,
|
||||
[name, description, owner_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteChannel(connection, channel_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM channels WHERE id = ?`,
|
||||
[channel_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -177,6 +196,24 @@ function getChannels(connection) {
|
|||
});
|
||||
}
|
||||
|
||||
function getChannel(connection, name) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT channels.id, name, description, owner_id, username AS owner_username
|
||||
FROM channels
|
||||
JOIN users ON channels.owner_id = users.id
|
||||
WHERE name = ?`,
|
||||
[name],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getActiveChannels(connection) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
|
@ -223,7 +260,7 @@ function searchChannels(connection, search) {
|
|||
JOIN users ON channels.owner_id = users.id
|
||||
WHERE name LIKE ?
|
||||
LIMIT 5`,
|
||||
[`%${search}%`], // Use parameterized query
|
||||
[`%${search}%`],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -234,116 +271,30 @@ function searchChannels(connection, search) {
|
|||
});
|
||||
}
|
||||
|
||||
function getChannel(connection, name) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT channels.id, name, description, owner_id, username AS owner_username
|
||||
FROM channels
|
||||
JOIN users ON channels.owner_id = users.id
|
||||
WHERE name = ?`,
|
||||
[name], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function addChannel(connection, name, description, owner_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`INSERT INTO channels (name, description, owner_id) VALUES (?, ?, ?)`,
|
||||
[name, description, owner_id], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteChannel(connection, channel_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM channels WHERE id = ?`,
|
||||
[channel_id], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getMessages(connection, channel_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
WHERE channel_id = ?
|
||||
ORDER BY date DESC`,
|
||||
[channel_id], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getLastMessages(connection) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
ORDER BY date DESC LIMIT 5`,
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getMessage(connection, message_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
WHERE messages.id = ?`,
|
||||
[message_id], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
// +---------------------------+
|
||||
// | Messages |
|
||||
// +---------------------------+
|
||||
|
||||
function addMessage(connection, channel_id, user_id, message) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`INSERT INTO messages (channel_id, user_id, content, date) VALUES (?, ?, ?, ?)`,
|
||||
[channel_id, user_id, message, Math.floor(Date.now() / 1000)], // Use parameterized query
|
||||
[channel_id, user_id, message, Math.floor(Date.now() / 1000)],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function addReply(connection, channel_id, user_id, message, message_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`INSERT INTO messages (channel_id, user_id, content, date, reply_to_id) VALUES (?, ?, ?, ?, ?)`,
|
||||
[channel_id, user_id, message, Math.floor(Date.now() / 1000), message_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -358,7 +309,7 @@ function deleteMessage(connection, message_id) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM messages WHERE id = ?`,
|
||||
[message_id], // Use parameterized query
|
||||
[message_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -373,7 +324,7 @@ function deleteChannelMessages(connection, channel_id) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM messages WHERE channel_id = ?`,
|
||||
[channel_id], // Use parameterized query
|
||||
[channel_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -384,11 +335,16 @@ function deleteChannelMessages(connection, channel_id) {
|
|||
});
|
||||
}
|
||||
|
||||
function deleteUserMessages(connection, user_id) {
|
||||
function getMessages(connection, channel_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM messages WHERE user_id = ?`,
|
||||
[user_id], // Use parameterized query
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
WHERE channel_id = ? AND reply_to_id IS NULL
|
||||
ORDER BY date DESC`,
|
||||
[channel_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -399,11 +355,106 @@ function deleteUserMessages(connection, user_id) {
|
|||
});
|
||||
}
|
||||
|
||||
function getMessage(connection, message_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
WHERE messages.id = ?`,
|
||||
[message_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getLastMessages(connection) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
ORDER BY date DESC LIMIT 5`,
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getUserLastMessages(connection, username) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
WHERE username = ?
|
||||
ORDER BY date DESC LIMIT 5`,
|
||||
[username],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function getMessageReplies(connection, message_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT messages.id, user_id, username, content, date, channels.name AS channel_name, has_replies
|
||||
FROM messages
|
||||
JOIN users ON messages.user_id = users.id
|
||||
JOIN channels ON messages.channel_id = channels.id
|
||||
WHERE reply_to_id = ?`,
|
||||
[message_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function setHasReplies(connection, message_id, has_replies) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`UPDATE messages SET has_replies = ? WHERE id = ?`,
|
||||
[has_replies, message_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// +---------------------------+
|
||||
// | Mentions |
|
||||
// +---------------------------+
|
||||
|
||||
function addMention(connection, message_id, user_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`INSERT INTO mentions (message_id, user_id) VALUES (?, ?)`,
|
||||
[message_id, user_id], // Use parameterized query
|
||||
[message_id, user_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -420,7 +471,7 @@ function getMentions(connection, message_id) {
|
|||
`SELECT users.username FROM mentions
|
||||
JOIN users ON mentions.user_id = users.id
|
||||
WHERE message_id = ?`,
|
||||
[message_id], // Use parameterized query
|
||||
[message_id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -431,11 +482,15 @@ function getMentions(connection, message_id) {
|
|||
});
|
||||
}
|
||||
|
||||
function deleMentions(connection, message_id) {
|
||||
// +---------------------------+
|
||||
// | Emojis |
|
||||
// +---------------------------+
|
||||
|
||||
function addEmoji(connection, name, file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM mentions WHERE message_id = ?`,
|
||||
[message_id], // Use parameterized query
|
||||
`INSERT INTO emojis (name, file) VALUES (?, ?)`,
|
||||
[name, file],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -446,27 +501,11 @@ function deleMentions(connection, message_id) {
|
|||
});
|
||||
}
|
||||
|
||||
function deleteChannelMentions(connection, channel_id) {
|
||||
function deleteEmoji(connection, id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM mentions WHERE message_id IN
|
||||
(SELECT id FROM messages WHERE channel_id = ?)`,
|
||||
[channel_id], // Use parameterized query
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
}
|
||||
resolve(result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteUserMentions(connection, user_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`DELETE FROM mentions WHERE user_id = ?`,
|
||||
[user_id], // Use parameterized query
|
||||
`DELETE FROM emojis WHERE id = ?`,
|
||||
[id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -491,41 +530,11 @@ function getEmojis(connection) {
|
|||
});
|
||||
}
|
||||
|
||||
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
|
||||
[id],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -540,7 +549,7 @@ function getEmojiByName(connection, name) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT * FROM emojis WHERE name = ?`,
|
||||
[name], // Use parameterized query
|
||||
[name],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -555,7 +564,7 @@ function searchEmojis(connection, search) {
|
|||
return new Promise((resolve, reject) => {
|
||||
connection.query(
|
||||
`SELECT * FROM emojis WHERE name LIKE ? LIMIT 5`,
|
||||
[`%${search}%`], // Use parameterized query
|
||||
[`%${search}%`],
|
||||
(error, result) => {
|
||||
if (error) {
|
||||
reject(new Error(error));
|
||||
|
@ -567,39 +576,43 @@ function searchEmojis(connection, search) {
|
|||
}
|
||||
|
||||
module.exports = {
|
||||
getUsers,
|
||||
getConnection,
|
||||
|
||||
addUser,
|
||||
deleteUser,
|
||||
getUsers,
|
||||
getUser,
|
||||
searchUser,
|
||||
getUserByUsername,
|
||||
addUser,
|
||||
deleteUser,
|
||||
setUserPfp,
|
||||
setUserUsername,
|
||||
setUserPassword,
|
||||
getUserLastMessages,
|
||||
|
||||
addChannel,
|
||||
deleteChannel,
|
||||
getChannels,
|
||||
getChannel,
|
||||
getActiveChannels,
|
||||
getNewChannels,
|
||||
searchChannels,
|
||||
getChannel,
|
||||
addChannel,
|
||||
deleteChannel,
|
||||
getMessages,
|
||||
getLastMessages,
|
||||
getMessage,
|
||||
|
||||
addMessage,
|
||||
addReply,
|
||||
deleteMessage,
|
||||
deleteChannelMessages,
|
||||
deleteUserMessages,
|
||||
getMessages,
|
||||
getMessage,
|
||||
getUserLastMessages,
|
||||
getLastMessages,
|
||||
getMessageReplies,
|
||||
setHasReplies,
|
||||
|
||||
addMention,
|
||||
getMentions,
|
||||
deleMentions,
|
||||
deleteUserMentions,
|
||||
deleteChannelMentions,
|
||||
getEmojis,
|
||||
|
||||
addEmoji,
|
||||
deleteEmoji,
|
||||
getEmojis,
|
||||
getEmoji,
|
||||
getEmojiByName,
|
||||
searchEmojis,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue