src/services/messageService.js
//import showdown from 'showdown'
// Using matrixService from ditto in the meanwhile
import matrix from '../services/matrixService'
import Message from '../models/Message'
const debug = require('debug')('ditto:scenes:chat:message:messageService')
//const mdConverter = new showdown.Converter()
class MessageService {
constructor () {
this._messages = {}
}
//* *******************************************************************************
// Data
//* *******************************************************************************
cleanupRoomMessages (roomId, messageList) {
if (!this._messages[roomId]) return
for (const eventId of Object.keys(this._messages[roomId])) {
if (!messageList.includes(eventId)) delete this._messages[roomId][eventId]
}
}
getMessageById (eventId, roomId, event, pending = false) {
if (!this._messages[roomId]) this._messages[roomId] = {}
if (!this._messages[roomId][eventId]) {
if (eventId) {
this._messages[roomId][eventId] = new Message(eventId, roomId, event, pending)
}
}
return this._messages[roomId][eventId]
}
getMessageByRelationId (eventId, roomId) {
if (!this._messages[roomId]) return
for (const message of Object.values(this._messages[roomId])) {
// Look in reactions
const reactions = message.reactions$.getValue()
if (reactions) {
for (const userEvents of Object.values(reactions)) {
const reaction = Object.values(userEvents)
.find(event => event.eventId === eventId)
if (reaction) return message
}
}
}
}
// This is called the first time to get the last message from the database
getLastTextMessage(chatId) {
try{
let text_messages = []
Object.values(this._messages[chatId]).forEach(msg => {
if(msg.type === 'm.text')
text_messages.push(msg)
})
return text_messages[0].content$.getValue().text
} catch(e) {
return ""
}
}
subscribe (target) {
this._subscription = target
}
updateMessage (eventId, roomId) {
if (!this._messages[roomId] || !this._messages[roomId][eventId]) return
this._messages[roomId][eventId].update()
}
updateRoomMessages (roomId) {
if (!this._messages[roomId]) return
for (const message of Object.values(this._messages[roomId])) {
message.update()
}
}
//* *******************************************************************************
// Helpers
//* *******************************************************************************
async send (content, type, roomId) { // TODO: Cambiar esto por algo más simple (el type ya viene incluído en content)
try {
switch (type) {
// case 'm.text': {
// // NOTE: Showdown is not currently working
// const html = content//mdConverter.makeHtml(content)
// // If the message doesn't have markdown, don't send the html
// if (html !== '<p>' + content + '</p>') {
// return matrix.getClient().sendHtmlMessage(roomId, content, html)
// } else {
// return matrix.getClient().sendTextMessage(roomId, content)
// }
// }
// case 'm.image': {
// return matrix.getClient().sendImageMessage(
// roomId,
// content.url,
// {
// w: content.width,
// h: content.height,
// mimetype: content.type,
// size: content.fileSize
// },
// content.fileName
// )
// }
// case 'm.file':
// case 'm.poll':
// case 'm.sticker':
// case 'm.audio':
// case 'm.video':
// case 'm.location.live':
// case 'm.location':
// case 'm.emphasis':
//? case 'm.reply':
//? case 'mreaction':
// case 'm.meetme':
// case 'm.gif':
// case 'm.event':
default:
return matrix.getClient().sendMessage(roomId, content)
}
} catch (e) {
// console.log('Error sending message:', { roomId, type, content }, e)
return e
}
}
sortByLastSent (messages) {
const sorted = [...messages]
sorted.sort((a, b) => {
return a.timestamp < b.timestamp ? 1 : a.timestamp > b.timestamp ? -1 : 0
})
return sorted
}
}
const messageService = new MessageService()
export default messageService