2015-12-15 14:10:32 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
2020-01-23 22:19:15 -05:00
|
|
|
const meta = require('../meta');
|
|
|
|
|
const plugins = require('../plugins');
|
|
|
|
|
const db = require('../database');
|
|
|
|
|
const user = require('../user');
|
2015-12-15 14:10:32 +02:00
|
|
|
|
2016-10-13 11:43:39 +02:00
|
|
|
module.exports = function (Messaging) {
|
2019-08-13 14:36:15 -04:00
|
|
|
Messaging.sendMessage = async (data) => {
|
2019-07-22 11:18:13 -04:00
|
|
|
await Messaging.checkContent(data.content);
|
|
|
|
|
const inRoom = await Messaging.isUserInRoom(data.uid, data.roomId);
|
|
|
|
|
if (!inRoom) {
|
|
|
|
|
throw new Error('[[error:not-allowed]]');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return await Messaging.addMessage(data);
|
2015-12-15 14:10:32 +02:00
|
|
|
};
|
|
|
|
|
|
2019-08-13 14:36:15 -04:00
|
|
|
Messaging.checkContent = async (content) => {
|
2015-12-15 14:10:32 +02:00
|
|
|
if (!content) {
|
2019-07-22 11:18:13 -04:00
|
|
|
throw new Error('[[error:invalid-chat-message]]');
|
2015-12-15 14:10:32 +02:00
|
|
|
}
|
|
|
|
|
|
2020-01-23 22:19:15 -05:00
|
|
|
const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000;
|
2019-07-22 11:18:13 -04:00
|
|
|
const data = await plugins.fireHook('filter:messaging.checkContent', { content: content });
|
|
|
|
|
content = String(data.content).trim();
|
|
|
|
|
if (!content) {
|
|
|
|
|
throw new Error('[[error:invalid-chat-message]]');
|
|
|
|
|
}
|
|
|
|
|
if (content.length > maximumChatMessageLength) {
|
|
|
|
|
throw new Error('[[error:chat-message-too-long, ' + maximumChatMessageLength + ']]');
|
|
|
|
|
}
|
2015-12-15 14:10:32 +02:00
|
|
|
};
|
|
|
|
|
|
2019-08-13 14:36:15 -04:00
|
|
|
Messaging.addMessage = async (data) => {
|
2019-07-22 11:18:13 -04:00
|
|
|
const mid = await db.incrObjectField('global', 'nextMid');
|
2019-10-31 12:54:03 -04:00
|
|
|
const timestamp = data.timestamp || Date.now();
|
2019-07-22 11:18:13 -04:00
|
|
|
let message = {
|
|
|
|
|
content: String(data.content),
|
|
|
|
|
timestamp: timestamp,
|
|
|
|
|
fromuid: data.uid,
|
|
|
|
|
roomId: data.roomId,
|
|
|
|
|
deleted: 0,
|
|
|
|
|
system: data.system || 0,
|
|
|
|
|
};
|
2015-12-16 15:09:14 +02:00
|
|
|
|
2019-07-22 11:18:13 -04:00
|
|
|
if (data.ip) {
|
|
|
|
|
message.ip = data.ip;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
message = await plugins.fireHook('filter:messaging.save', message);
|
|
|
|
|
await db.setObject('message:' + mid, message);
|
|
|
|
|
const isNewSet = await Messaging.isNewSet(data.uid, data.roomId, timestamp);
|
|
|
|
|
let uids = await db.getSortedSetRange('chat:room:' + data.roomId + ':uids', 0, -1);
|
|
|
|
|
uids = await user.blocks.filterUids(data.uid, uids);
|
|
|
|
|
|
|
|
|
|
await Promise.all([
|
|
|
|
|
Messaging.addRoomToUsers(data.roomId, uids, timestamp),
|
|
|
|
|
Messaging.addMessageToUsers(data.roomId, uids, mid, timestamp),
|
|
|
|
|
Messaging.markUnread(uids, data.roomId),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const [, messages] = await Promise.all([
|
|
|
|
|
await Messaging.markRead(data.uid, data.roomId),
|
|
|
|
|
await Messaging.getMessagesData([mid], data.uid, data.roomId, true),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if (!messages || !messages[0]) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
messages[0].newSet = isNewSet;
|
|
|
|
|
messages[0].mid = mid;
|
|
|
|
|
messages[0].roomId = data.roomId;
|
2019-10-31 12:54:03 -04:00
|
|
|
plugins.fireHook('action:messaging.save', { message: messages[0], data: data });
|
2019-07-22 11:18:13 -04:00
|
|
|
return messages[0];
|
2015-12-15 14:10:32 +02:00
|
|
|
};
|
|
|
|
|
|
2019-07-19 12:20:11 -04:00
|
|
|
Messaging.addSystemMessage = async (content, uid, roomId) => {
|
|
|
|
|
const message = await Messaging.addMessage({
|
|
|
|
|
content: content,
|
|
|
|
|
uid: uid,
|
|
|
|
|
roomId: roomId,
|
|
|
|
|
system: 1,
|
|
|
|
|
});
|
|
|
|
|
Messaging.notifyUsersInRoom(uid, roomId, message);
|
|
|
|
|
};
|
|
|
|
|
|
2019-07-22 11:18:13 -04:00
|
|
|
Messaging.addRoomToUsers = async (roomId, uids, timestamp) => {
|
2015-12-15 14:10:32 +02:00
|
|
|
if (!uids.length) {
|
2019-07-22 11:18:13 -04:00
|
|
|
return;
|
2015-12-15 14:10:32 +02:00
|
|
|
}
|
2019-07-22 11:18:13 -04:00
|
|
|
|
2018-11-17 22:31:39 -05:00
|
|
|
const keys = uids.map(uid => 'uid:' + uid + ':chat:rooms');
|
2019-07-22 11:18:13 -04:00
|
|
|
await db.sortedSetsAdd(keys, timestamp, roomId);
|
2015-12-15 14:10:32 +02:00
|
|
|
};
|
|
|
|
|
|
2019-07-22 11:18:13 -04:00
|
|
|
Messaging.addMessageToUsers = async (roomId, uids, mid, timestamp) => {
|
2015-12-15 14:10:32 +02:00
|
|
|
if (!uids.length) {
|
2019-07-22 11:18:13 -04:00
|
|
|
return;
|
2015-12-15 14:10:32 +02:00
|
|
|
}
|
2018-11-17 22:31:39 -05:00
|
|
|
const keys = uids.map(uid => 'uid:' + uid + ':chat:room:' + roomId + ':mids');
|
2019-07-22 11:18:13 -04:00
|
|
|
await db.sortedSetsAdd(keys, timestamp, mid);
|
2015-12-15 14:10:32 +02:00
|
|
|
};
|
2017-02-18 02:30:48 -07:00
|
|
|
};
|