mirror of
https://codeberg.org/Mercury-IM/Mercury-IM
synced 2024-06-15 08:04:52 +02:00
Small changes and experiments
This commit is contained in:
parent
f42fbda9d5
commit
c5bf492cda
|
@ -1,15 +1,31 @@
|
||||||
package org.mercury_im.messenger;
|
package org.mercury_im.messenger;
|
||||||
|
|
||||||
|
import org.mercury_im.messenger.data.repository.AccountRepository;
|
||||||
|
import org.mercury_im.messenger.data.repository.PeerRepository;
|
||||||
|
import org.mercury_im.messenger.entity.contact.Peer;
|
||||||
import org.mercury_im.messenger.transport.connection.ConnectionMethod;
|
import org.mercury_im.messenger.transport.connection.ConnectionMethod;
|
||||||
import org.mercury_im.messenger.entity.Account;
|
import org.mercury_im.messenger.entity.Account;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class Messenger {
|
public class Messenger {
|
||||||
|
|
||||||
private final Map<Long, ConnectionMethod> connections = new HashMap<>();
|
private final Map<Long, ConnectionMethod> connections = new HashMap<>();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
AccountRepository accountRepository;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
PeerRepository peerRepository;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public Messenger() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void addConnection(ConnectionMethod connection) {
|
public void addConnection(ConnectionMethod connection) {
|
||||||
connections.put(connection.getAccount().getId(), connection);
|
connections.put(connection.getAccount().getId(), connection);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package org.mercury_im.messenger.data.repository;
|
package org.mercury_im.messenger.data.repository;
|
||||||
|
|
||||||
|
import org.mercury_im.messenger.data.util.Optional;
|
||||||
import org.mercury_im.messenger.entity.chat.DirectChat;
|
import org.mercury_im.messenger.entity.chat.DirectChat;
|
||||||
import org.mercury_im.messenger.entity.contact.Peer;
|
import org.mercury_im.messenger.entity.contact.Peer;
|
||||||
import org.mercury_im.messenger.entity.message.Message;
|
import org.mercury_im.messenger.entity.message.Message;
|
||||||
import org.mercury_im.messenger.data.util.Optional;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@ public interface DirectChatRepository {
|
||||||
|
|
||||||
Maybe<DirectChat> getDirectChat(long chatId);
|
Maybe<DirectChat> getDirectChat(long chatId);
|
||||||
|
|
||||||
|
Single<DirectChat> getOrCreateChatWithPeer(Peer peer);
|
||||||
|
|
||||||
Observable<Optional<DirectChat>> observeDirectChatByPeer(Peer peer);
|
Observable<Optional<DirectChat>> observeDirectChatByPeer(Peer peer);
|
||||||
|
|
||||||
Maybe<DirectChat> getDirectChatByPeer(Peer peer);
|
Maybe<DirectChat> getDirectChatByPeer(Peer peer);
|
||||||
|
|
|
@ -8,8 +8,12 @@ import org.jivesoftware.smackx.sid.element.OriginIdElement;
|
||||||
import org.jxmpp.jid.EntityBareJid;
|
import org.jxmpp.jid.EntityBareJid;
|
||||||
import org.jxmpp.jid.impl.JidCreate;
|
import org.jxmpp.jid.impl.JidCreate;
|
||||||
import org.mercury_im.messenger.Messenger;
|
import org.mercury_im.messenger.Messenger;
|
||||||
|
import org.mercury_im.messenger.data.repository.AccountRepository;
|
||||||
|
import org.mercury_im.messenger.data.repository.DirectChatRepository;
|
||||||
|
import org.mercury_im.messenger.data.repository.PeerRepository;
|
||||||
import org.mercury_im.messenger.entity.Account;
|
import org.mercury_im.messenger.entity.Account;
|
||||||
import org.mercury_im.messenger.entity.contact.Peer;
|
import org.mercury_im.messenger.entity.contact.Peer;
|
||||||
|
import org.mercury_im.messenger.entity.message.IMessage;
|
||||||
import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener;
|
import org.mercury_im.messenger.transport.listener.IncomingDirectMessageListener;
|
||||||
import org.mercury_im.messenger.entity.message.Message;
|
import org.mercury_im.messenger.entity.message.Message;
|
||||||
import org.mercury_im.messenger.MessageCenter;
|
import org.mercury_im.messenger.MessageCenter;
|
||||||
|
@ -22,23 +26,41 @@ import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import io.reactivex.Completable;
|
import io.reactivex.Completable;
|
||||||
|
import io.reactivex.disposables.CompositeDisposable;
|
||||||
|
import io.reactivex.disposables.Disposable;
|
||||||
import sun.reflect.generics.tree.Tree;
|
import sun.reflect.generics.tree.Tree;
|
||||||
|
|
||||||
public class XmppDirectMessageCenter
|
public class XmppDirectMessageCenter
|
||||||
implements MessageCenter<DirectChat> {
|
implements MessageCenter<DirectChat>, IncomingChatMessageListener {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
PeerRepository peerRepository;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
AccountRepository accountRepository;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
DirectChatRepository directChatRepository;
|
||||||
|
|
||||||
private final Messenger messenger;
|
private final Messenger messenger;
|
||||||
private final Account account;
|
private final Account account;
|
||||||
|
|
||||||
|
private final CompositeDisposable disposable = new CompositeDisposable();
|
||||||
|
|
||||||
private Set<IncomingDirectMessageListener> messageListeners = new LinkedHashSet<>();
|
private Set<IncomingDirectMessageListener> messageListeners = new LinkedHashSet<>();
|
||||||
|
|
||||||
|
@Inject
|
||||||
public XmppDirectMessageCenter(Account account, Messenger messenger) {
|
public XmppDirectMessageCenter(Account account, Messenger messenger) {
|
||||||
this.messenger = messenger;
|
this.messenger = messenger;
|
||||||
this.account = account;
|
this.account = account;
|
||||||
|
|
||||||
XMPPConnection connection = ((XmppTcpConnectionMethod) getMessenger()
|
XMPPConnection connection = ((XmppTcpConnectionMethod) getMessenger()
|
||||||
.getConnection(account)).getConnection();
|
.getConnection(account)).getConnection();
|
||||||
|
|
||||||
|
ChatManager.getInstanceFor(connection).addIncomingListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -77,4 +99,19 @@ public class XmppDirectMessageCenter
|
||||||
XmppTcpConnectionMethod connectionMethod = (XmppTcpConnectionMethod) getMessenger().getConnection(chat.getAccount());
|
XmppTcpConnectionMethod connectionMethod = (XmppTcpConnectionMethod) getMessenger().getConnection(chat.getAccount());
|
||||||
return ChatManager.getInstanceFor(connectionMethod.getConnection());
|
return ChatManager.getInstanceFor(connectionMethod.getConnection());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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());
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue