mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-05 07:10:30 +01:00
fix: chat room kicking of remote users, (un)read logic for remote users (there is none), sendNotification to only apply to local uids
re: #12834
This commit is contained in:
@@ -102,7 +102,7 @@ define('forum/chats/manage', [
|
||||
|
||||
function addKickHandler(roomId, modal) {
|
||||
modal.on('click', '[data-action="kick"]', function () {
|
||||
const uid = parseInt(this.getAttribute('data-uid'), 10);
|
||||
const uid = encodeURIComponent(this.getAttribute('data-uid'));
|
||||
|
||||
api.del(`/chats/${roomId}/users/${uid}`, {}).then((body) => {
|
||||
refreshParticipantsList(roomId, modal, body);
|
||||
|
||||
@@ -80,6 +80,7 @@ module.exports = function (Messaging) {
|
||||
|
||||
try {
|
||||
await sendNotification(fromUid, roomId, messageObj);
|
||||
// await federate(fromUid, roomId, messageObj);
|
||||
} catch (err) {
|
||||
winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`);
|
||||
}
|
||||
@@ -98,7 +99,8 @@ module.exports = function (Messaging) {
|
||||
const { ALLMESSAGES } = Messaging.notificationSettings;
|
||||
await batch.processSortedSet(`chat:room:${roomId}:uids:online`, async (uids) => {
|
||||
uids = uids.filter(
|
||||
uid => (parseInt((settings && settings[uid]) || roomDefault, 10) === ALLMESSAGES) &&
|
||||
uid => utils.isNumber(uid) &&
|
||||
(parseInt((settings && settings[uid]) || roomDefault, 10) === ALLMESSAGES) &&
|
||||
fromUid !== parseInt(uid, 10) &&
|
||||
!realtimeUids.includes(parseInt(uid, 10))
|
||||
);
|
||||
@@ -140,4 +142,7 @@ module.exports = function (Messaging) {
|
||||
await notifications.push(notification, uidsToNotify);
|
||||
}
|
||||
}
|
||||
|
||||
// async function federate(fromUid, roomId, messageObj) {
|
||||
// }
|
||||
};
|
||||
|
||||
@@ -13,6 +13,7 @@ const meta = require('../meta');
|
||||
const io = require('../socket.io');
|
||||
const cache = require('../cache');
|
||||
const cacheCreate = require('../cacheCreate');
|
||||
const utils = require('../utils');
|
||||
|
||||
const roomUidCache = cacheCreate({
|
||||
name: 'chat:room:uids',
|
||||
@@ -259,6 +260,13 @@ module.exports = function (Messaging) {
|
||||
|
||||
Messaging.addUsersToRoom = async function (uid, uids, roomId) {
|
||||
uids = _.uniq(uids);
|
||||
|
||||
// Public rooms must only contain local users
|
||||
const isPublic = await db.getObjectField(`chat:room:${roomId}`, 'public');
|
||||
if (parseInt(isPublic, 10) === 1 && uids.some(uid => !utils.isNumber(uid))) {
|
||||
throw new Error('[[error:invalid-uid]]');
|
||||
}
|
||||
|
||||
const inRoom = await Messaging.isUserInRoom(uid, roomId);
|
||||
const payload = await plugins.hooks.fire('filter:messaging.addUsersToRoom', { uid, uids, roomId, inRoom });
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
const db = require('../database');
|
||||
const utils = require('../utils');
|
||||
const io = require('../socket.io');
|
||||
|
||||
module.exports = function (Messaging) {
|
||||
@@ -26,6 +27,10 @@ module.exports = function (Messaging) {
|
||||
};
|
||||
|
||||
Messaging.markRead = async (uid, roomId) => {
|
||||
if (!utils.isNumber(uid)) {
|
||||
return;
|
||||
}
|
||||
|
||||
await Promise.all([
|
||||
db.sortedSetRemove(`uid:${uid}:chat:rooms:unread`, roomId),
|
||||
db.setObjectField(`uid:${uid}:chat:rooms:read`, roomId, Date.now()),
|
||||
@@ -64,6 +69,9 @@ module.exports = function (Messaging) {
|
||||
};
|
||||
|
||||
Messaging.markUnread = async (uids, roomId) => {
|
||||
// Remote users don't have (un)read states
|
||||
uids = uids.filter(uid => utils.isNumber(uid));
|
||||
|
||||
const exists = await Messaging.roomExists(roomId);
|
||||
if (!exists) {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user