nodebb/src/messaging/edit.js

90 lines
2.7 KiB
JavaScript

'use strict';
const meta = require('../meta');
const user = require('../user');
const plugins = require('../plugins');
const privileges = require('../privileges');
const sockets = require('../socket.io');
module.exports = function (Messaging) {
Messaging.editMessage = async (uid, mid, roomId, content) => {
await Messaging.checkContent(content);
const raw = await Messaging.getMessageField(mid, 'content');
if (raw === content) {
return;
}
const payload = await plugins.hooks.fire('filter:messaging.edit', {
content: content,
edited: Date.now(),
});
if (!String(payload.content).trim()) {
throw new Error('[[error:invalid-chat-message]]');
}
await Messaging.setMessageFields(mid, payload);
// Propagate this change to users in the room
const messages = await Messaging.getMessagesData([mid], uid, roomId, true);
sockets.in(`chat_room_${roomId}`).emit('event:chats.edit', {
messages: messages,
});
plugins.hooks.fire('action:messaging.edit', {
message: { ...messages[0], content: payload.content },
});
};
const canEditDelete = async (messageId, uid, type) => {
let durationConfig = '';
if (type === 'edit') {
durationConfig = 'chatEditDuration';
} else if (type === 'delete') {
durationConfig = 'chatDeleteDuration';
}
const exists = await Messaging.messageExists(messageId);
if (!exists) {
throw new Error('[[error:invalid-mid]]');
}
const isAdminOrGlobalMod = await user.isAdminOrGlobalMod(uid);
if (meta.config.disableChat) {
throw new Error('[[error:chat-disabled]]');
} else if (!isAdminOrGlobalMod && meta.config.disableChatMessageEditing) {
throw new Error('[[error:chat-message-editing-disabled]]');
}
const userData = await user.getUserFields(uid, ['banned']);
if (userData.banned) {
throw new Error('[[error:user-banned]]');
}
const canChat = await privileges.global.can('chat', uid);
if (!canChat) {
throw new Error('[[error:no-privileges]]');
}
const messageData = await Messaging.getMessageFields(messageId, ['fromuid', 'timestamp', 'system']);
if (isAdminOrGlobalMod && !messageData.system) {
return;
}
const chatConfigDuration = meta.config[durationConfig];
if (chatConfigDuration && Date.now() - messageData.timestamp > chatConfigDuration * 1000) {
throw new Error(`[[error:chat-${type}-duration-expired, ${meta.config[durationConfig]}]]`);
}
if (messageData.fromuid === parseInt(uid, 10) && !messageData.system) {
return;
}
throw new Error(`[[error:cant-${type}-chat-message]]`);
};
Messaging.canEdit = async (messageId, uid) => await canEditDelete(messageId, uid, 'edit');
Messaging.canDelete = async (messageId, uid) => await canEditDelete(messageId, uid, 'delete');
};