fix: #6422, update deleted/restored messages

v1.18.x
Barış Soner Uşaklı 5 years ago
parent 20fbab9723
commit 067034082f

@ -12,6 +12,7 @@
"chat.recent-chats": "Recent Chats",
"chat.contacts": "Contacts",
"chat.message-history": "Message History",
"chat.message-deleted": "Message Deleted",
"chat.options": "Chat options",
"chat.pop-out": "Pop out chat",
"chat.minimize": "Minimize",

@ -485,7 +485,7 @@ define('forum/chats', [
app.updateUserStatus($('.chats-list [data-uid="' + data.uid + '"] [component="user/status"]'), data.status);
});
messages.onChatMessageEdit();
messages.addSocketListeners();
socket.on('event:chats.roomRename', function (data) {
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
// message, instead of posting a new one.
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.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) {
@ -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) {
translator.translate('[[modules:chat.delete_message_confirm]]', function (translated) {
bootbox.confirm(translated, function (ok) {

@ -242,7 +242,7 @@ define('chat', [
Chats.addCharactersLeftHandler(chatModal);
Chats.addIPHandler(chatModal);
ChatsMessages.onChatMessageEdit();
ChatsMessages.addSocketListeners();
taskbar.push('chat', chatModal.attr('data-uuid'), {
title: '[[modules:chat.chatting_with]] ' + (data.roomName || (data.users.length ? data.users[0].username : '')),

@ -1,16 +1,33 @@
'use strict';
const sockets = require('../socket.io');
module.exports = function (Messaging) {
Messaging.deleteMessage = async mid => await doDeleteRestore(mid, 1);
Messaging.restoreMessage = async mid => await doDeleteRestore(mid, 0);
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) {
async function doDeleteRestore(mid, state, uid) {
const field = state ? 'deleted' : 'restored';
const cur = await Messaging.getMessageField(mid, 'deleted');
if (cur === state) {
const { deleted, roomId } = await Messaging.getMessageFields(mid, ['deleted', 'roomId']);
if (deleted === state) {
throw new Error('[[error:chat-' + field + '-already]]');
}
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();
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.index = indices[messageData.messageId.toString()];
});
// Filter out deleted messages unless you're the sender of said message
messageData = messageData.filter(function (messageData) {
return (!messageData.deleted || messageData.fromuid === parseInt(params.uid, 10));
messageData.isOwner = messageData.fromuid === parseInt(params.uid, 10);
if (messageData.deleted && !messageData.isOwner) {
messageData.content = '[[modules:chat.message-deleted]]';
}
});
return messageData;
@ -100,9 +99,7 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => {
unread: db.isSortedSetMembers('uid:' + uid + ':chat:rooms:unread', roomIds),
users: Promise.all(roomIds.map(async (roomId) => {
let uids = await db.getSortedSetRevRange('chat:room:' + roomId + ':uids', 0, 9);
uids = uids.filter(function (value) {
return value && parseInt(value, 10) !== parseInt(uid, 10);
});
uids = uids.filter(_uid => _uid && parseInt(_uid, 10) !== parseInt(uid, 10));
return await user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline']);
})),
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]]');
}
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) {
@ -204,7 +204,7 @@ SocketModules.chats.restore = async function (socket, data) {
throw new Error('[[error:invalid-data]]');
}
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) {

@ -692,14 +692,9 @@ describe('Messaging Library', function () {
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) {
assert.ifError(err);
// Reduce messages to their mids
var mids = messages.reduce(function (mids, cur) {
mids.push(cur.messageId);
return mids;
}, []);
assert(!mids.includes(mid));
messages.forEach(function (msg) {
assert(!msg.deleted || msg.content === '[[modules:chat.message-deleted]]', msg.content);
});
done();
});
});

Loading…
Cancel
Save