mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-02-27 17:11:14 +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) {
|
function addKickHandler(roomId, modal) {
|
||||||
modal.on('click', '[data-action="kick"]', function () {
|
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) => {
|
api.del(`/chats/${roomId}/users/${uid}`, {}).then((body) => {
|
||||||
refreshParticipantsList(roomId, modal, body);
|
refreshParticipantsList(roomId, modal, body);
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ module.exports = function (Messaging) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await sendNotification(fromUid, roomId, messageObj);
|
await sendNotification(fromUid, roomId, messageObj);
|
||||||
|
// await federate(fromUid, roomId, messageObj);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`);
|
winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`);
|
||||||
}
|
}
|
||||||
@@ -98,7 +99,8 @@ module.exports = function (Messaging) {
|
|||||||
const { ALLMESSAGES } = Messaging.notificationSettings;
|
const { ALLMESSAGES } = Messaging.notificationSettings;
|
||||||
await batch.processSortedSet(`chat:room:${roomId}:uids:online`, async (uids) => {
|
await batch.processSortedSet(`chat:room:${roomId}:uids:online`, async (uids) => {
|
||||||
uids = uids.filter(
|
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) &&
|
fromUid !== parseInt(uid, 10) &&
|
||||||
!realtimeUids.includes(parseInt(uid, 10))
|
!realtimeUids.includes(parseInt(uid, 10))
|
||||||
);
|
);
|
||||||
@@ -140,4 +142,7 @@ module.exports = function (Messaging) {
|
|||||||
await notifications.push(notification, uidsToNotify);
|
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 io = require('../socket.io');
|
||||||
const cache = require('../cache');
|
const cache = require('../cache');
|
||||||
const cacheCreate = require('../cacheCreate');
|
const cacheCreate = require('../cacheCreate');
|
||||||
|
const utils = require('../utils');
|
||||||
|
|
||||||
const roomUidCache = cacheCreate({
|
const roomUidCache = cacheCreate({
|
||||||
name: 'chat:room:uids',
|
name: 'chat:room:uids',
|
||||||
@@ -259,6 +260,13 @@ module.exports = function (Messaging) {
|
|||||||
|
|
||||||
Messaging.addUsersToRoom = async function (uid, uids, roomId) {
|
Messaging.addUsersToRoom = async function (uid, uids, roomId) {
|
||||||
uids = _.uniq(uids);
|
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 inRoom = await Messaging.isUserInRoom(uid, roomId);
|
||||||
const payload = await plugins.hooks.fire('filter:messaging.addUsersToRoom', { uid, uids, roomId, inRoom });
|
const payload = await plugins.hooks.fire('filter:messaging.addUsersToRoom', { uid, uids, roomId, inRoom });
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const db = require('../database');
|
const db = require('../database');
|
||||||
|
const utils = require('../utils');
|
||||||
const io = require('../socket.io');
|
const io = require('../socket.io');
|
||||||
|
|
||||||
module.exports = function (Messaging) {
|
module.exports = function (Messaging) {
|
||||||
@@ -26,6 +27,10 @@ module.exports = function (Messaging) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Messaging.markRead = async (uid, roomId) => {
|
Messaging.markRead = async (uid, roomId) => {
|
||||||
|
if (!utils.isNumber(uid)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
db.sortedSetRemove(`uid:${uid}:chat:rooms:unread`, roomId),
|
db.sortedSetRemove(`uid:${uid}:chat:rooms:unread`, roomId),
|
||||||
db.setObjectField(`uid:${uid}:chat:rooms:read`, roomId, Date.now()),
|
db.setObjectField(`uid:${uid}:chat:rooms:read`, roomId, Date.now()),
|
||||||
@@ -64,6 +69,9 @@ module.exports = function (Messaging) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Messaging.markUnread = async (uids, roomId) => {
|
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);
|
const exists = await Messaging.roomExists(roomId);
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user