You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.0 KiB
JavaScript
102 lines
3.0 KiB
JavaScript
'use strict';
|
|
|
|
const meta = require('../meta');
|
|
const plugins = require('../plugins');
|
|
const db = require('../database');
|
|
const user = require('../user');
|
|
|
|
module.exports = function (Messaging) {
|
|
Messaging.sendMessage = async (data) => {
|
|
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);
|
|
};
|
|
|
|
Messaging.checkContent = async (content) => {
|
|
if (!content) {
|
|
throw new Error('[[error:invalid-chat-message]]');
|
|
}
|
|
|
|
const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000;
|
|
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 + ']]');
|
|
}
|
|
};
|
|
|
|
Messaging.addMessage = async (data) => {
|
|
const mid = await db.incrObjectField('global', 'nextMid');
|
|
const timestamp = data.timestamp || Date.now();
|
|
let message = {
|
|
content: String(data.content),
|
|
timestamp: timestamp,
|
|
fromuid: data.uid,
|
|
roomId: data.roomId,
|
|
deleted: 0,
|
|
system: data.system || 0,
|
|
};
|
|
|
|
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.filter(uid => uid !== String(data.uid)), data.roomId),
|
|
]);
|
|
|
|
const messages = 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;
|
|
plugins.fireHook('action:messaging.save', { message: messages[0], data: data });
|
|
return messages[0];
|
|
};
|
|
|
|
Messaging.addSystemMessage = async (content, uid, roomId) => {
|
|
const message = await Messaging.addMessage({
|
|
content: content,
|
|
uid: uid,
|
|
roomId: roomId,
|
|
system: 1,
|
|
});
|
|
Messaging.notifyUsersInRoom(uid, roomId, message);
|
|
};
|
|
|
|
Messaging.addRoomToUsers = async (roomId, uids, timestamp) => {
|
|
if (!uids.length) {
|
|
return;
|
|
}
|
|
|
|
const keys = uids.map(uid => 'uid:' + uid + ':chat:rooms');
|
|
await db.sortedSetsAdd(keys, timestamp, roomId);
|
|
};
|
|
|
|
Messaging.addMessageToUsers = async (roomId, uids, mid, timestamp) => {
|
|
if (!uids.length) {
|
|
return;
|
|
}
|
|
const keys = uids.map(uid => 'uid:' + uid + ':chat:room:' + roomId + ':mids');
|
|
await db.sortedSetsAdd(keys, timestamp, mid);
|
|
};
|
|
};
|