look up sender in group chats
This commit is contained in:
parent
d9e8918727
commit
ee1c938f2a
|
@ -13,6 +13,7 @@ import im.conversations.android.database.model.PresenceType;
|
||||||
import im.conversations.android.xmpp.model.muc.user.MucUser;
|
import im.conversations.android.xmpp.model.muc.user.MucUser;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import org.jxmpp.jid.BareJid;
|
import org.jxmpp.jid.BareJid;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
import org.jxmpp.jid.parts.Resourcepart;
|
import org.jxmpp.jid.parts.Resourcepart;
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
|
@ -66,4 +67,27 @@ public abstract class PresenceDao {
|
||||||
mucUser);
|
mucUser);
|
||||||
insert(entity);
|
insert(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Query(
|
||||||
|
"SELECT mucUserJid FROM presence WHERE accountId=:account AND address=:address AND"
|
||||||
|
+ " occupantId=:occupantId")
|
||||||
|
protected abstract Jid getMucUserJidByOccupantId(
|
||||||
|
long account, BareJid address, String occupantId);
|
||||||
|
|
||||||
|
@Query(
|
||||||
|
"SELECT mucUserJid FROM presence WHERE accountId=:account AND address=:address AND"
|
||||||
|
+ " resource=:resource")
|
||||||
|
protected abstract Jid getMucUserJidByResource(
|
||||||
|
long account, BareJid address, Resourcepart resource);
|
||||||
|
|
||||||
|
public BareJid getMucUserJidByOccupantId(Account account, BareJid address, String occupantId) {
|
||||||
|
final var jid = getMucUserJidByOccupantId(account.id, address, occupantId);
|
||||||
|
return jid == null ? null : jid.asBareJid();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BareJid getMucUserJidByResource(
|
||||||
|
final Account account, final BareJid address, final Resourcepart resource) {
|
||||||
|
final var jid = getMucUserJidByResource(account.id, address, resource);
|
||||||
|
return jid == null ? null : jid.asBareJid();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +1,49 @@
|
||||||
package im.conversations.android.transformer;
|
package im.conversations.android.transformer;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
import im.conversations.android.database.model.StanzaId;
|
import im.conversations.android.database.model.StanzaId;
|
||||||
import im.conversations.android.xml.Namespace;
|
import im.conversations.android.xml.Namespace;
|
||||||
import im.conversations.android.xmpp.Entity;
|
import im.conversations.android.xmpp.Entity;
|
||||||
import im.conversations.android.xmpp.XmppConnection;
|
import im.conversations.android.xmpp.XmppConnection;
|
||||||
import im.conversations.android.xmpp.manager.DiscoManager;
|
import im.conversations.android.xmpp.manager.DiscoManager;
|
||||||
|
import im.conversations.android.xmpp.model.Extension;
|
||||||
|
import im.conversations.android.xmpp.model.muc.user.MucUser;
|
||||||
import im.conversations.android.xmpp.model.occupant.OccupantId;
|
import im.conversations.android.xmpp.model.occupant.OccupantId;
|
||||||
import im.conversations.android.xmpp.model.stanza.Message;
|
import im.conversations.android.xmpp.model.stanza.Message;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.List;
|
||||||
import org.jxmpp.jid.BareJid;
|
import org.jxmpp.jid.BareJid;
|
||||||
import org.jxmpp.jid.Jid;
|
import org.jxmpp.jid.Jid;
|
||||||
|
|
||||||
public class TransformationFactory extends XmppConnection.Delegate {
|
public class TransformationFactory extends XmppConnection.Delegate {
|
||||||
|
|
||||||
public TransformationFactory(Context context, XmppConnection connection) {
|
private final Mode mode;
|
||||||
|
|
||||||
|
public TransformationFactory(Context context, XmppConnection connection, final Mode mode) {
|
||||||
super(context, connection);
|
super(context, connection);
|
||||||
|
this.mode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MessageTransformation create(final Message message, final StanzaId stanzaId) {
|
public MessageTransformation create(final Message message, final StanzaId stanzaId) {
|
||||||
return create(message, stanzaId == null ? null : stanzaId.id, Instant.now());
|
Preconditions.checkState(
|
||||||
|
mode == Mode.LIVE,
|
||||||
|
"Creating a MessageTransformation with automatic timestamp is only allowed in live"
|
||||||
|
+ " mode");
|
||||||
|
return create(message, stanzaId == null ? null : stanzaId.id, Instant.now(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MessageTransformation create(
|
public MessageTransformation create(
|
||||||
final Message message, final String stanzaId, final Instant receivedAt) {
|
final Message message,
|
||||||
|
final String stanzaId,
|
||||||
|
final Instant receivedAt,
|
||||||
|
final List<Extension> privilegedExtensions) {
|
||||||
|
if (privilegedExtensions != null) {
|
||||||
|
Preconditions.checkArgument(
|
||||||
|
this.mode == Mode.ARCHIVE,
|
||||||
|
"Privileged extensions can only supplied in archive mode");
|
||||||
|
}
|
||||||
final var boundAddress = connection.getBoundAddress().asBareJid();
|
final var boundAddress = connection.getBoundAddress().asBareJid();
|
||||||
final var from = message.getFrom();
|
final var from = message.getFrom();
|
||||||
final var to = message.getTo();
|
final var to = message.getTo();
|
||||||
|
@ -48,11 +68,43 @@ public class TransformationFactory extends XmppConnection.Delegate {
|
||||||
}
|
}
|
||||||
final BareJid senderIdentity;
|
final BareJid senderIdentity;
|
||||||
if (message.getType() == Message.Type.GROUPCHAT) {
|
if (message.getType() == Message.Type.GROUPCHAT) {
|
||||||
senderIdentity = null; // TODO discover real jid
|
final var mucUser =
|
||||||
|
mode == Mode.ARCHIVE ? getExtension(privilegedExtensions, MucUser.class) : null;
|
||||||
|
final var mucUserItem = mucUser == null ? null : mucUser.getItem();
|
||||||
|
final Jid mucUserJid = mucUserItem == null ? null : mucUserItem.getJid();
|
||||||
|
if (mucUserJid != null) {
|
||||||
|
senderIdentity = mucUserJid.asBareJid();
|
||||||
|
} else if (occupantId != null) {
|
||||||
|
senderIdentity =
|
||||||
|
getDatabase()
|
||||||
|
.presenceDao()
|
||||||
|
.getMucUserJidByOccupantId(
|
||||||
|
getAccount(), from.asBareJid(), occupantId);
|
||||||
|
} else if (mode == Mode.LIVE && from != null && from.hasResource()) {
|
||||||
|
senderIdentity =
|
||||||
|
getDatabase()
|
||||||
|
.presenceDao()
|
||||||
|
.getMucUserJidByResource(
|
||||||
|
getAccount(), from.asBareJid(), from.getResourceOrThrow());
|
||||||
|
} else {
|
||||||
|
senderIdentity = null;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
senderIdentity = from == null ? boundAddress : from.asBareJid();
|
senderIdentity = from == null ? boundAddress : from.asBareJid();
|
||||||
}
|
}
|
||||||
return MessageTransformation.of(
|
return MessageTransformation.of(
|
||||||
message, receivedAt, remote, stanzaId, senderIdentity, occupantId);
|
message, receivedAt, remote, stanzaId, senderIdentity, occupantId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static <E extends Extension> E getExtension(
|
||||||
|
final List<Extension> extensions, final Class<E> clazz) {
|
||||||
|
final var extension =
|
||||||
|
extensions == null ? null : Iterables.find(extensions, clazz::isInstance, null);
|
||||||
|
return extension == null ? null : clazz.cast(extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Mode {
|
||||||
|
LIVE,
|
||||||
|
ARCHIVE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,13 +17,17 @@ import im.conversations.android.database.ConversationsDatabase;
|
||||||
import im.conversations.android.transformer.MessageTransformation;
|
import im.conversations.android.transformer.MessageTransformation;
|
||||||
import im.conversations.android.transformer.TransformationFactory;
|
import im.conversations.android.transformer.TransformationFactory;
|
||||||
import im.conversations.android.transformer.Transformer;
|
import im.conversations.android.transformer.Transformer;
|
||||||
|
import im.conversations.android.xml.Namespace;
|
||||||
|
import im.conversations.android.xmpp.Entity;
|
||||||
import im.conversations.android.xmpp.Page;
|
import im.conversations.android.xmpp.Page;
|
||||||
import im.conversations.android.xmpp.Range;
|
import im.conversations.android.xmpp.Range;
|
||||||
import im.conversations.android.xmpp.XmppConnection;
|
import im.conversations.android.xmpp.XmppConnection;
|
||||||
|
import im.conversations.android.xmpp.model.Extension;
|
||||||
import im.conversations.android.xmpp.model.delay.Delay;
|
import im.conversations.android.xmpp.model.delay.Delay;
|
||||||
import im.conversations.android.xmpp.model.mam.Fin;
|
import im.conversations.android.xmpp.model.mam.Fin;
|
||||||
import im.conversations.android.xmpp.model.mam.Query;
|
import im.conversations.android.xmpp.model.mam.Query;
|
||||||
import im.conversations.android.xmpp.model.mam.Result;
|
import im.conversations.android.xmpp.model.mam.Result;
|
||||||
|
import im.conversations.android.xmpp.model.muc.user.MucUser;
|
||||||
import im.conversations.android.xmpp.model.rsm.Set;
|
import im.conversations.android.xmpp.model.rsm.Set;
|
||||||
import im.conversations.android.xmpp.model.stanza.Iq;
|
import im.conversations.android.xmpp.model.stanza.Iq;
|
||||||
import im.conversations.android.xmpp.model.stanza.Message;
|
import im.conversations.android.xmpp.model.stanza.Message;
|
||||||
|
@ -47,7 +51,8 @@ public class ArchiveManager extends AbstractManager {
|
||||||
|
|
||||||
public ArchiveManager(Context context, XmppConnection connection) {
|
public ArchiveManager(Context context, XmppConnection connection) {
|
||||||
super(context, connection);
|
super(context, connection);
|
||||||
this.transformationFactory = new TransformationFactory(context, connection);
|
this.transformationFactory =
|
||||||
|
new TransformationFactory(context, connection, TransformationFactory.Mode.ARCHIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handle(final Message message) {
|
public void handle(final Message message) {
|
||||||
|
@ -78,8 +83,20 @@ public class ArchiveManager extends AbstractManager {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final ImmutableList.Builder<Extension> privilegedExtensionBuilder =
|
||||||
|
new ImmutableList.Builder<>();
|
||||||
|
if (forwardedMessage.getType() == Message.Type.GROUPCHAT) {
|
||||||
|
final var mucUser = forwardedMessage.getExtension(MucUser.class);
|
||||||
|
if (mucUser != null
|
||||||
|
&& getManager(DiscoManager.class)
|
||||||
|
.hasFeature(Entity.discoItem(archive), Namespace.MUC)) {
|
||||||
|
privilegedExtensionBuilder.add(mucUser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final var transformation =
|
final var transformation =
|
||||||
this.transformationFactory.create(forwardedMessage, stanzaId, receivedAt);
|
this.transformationFactory.create(
|
||||||
|
forwardedMessage, stanzaId, receivedAt, privilegedExtensionBuilder.build());
|
||||||
// TODO only when there is something to transform
|
// TODO only when there is something to transform
|
||||||
runningQuery.addTransformation(transformation);
|
runningQuery.addTransformation(transformation);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,8 @@ public class MessageProcessor extends XmppConnection.Delegate implements Consume
|
||||||
final Context context, final XmppConnection connection, final Level level) {
|
final Context context, final XmppConnection connection, final Level level) {
|
||||||
super(context, connection);
|
super(context, connection);
|
||||||
this.level = level;
|
this.level = level;
|
||||||
this.transformationFactory = new TransformationFactory(context, connection);
|
this.transformationFactory =
|
||||||
|
new TransformationFactory(context, connection, TransformationFactory.Mode.LIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue