mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
fix: #6422, update deleted/restored messages
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
"chat.recent-chats": "Recent Chats",
|
"chat.recent-chats": "Recent Chats",
|
||||||
"chat.contacts": "Contacts",
|
"chat.contacts": "Contacts",
|
||||||
"chat.message-history": "Message History",
|
"chat.message-history": "Message History",
|
||||||
|
"chat.message-deleted": "Message Deleted",
|
||||||
"chat.options": "Chat options",
|
"chat.options": "Chat options",
|
||||||
"chat.pop-out": "Pop out chat",
|
"chat.pop-out": "Pop out chat",
|
||||||
"chat.minimize": "Minimize",
|
"chat.minimize": "Minimize",
|
||||||
|
|||||||
@@ -485,7 +485,7 @@ define('forum/chats', [
|
|||||||
app.updateUserStatus($('.chats-list [data-uid="' + data.uid + '"] [component="user/status"]'), data.status);
|
app.updateUserStatus($('.chats-list [data-uid="' + data.uid + '"] [component="user/status"]'), data.status);
|
||||||
});
|
});
|
||||||
|
|
||||||
messages.onChatMessageEdit();
|
messages.addSocketListeners();
|
||||||
|
|
||||||
socket.on('event:chats.roomRename', function (data) {
|
socket.on('event:chats.roomRename', function (data) {
|
||||||
var roomEl = components.get('chat/recent/room', data.roomId);
|
var roomEl = components.get('chat/recent/room', data.roomId);
|
||||||
|
|||||||
@@ -129,14 +129,20 @@ define('forum/chats/messages', ['components', 'sounds', 'translator', 'benchpres
|
|||||||
// By setting the `data-mid` attribute, I tell the chat code that I am editing a
|
// By setting the `data-mid` attribute, I tell the chat code that I am editing a
|
||||||
// message, instead of posting a new one.
|
// message, instead of posting a new one.
|
||||||
inputEl.attr('data-mid', messageId).addClass('editing');
|
inputEl.attr('data-mid', messageId).addClass('editing');
|
||||||
inputEl.val(raw);
|
inputEl.val(raw).focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
messages.onChatMessageEdit = function () {
|
messages.addSocketListeners = function () {
|
||||||
socket.removeListener('event:chats.edit', onChatMessageEdited);
|
socket.removeListener('event:chats.edit', onChatMessageEdited);
|
||||||
socket.on('event:chats.edit', onChatMessageEdited);
|
socket.on('event:chats.edit', onChatMessageEdited);
|
||||||
|
|
||||||
|
socket.removeListener('event:chats.delete', onChatMessageDeleted);
|
||||||
|
socket.on('event:chats.delete', onChatMessageDeleted);
|
||||||
|
|
||||||
|
socket.removeListener('event:chats.restore', onChatMessageRestored);
|
||||||
|
socket.on('event:chats.restore', onChatMessageRestored);
|
||||||
};
|
};
|
||||||
|
|
||||||
function onChatMessageEdited(data) {
|
function onChatMessageEdited(data) {
|
||||||
@@ -153,6 +159,18 @@ define('forum/chats/messages', ['components', 'sounds', 'translator', 'benchpres
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onChatMessageDeleted(messageId) {
|
||||||
|
components.get('chat/message', messageId)
|
||||||
|
.toggleClass('deleted', true)
|
||||||
|
.find('[component="chat/message/body"]').translateHtml('[[modules:chat.message-deleted]]');
|
||||||
|
}
|
||||||
|
|
||||||
|
function onChatMessageRestored(message) {
|
||||||
|
components.get('chat/message', message.messageId)
|
||||||
|
.toggleClass('deleted', false)
|
||||||
|
.find('[component="chat/message/body"]').html(message.content);
|
||||||
|
}
|
||||||
|
|
||||||
messages.delete = function (messageId, roomId) {
|
messages.delete = function (messageId, roomId) {
|
||||||
translator.translate('[[modules:chat.delete_message_confirm]]', function (translated) {
|
translator.translate('[[modules:chat.delete_message_confirm]]', function (translated) {
|
||||||
bootbox.confirm(translated, function (ok) {
|
bootbox.confirm(translated, function (ok) {
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ define('chat', [
|
|||||||
|
|
||||||
Chats.addCharactersLeftHandler(chatModal);
|
Chats.addCharactersLeftHandler(chatModal);
|
||||||
Chats.addIPHandler(chatModal);
|
Chats.addIPHandler(chatModal);
|
||||||
ChatsMessages.onChatMessageEdit();
|
ChatsMessages.addSocketListeners();
|
||||||
|
|
||||||
taskbar.push('chat', chatModal.attr('data-uuid'), {
|
taskbar.push('chat', chatModal.attr('data-uuid'), {
|
||||||
title: '[[modules:chat.chatting_with]] ' + (data.roomName || (data.users.length ? data.users[0].username : '')),
|
title: '[[modules:chat.chatting_with]] ' + (data.roomName || (data.users.length ? data.users[0].username : '')),
|
||||||
|
|||||||
@@ -1,16 +1,33 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
module.exports = function (Messaging) {
|
const sockets = require('../socket.io');
|
||||||
Messaging.deleteMessage = async mid => await doDeleteRestore(mid, 1);
|
|
||||||
Messaging.restoreMessage = async mid => await doDeleteRestore(mid, 0);
|
|
||||||
|
|
||||||
async function doDeleteRestore(mid, state) {
|
module.exports = function (Messaging) {
|
||||||
|
Messaging.deleteMessage = async (mid, uid) => await doDeleteRestore(mid, 1, uid);
|
||||||
|
Messaging.restoreMessage = async (mid, uid) => await doDeleteRestore(mid, 0, uid);
|
||||||
|
|
||||||
|
async function doDeleteRestore(mid, state, uid) {
|
||||||
const field = state ? 'deleted' : 'restored';
|
const field = state ? 'deleted' : 'restored';
|
||||||
const cur = await Messaging.getMessageField(mid, 'deleted');
|
const { deleted, roomId } = await Messaging.getMessageFields(mid, ['deleted', 'roomId']);
|
||||||
if (cur === state) {
|
if (deleted === state) {
|
||||||
throw new Error('[[error:chat-' + field + '-already]]');
|
throw new Error('[[error:chat-' + field + '-already]]');
|
||||||
}
|
}
|
||||||
|
|
||||||
await Messaging.setMessageField(mid, 'deleted', state);
|
await Messaging.setMessageField(mid, 'deleted', state);
|
||||||
|
|
||||||
|
const [uids, messages] = await Promise.all([
|
||||||
|
Messaging.getUidsInRoom(roomId, 0, -1),
|
||||||
|
Messaging.getMessagesData([mid], uid, roomId, true),
|
||||||
|
]);
|
||||||
|
|
||||||
|
uids.forEach(function (_uid) {
|
||||||
|
if (parseInt(_uid, 10) !== parseInt(uid, 10)) {
|
||||||
|
if (state === 1) {
|
||||||
|
sockets.in('uid_' + _uid).emit('event:chats.delete', mid);
|
||||||
|
} else if (state === 0) {
|
||||||
|
sockets.in('uid_' + _uid).emit('event:chats.restore', messages[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -40,14 +40,13 @@ Messaging.getMessages = async (params) => {
|
|||||||
});
|
});
|
||||||
mids.reverse();
|
mids.reverse();
|
||||||
|
|
||||||
let messageData = await Messaging.getMessagesData(mids, params.uid, params.roomId, isNew);
|
const messageData = await Messaging.getMessagesData(mids, params.uid, params.roomId, isNew);
|
||||||
messageData.forEach(function (messageData) {
|
messageData.forEach(function (messageData) {
|
||||||
messageData.index = indices[messageData.messageId.toString()];
|
messageData.index = indices[messageData.messageId.toString()];
|
||||||
});
|
messageData.isOwner = messageData.fromuid === parseInt(params.uid, 10);
|
||||||
|
if (messageData.deleted && !messageData.isOwner) {
|
||||||
// Filter out deleted messages unless you're the sender of said message
|
messageData.content = '[[modules:chat.message-deleted]]';
|
||||||
messageData = messageData.filter(function (messageData) {
|
}
|
||||||
return (!messageData.deleted || messageData.fromuid === parseInt(params.uid, 10));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return messageData;
|
return messageData;
|
||||||
@@ -100,9 +99,7 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => {
|
|||||||
unread: db.isSortedSetMembers('uid:' + uid + ':chat:rooms:unread', roomIds),
|
unread: db.isSortedSetMembers('uid:' + uid + ':chat:rooms:unread', roomIds),
|
||||||
users: Promise.all(roomIds.map(async (roomId) => {
|
users: Promise.all(roomIds.map(async (roomId) => {
|
||||||
let uids = await db.getSortedSetRevRange('chat:room:' + roomId + ':uids', 0, 9);
|
let uids = await db.getSortedSetRevRange('chat:room:' + roomId + ':uids', 0, 9);
|
||||||
uids = uids.filter(function (value) {
|
uids = uids.filter(_uid => _uid && parseInt(_uid, 10) !== parseInt(uid, 10));
|
||||||
return value && parseInt(value, 10) !== parseInt(uid, 10);
|
|
||||||
});
|
|
||||||
return await user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline']);
|
return await user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline']);
|
||||||
})),
|
})),
|
||||||
teasers: Promise.all(roomIds.map(async roomId => Messaging.getTeaser(uid, roomId))),
|
teasers: Promise.all(roomIds.map(async roomId => Messaging.getTeaser(uid, roomId))),
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ SocketModules.chats.delete = async function (socket, data) {
|
|||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
await Messaging.canDelete(data.messageId, socket.uid);
|
await Messaging.canDelete(data.messageId, socket.uid);
|
||||||
await Messaging.deleteMessage(data.messageId);
|
await Messaging.deleteMessage(data.messageId, socket.uid);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketModules.chats.restore = async function (socket, data) {
|
SocketModules.chats.restore = async function (socket, data) {
|
||||||
@@ -204,7 +204,7 @@ SocketModules.chats.restore = async function (socket, data) {
|
|||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
await Messaging.canDelete(data.messageId, socket.uid);
|
await Messaging.canDelete(data.messageId, socket.uid);
|
||||||
await Messaging.restoreMessage(data.messageId);
|
await Messaging.restoreMessage(data.messageId, socket.uid);
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketModules.chats.canMessage = async function (socket, roomId) {
|
SocketModules.chats.canMessage = async function (socket, roomId) {
|
||||||
|
|||||||
@@ -692,14 +692,9 @@ describe('Messaging Library', function () {
|
|||||||
it('should not show deleted message to other users', function (done) {
|
it('should not show deleted message to other users', function (done) {
|
||||||
socketModules.chats.getMessages({ uid: herpUid }, { uid: herpUid, roomId: roomId, start: 0 }, function (err, messages) {
|
socketModules.chats.getMessages({ uid: herpUid }, { uid: herpUid, roomId: roomId, start: 0 }, function (err, messages) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
|
messages.forEach(function (msg) {
|
||||||
// Reduce messages to their mids
|
assert(!msg.deleted || msg.content === '[[modules:chat.message-deleted]]', msg.content);
|
||||||
var mids = messages.reduce(function (mids, cur) {
|
});
|
||||||
mids.push(cur.messageId);
|
|
||||||
return mids;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
assert(!mids.includes(mid));
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user