diff --git a/install/data/defaults.json b/install/data/defaults.json index eeec153f1b..92bac0b2b7 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -21,6 +21,7 @@ "chatEditDuration": 0, "chatDeleteDuration": 0, "chatMessageDelay": 2000, + "newbieChatMessageDelay": 120000, "notificationSendDelay": 60, "newbiePostDelayThreshold": 3, "postQueue": 0, diff --git a/public/language/en-GB/admin/settings/chat.json b/public/language/en-GB/admin/settings/chat.json index 102dd5aa3b..86360a34ee 100644 --- a/public/language/en-GB/admin/settings/chat.json +++ b/public/language/en-GB/admin/settings/chat.json @@ -7,7 +7,8 @@ "max-length": "Maximum length of chat messages", "max-chat-room-name-length": "Maximum length of chat room names", "max-room-size": "Maximum number of users in chat rooms", - "delay": "Time between chat messages in milliseconds", + "delay": "Time between chat messages (ms)", + "newbieDelay": "... for new users (ms)", "notification-delay": "Notification delay for chat messages", "notification-delay-help": "Additional messages sent between this time are collated, and the user is notified once per delay period. Set this to 0 to disable the delay.", "restrictions.seconds-edit-after": "Number of seconds a chat message will remain editable.", diff --git a/src/api/chats.js b/src/api/chats.js index 281109f514..bf8d01df9c 100644 --- a/src/api/chats.js +++ b/src/api/chats.js @@ -14,11 +14,17 @@ const socketHelpers = require('../socket.io/helpers'); const chatsAPI = module.exports; -function rateLimitExceeded(caller) { +async function rateLimitExceeded(caller) { const session = caller.request ? caller.request.session : caller.session; // socket vs req const now = Date.now(); + const [isAdmin, reputation] = await Promise.all([ + user.isAdministrator(caller.uid), + user.getUserField(caller.uid, 'reputation'), + ]); + const newbie = !isAdmin && meta.config.newbiePostDelayThreshold > reputation; + const delay = newbie ? meta.config.newbieChatMessageDelay : meta.config.chatMessageDelay; session.lastChatMessageTime = session.lastChatMessageTime || 0; - if (now - session.lastChatMessageTime < meta.config.chatMessageDelay) { + if (now - session.lastChatMessageTime < delay) { return true; } session.lastChatMessageTime = now; @@ -34,7 +40,7 @@ chatsAPI.list = async (caller, { page, perPage }) => { }; chatsAPI.create = async function (caller, data) { - if (rateLimitExceeded(caller)) { + if (await rateLimitExceeded(caller)) { throw new Error('[[error:too-many-messages]]'); } if (!data) { @@ -71,7 +77,7 @@ chatsAPI.create = async function (caller, data) { chatsAPI.get = async (caller, { uid, roomId }) => await messaging.loadRoom(caller.uid, { uid, roomId }); chatsAPI.post = async (caller, data) => { - if (rateLimitExceeded(caller)) { + if (await rateLimitExceeded(caller)) { throw new Error('[[error:too-many-messages]]'); } if (!data || !data.roomId || !caller.uid) { diff --git a/src/views/admin/settings/chat.tpl b/src/views/admin/settings/chat.tpl index 852a039597..cbd138d0c8 100644 --- a/src/views/admin/settings/chat.tpl +++ b/src/views/admin/settings/chat.tpl @@ -49,11 +49,16 @@ - -
- - -
+
+
+ + +
+
+ + +
+