Mercury-IM/domain/src/main/java/org/mercury_im/messenger/core/xmpp/XmppDirectMessageCenter.java

115 lines
4.7 KiB
Java
Raw Normal View History

2020-06-06 18:45:20 +02:00
package org.mercury_im.messenger.core.xmpp;
2019-11-16 09:58:00 +01:00
import org.jivesoftware.smack.XMPPConnection;
2019-11-16 09:58:00 +01:00
import org.jivesoftware.smack.chat2.Chat;
import org.jivesoftware.smack.chat2.ChatManager;
import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
2020-05-16 15:53:54 +02:00
import org.jivesoftware.smack.packet.MessageBuilder;
2019-11-16 09:58:00 +01:00
import org.jivesoftware.smackx.sid.element.OriginIdElement;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
2020-06-06 18:45:20 +02:00
import org.mercury_im.messenger.core.MessageCenter;
import org.mercury_im.messenger.core.Messenger;
import org.mercury_im.messenger.core.data.repository.AccountRepository;
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.core.data.repository.Repositories;
import org.mercury_im.messenger.entity.Account;
2019-12-09 15:49:59 +01:00
import org.mercury_im.messenger.entity.chat.DirectChat;
2019-11-18 23:51:27 +01:00
import org.mercury_im.messenger.entity.message.Message;
2020-06-06 18:45:20 +02:00
import org.mercury_im.messenger.core.listener.IncomingDirectMessageListener;
2019-11-16 09:58:00 +01:00
import java.util.LinkedHashSet;
import java.util.Set;
2019-12-02 02:31:32 +01:00
import javax.inject.Inject;
2019-11-16 09:58:00 +01:00
import io.reactivex.Completable;
2019-12-02 02:31:32 +01:00
import io.reactivex.disposables.CompositeDisposable;
2019-11-16 09:58:00 +01:00
public class XmppDirectMessageCenter
2019-12-02 02:31:32 +01:00
implements MessageCenter<DirectChat>, IncomingChatMessageListener {
2019-12-20 10:41:55 +01:00
private final PeerRepository peerRepository;
private final AccountRepository accountRepository;
private final DirectChatRepository directChatRepository;
private final MessageRepository messageRepository;
2019-11-16 09:58:00 +01:00
private final Messenger messenger;
private final Account account;
2019-12-02 02:31:32 +01:00
private final CompositeDisposable disposable = new CompositeDisposable();
private Set<IncomingDirectMessageListener> messageListeners = new LinkedHashSet<>();
2019-12-02 02:31:32 +01:00
@Inject
2019-12-20 10:41:55 +01:00
public XmppDirectMessageCenter(Account account, Messenger messenger, Repositories repositories) {
this.messenger = messenger;
this.account = account;
2019-12-20 10:41:55 +01:00
this.peerRepository = repositories.getPeerRepository();
this.accountRepository = repositories.getAccountRepository();
this.directChatRepository = repositories.getDirectChatRepository();
this.messageRepository = repositories.getMessageRepository();
2019-12-02 02:31:32 +01:00
XMPPConnection connection = getMessenger().getConnectionManager().getConnection(account).getConnection();
2019-12-02 02:31:32 +01:00
ChatManager.getInstanceFor(connection).addIncomingListener(this);
}
@Override
public Messenger getMessenger() {
return messenger;
}
2019-11-16 09:58:00 +01:00
@Override
public Completable sendMessage(Message message, DirectChat chat) {
2019-11-16 09:58:00 +01:00
ChatManager chatManager = getChatManager(chat);
EntityBareJid accountAddress =
JidCreate.entityBareFromOrThrowUnchecked(chat.getAccount().getAddress());
EntityBareJid peerAddress =
JidCreate.entityBareFromOrThrowUnchecked(chat.getPeer().getAddress());
2020-05-16 15:53:54 +02:00
MessageBuilder messageBuilder = MessageBuilder.buildMessage()
.from(accountAddress)
.to(peerAddress)
.ofType(org.jivesoftware.smack.packet.Message.Type.chat);
2019-11-16 09:58:00 +01:00
2020-05-27 22:34:27 +02:00
String originId = OriginIdElement.addTo(messageBuilder).getId();
2020-05-16 15:53:54 +02:00
String legacyStanzaId = messageBuilder.getStanzaId();
message.setLegacyStanzaId(legacyStanzaId);
message.setOriginId(originId);
2019-11-16 09:58:00 +01:00
Chat smackChat = chatManager.chatWith(peerAddress);
2019-12-20 10:41:55 +01:00
return messageRepository.insertMessage(chat, message)
.ignoreElement()
2020-05-16 15:53:54 +02:00
.andThen(Completable.fromAction(() -> smackChat.send(messageBuilder.build())));
2019-11-16 09:58:00 +01:00
}
@Override
public void addIncomingMessageListener(IncomingDirectMessageListener listener) {
messageListeners.add(listener);
2019-11-16 09:58:00 +01:00
}
protected ChatManager getChatManager(DirectChat chat) {
MercuryConnection mercuryConnection = getMessenger().getConnectionManager().getConnection(chat.getAccount());
return ChatManager.getInstanceFor(mercuryConnection.getConnection());
2019-11-16 09:58:00 +01:00
}
2019-12-02 02:31:32 +01:00
@Override
public void newIncomingMessage(EntityBareJid from, org.jivesoftware.smack.packet.Message message, Chat chat) {
disposable.add(peerRepository
// get peer
2020-07-13 18:49:29 +02:00
.getOrCreatePeer(account, from)
2019-12-02 02:31:32 +01:00
// get chat
2020-07-13 18:49:29 +02:00
.flatMap(directChatRepository::getOrCreateChatWithPeer)
2019-12-02 02:31:32 +01:00
// notify listeners
.subscribe(chatEntity -> {
for (IncomingDirectMessageListener listener : messageListeners) {
2020-05-16 15:53:54 +02:00
listener.onIncomingDirectMessage(account, chatEntity, new Message());
2019-12-02 02:31:32 +01:00
}
}));
}
2019-11-16 09:58:00 +01:00
}