Mercury-IM/domain/src/main/java/org/mercury_im/messenger/core/store/message/MercuryMessageStore.java

110 lines
5.0 KiB
Java
Raw Normal View History

2020-06-09 21:52:53 +02:00
package org.mercury_im.messenger.core.store.message;
import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
import org.jivesoftware.smack.chat2.OutgoingChatMessageListener;
import org.jivesoftware.smack.packet.MessageBuilder;
import org.jivesoftware.smackx.delay.packet.DelayInformation;
import org.jivesoftware.smackx.eme.element.ExplicitMessageEncryptionElement;
2020-06-24 22:50:26 +02:00
import org.jivesoftware.smackx.ox.OpenPgpContact;
import org.jivesoftware.smackx.ox.element.SigncryptElement;
import org.jivesoftware.smackx.ox_im.OxMessageListener;
import org.jxmpp.jid.EntityBareJid;
2020-06-09 21:52:53 +02:00
import org.mercury_im.messenger.core.SchedulersFacade;
2020-06-06 18:45:20 +02:00
import org.mercury_im.messenger.core.data.repository.DirectChatRepository;
import org.mercury_im.messenger.core.data.repository.MessageRepository;
import org.mercury_im.messenger.core.data.repository.PeerRepository;
import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.entity.message.Message;
import org.mercury_im.messenger.entity.message.MessageDirection;
2020-06-24 22:50:26 +02:00
import org.pgpainless.decryption_verification.OpenPgpMetadata;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
2020-06-09 21:52:53 +02:00
import javax.inject.Inject;
import javax.inject.Singleton;
import io.reactivex.disposables.CompositeDisposable;
2020-06-09 21:52:53 +02:00
import io.reactivex.disposables.Disposable;
2020-06-09 21:52:53 +02:00
@Singleton
public class MercuryMessageStore implements IncomingChatMessageListener, OxMessageListener {
private static final Logger LOGGER = Logger.getLogger(MercuryMessageStore.class.getName());
private final MessageRepository messageRepository;
private final DirectChatRepository directChatRepository;
private final PeerRepository peerRepository;
2020-06-09 21:52:53 +02:00
private final SchedulersFacade schedulers;
private Account account;
private CompositeDisposable disposable = new CompositeDisposable();
2020-06-09 21:52:53 +02:00
@Inject
public MercuryMessageStore(Account account,
PeerRepository peerRepository,
DirectChatRepository directChatRepository,
2020-06-09 21:52:53 +02:00
MessageRepository messageRepository,
SchedulersFacade schedulers) {
this.account = account;
this.peerRepository = peerRepository;
this.directChatRepository = directChatRepository;
this.messageRepository = messageRepository;
2020-06-09 21:52:53 +02:00
this.schedulers = schedulers;
}
@Override
public void newIncomingMessage(EntityBareJid from,
org.jivesoftware.smack.packet.Message smackMessage,
org.jivesoftware.smack.chat2.Chat smackChat) {
if (ExplicitMessageEncryptionElement.from(smackMessage) != null) {
return;
}
Message message = new Message();
message.setDirection(MessageDirection.incoming);
DelayInformation delayInformation = DelayInformation.from(smackMessage);
message.setTimestamp(delayInformation != null ? delayInformation.getStamp() : new Date());
message.setSender(from);
message.setRecipient(smackMessage.getTo().asEntityJidOrThrow());
2020-07-13 01:39:26 +02:00
message.setXml(smackMessage.toXML().toString());
if (smackMessage.getBody() != null) {
message.setBody(smackMessage.getBody());
}
2020-07-13 18:49:29 +02:00
disposable.add(writeMessageToStore(from, message));
}
2020-07-13 18:49:29 +02:00
private Disposable writeMessageToStore(EntityBareJid peer, Message message) {
2020-06-09 21:52:53 +02:00
return peerRepository.getOrCreatePeer(account, peer)
.flatMap(directChatRepository::getOrCreateChatWithPeer)
2020-07-18 21:38:13 +02:00
.map(chat -> {
message.setChatId(chat.getId());
return chat;
})
.flatMap(chat -> messageRepository.insertMessage(message))
2020-06-09 21:52:53 +02:00
.subscribeOn(schedulers.getIoScheduler())
.subscribe(m -> LOGGER.log(Level.INFO, "Message written"), e -> LOGGER.log(Level.SEVERE, "Error: ", e));
}
2020-06-24 22:50:26 +02:00
@Override
public void newIncomingOxMessage(OpenPgpContact contact,
org.jivesoftware.smack.packet.Message smackMessage,
SigncryptElement decryptedPayload,
OpenPgpMetadata metadata) {
Message message = new Message();
message.setDirection(MessageDirection.incoming);
DelayInformation delayInformation = DelayInformation.from(smackMessage);
message.setTimestamp(delayInformation != null ? delayInformation.getStamp() : new Date());
message.setSender(contact.getJid().asEntityJidOrThrow());
message.setRecipient(smackMessage.getTo().asEntityJidOrThrow());
2020-07-13 01:39:26 +02:00
message.setXml(smackMessage.toXML().toString());
2020-06-24 22:50:26 +02:00
org.jivesoftware.smack.packet.Message.Body body = decryptedPayload.getExtension(org.jivesoftware.smack.packet.Message.Body.ELEMENT,
org.jivesoftware.smack.packet.Message.Body.NAMESPACE);
if (body != null) {
message.setBody(body.getMessage());
}
2020-07-13 18:49:29 +02:00
disposable.add(writeMessageToStore(contact.getJid().asEntityBareJidOrThrow(), message));
2020-06-24 22:50:26 +02:00
}
}