diff --git a/app/lib/client/methods/sendMessage.js b/app/lib/client/methods/sendMessage.js index 4ba64c0059a7..d765eefe27c7 100644 --- a/app/lib/client/methods/sendMessage.js +++ b/app/lib/client/methods/sendMessage.js @@ -1,17 +1,23 @@ import { Meteor } from 'meteor/meteor'; import { TimeSync } from 'meteor/mizzao:timesync'; import s from 'underscore.string'; +import toastr from 'toastr'; import { ChatMessage } from '../../../models'; import { settings } from '../../../settings'; import { callbacks } from '../../../callbacks'; import { promises } from '../../../promises/client'; +import { t } from '../../../utils/client'; Meteor.methods({ sendMessage(message) { if (!Meteor.userId() || s.trim(message.msg) === '') { return false; } + const messageAlreadyExists = message._id && ChatMessage.findOne({ _id: message._id }); + if (messageAlreadyExists) { + return toastr.error(t('Message_Already_Sent')); + } const user = Meteor.user(); message.ts = isNaN(TimeSync.serverOffset()) ? new Date() : new Date(Date.now() + TimeSync.serverOffset()); message.u = { diff --git a/app/lib/server/functions/sendMessage.js b/app/lib/server/functions/sendMessage.js index 290218f14e3d..2cb04ff465cb 100644 --- a/app/lib/server/functions/sendMessage.js +++ b/app/lib/server/functions/sendMessage.js @@ -198,6 +198,10 @@ export const sendMessage = function(user, message, room, upsert = false) { }, message); message._id = _id; } else { + const messageAlreadyExists = message._id && Messages.findOneById(message._id, { fields: { _id: 1 } }); + if (messageAlreadyExists) { + return; + } message._id = Messages.insert(message); } diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index b9a8ac3c7461..b5955587779b 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -2010,6 +2010,7 @@ "Message_AllowSnippeting": "Allow Message Snippeting", "Message_AllowStarring": "Allow Message Starring", "Message_AllowUnrecognizedSlashCommand": "Allow Unrecognized Slash Commands", + "Message_Already_Sent": "This message has already been sent and is being processed by the server", "Message_AlwaysSearchRegExp": "Always Search Using RegExp", "Message_AlwaysSearchRegExp_Description": "We recommend to set `True` if your language is not supported on MongoDB text search.", "Message_Attachments": "Message Attachments",