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

120 lines
4.8 KiB
Java
Raw Normal View History

package org.mercury_im.messenger.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;
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;
2019-12-09 15:49:59 +01:00
import org.mercury_im.messenger.MessageCenter;
2019-11-18 23:51:27 +01:00
import org.mercury_im.messenger.Messenger;
2019-12-02 02:31:32 +01:00
import org.mercury_im.messenger.data.repository.AccountRepository;
import org.mercury_im.messenger.data.repository.DirectChatRepository;
2019-12-20 10:41:55 +01:00
import org.mercury_im.messenger.data.repository.MessageRepository;
2019-12-02 02:31:32 +01:00
import org.mercury_im.messenger.data.repository.PeerRepository;
2019-12-20 10:41:55 +01:00
import org.mercury_im.messenger.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-12-02 02:31:32 +01:00
import org.mercury_im.messenger.entity.message.IMessage;
2019-12-20 10:41:55 +01:00
import org.mercury_im.messenger.entity.message.IMessageMetadata;
2019-11-18 23:51:27 +01:00
import org.mercury_im.messenger.entity.message.Message;
import org.mercury_im.messenger.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().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());
org.jivesoftware.smack.packet.Message smackMessage = new org.jivesoftware.smack.packet.Message();
smackMessage.setFrom(accountAddress);
smackMessage.setTo(peerAddress);
smackMessage.setType(org.jivesoftware.smack.packet.Message.Type.chat);
2019-11-16 09:58:00 +01:00
2019-12-20 10:41:55 +01:00
String originId = OriginIdElement.addOriginId(smackMessage).getId();
String legacyStanzaId = smackMessage.getStanzaId();
IMessageMetadata metadata = new IMessageMetadata();
metadata.setLegacyStanzaId(legacyStanzaId);
metadata.setOriginId(originId);
2019-11-16 09:58:00 +01:00
2019-12-20 10:41:55 +01:00
message.setMetadata(metadata);
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()
.andThen(Completable.fromAction(() -> smackChat.send(smackMessage)));
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().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
.getOrCreatePeer(account, from.asEntityBareJidString())
// get chat
.flatMap(peer -> directChatRepository.getOrCreateChatWithPeer(peer))
// notify listeners
.subscribe(chatEntity -> {
for (IncomingDirectMessageListener listener : messageListeners) {
listener.onIncomingDirectMessage(account, chatEntity, new IMessage());
}
}));
}
2019-11-16 09:58:00 +01:00
}