diff --git a/nostr-java-api/pom.xml b/nostr-java-api/pom.xml index c324dde9f..21777ec5e 100644 --- a/nostr-java-api/pom.xml +++ b/nostr-java-api/pom.xml @@ -4,7 +4,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-api jar diff --git a/nostr-java-api/src/main/java/module-info.java b/nostr-java-api/src/main/java/module-info.java index 3290a781e..5238893c9 100644 --- a/nostr-java-api/src/main/java/module-info.java +++ b/nostr-java-api/src/main/java/module-info.java @@ -4,7 +4,6 @@ requires nostr.event; requires nostr.id; requires nostr.client; - requires nostr.context; requires nostr.encryption; requires nostr.encryption.nip04dm; requires nostr.encryption.nip44dm; diff --git a/nostr-java-api/src/main/java/nostr/api/NostrIF.java b/nostr-java-api/src/main/java/nostr/api/NostrIF.java index aecd93a6a..f297dfb21 100644 --- a/nostr-java-api/src/main/java/nostr/api/NostrIF.java +++ b/nostr-java-api/src/main/java/nostr/api/NostrIF.java @@ -3,8 +3,6 @@ import lombok.NonNull; import nostr.base.IEvent; import nostr.base.ISignable; -import nostr.context.RequestContext; -import nostr.event.BaseMessage; import nostr.event.filter.Filters; import nostr.event.impl.GenericEvent; import nostr.id.Identity; @@ -22,7 +20,6 @@ public interface NostrIF { List sendRequest(@NonNull Filters filters, @NonNull String subscriptionId, Map relays); List sendRequest(@NonNull List filtersList, @NonNull String subscriptionId); List sendRequest(@NonNull List filtersList, @NonNull String subscriptionId, Map relays); - List sendRequest(@NonNull BaseMessage message, @NonNull RequestContext context); NostrIF sign(@NonNull Identity identity, @NonNull ISignable signable); boolean verify(@NonNull GenericEvent event); Identity getSender(); diff --git a/nostr-java-api/src/main/java/nostr/api/NostrSpringWebSocketClient.java b/nostr-java-api/src/main/java/nostr/api/NostrSpringWebSocketClient.java index a2955c1d3..9cf09d1fc 100644 --- a/nostr-java-api/src/main/java/nostr/api/NostrSpringWebSocketClient.java +++ b/nostr-java-api/src/main/java/nostr/api/NostrSpringWebSocketClient.java @@ -5,9 +5,7 @@ import lombok.NonNull; import nostr.base.IEvent; import nostr.base.ISignable; -import nostr.context.RequestContext; import nostr.crypto.schnorr.Schnorr; -import nostr.event.BaseMessage; import nostr.event.filter.Filters; import nostr.event.impl.GenericEvent; import nostr.id.Identity; @@ -116,11 +114,6 @@ public List sendRequest(@NonNull Filters filters, @NonNull String subscr } - @Override - public List sendRequest(@NonNull BaseMessage message, @NonNull RequestContext context) { - return List.of(); - } - @Override public NostrIF sign(@NonNull Identity identity, @NonNull ISignable signable) { identity.sign(signable); diff --git a/nostr-java-base/pom.xml b/nostr-java-base/pom.xml index 7a1f2e4b6..acf2f5122 100644 --- a/nostr-java-base/pom.xml +++ b/nostr-java-base/pom.xml @@ -6,7 +6,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-base diff --git a/nostr-java-client/pom.xml b/nostr-java-client/pom.xml index 4aa6500ba..f2911d6ec 100644 --- a/nostr-java-client/pom.xml +++ b/nostr-java-client/pom.xml @@ -4,7 +4,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-client jar diff --git a/nostr-java-client/src/main/java/module-info.java b/nostr-java-client/src/main/java/module-info.java index ff959a1f2..f897a28f3 100644 --- a/nostr-java-client/src/main/java/module-info.java +++ b/nostr-java-client/src/main/java/module-info.java @@ -4,7 +4,6 @@ requires java.logging; requires nostr.util; requires nostr.base; - requires nostr.context; requires com.fasterxml.jackson.core; requires reactor.core; requires spring.webflux; diff --git a/nostr-java-crypto/pom.xml b/nostr-java-crypto/pom.xml index ce4557a33..b0022724f 100644 --- a/nostr-java-crypto/pom.xml +++ b/nostr-java-crypto/pom.xml @@ -6,7 +6,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-crypto diff --git a/nostr-java-encryption-nip04/pom.xml b/nostr-java-encryption-nip04/pom.xml index ced97d6bf..5c28eba3c 100644 --- a/nostr-java-encryption-nip04/pom.xml +++ b/nostr-java-encryption-nip04/pom.xml @@ -4,7 +4,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-encryption-nip04 diff --git a/nostr-java-encryption-nip44/pom.xml b/nostr-java-encryption-nip44/pom.xml index bb95d4948..d50eb5b4c 100644 --- a/nostr-java-encryption-nip44/pom.xml +++ b/nostr-java-encryption-nip44/pom.xml @@ -4,7 +4,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-encryption-nip44 diff --git a/nostr-java-encryption/pom.xml b/nostr-java-encryption/pom.xml index 169f58443..bc81e01bc 100644 --- a/nostr-java-encryption/pom.xml +++ b/nostr-java-encryption/pom.xml @@ -4,7 +4,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-encryption diff --git a/nostr-java-event/pom.xml b/nostr-java-event/pom.xml index 8a7b7c9c5..44581be69 100644 --- a/nostr-java-event/pom.xml +++ b/nostr-java-event/pom.xml @@ -6,7 +6,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-event diff --git a/nostr-java-event/src/main/java/nostr/event/filter/AbstractFilterable.java b/nostr-java-event/src/main/java/nostr/event/filter/AbstractFilterable.java new file mode 100644 index 000000000..5c60ee9d9 --- /dev/null +++ b/nostr-java-event/src/main/java/nostr/event/filter/AbstractFilterable.java @@ -0,0 +1,17 @@ +package nostr.event.filter; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NonNull; + +@Getter +@EqualsAndHashCode +public abstract class AbstractFilterable implements Filterable { + private final T filterable; + private final String filterKey; + + protected AbstractFilterable(@NonNull T filterable, @NonNull String filterKey) { + this.filterable = filterable; + this.filterKey = filterKey; + } +} diff --git a/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java index b6181320b..1a8c7eeca 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/AddressableTagFilter.java @@ -14,13 +14,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -@EqualsAndHashCode -public class AddressableTagFilter implements Filterable { - public final static String filterKey = "#a"; - private final T addressableTag; +@EqualsAndHashCode(callSuper = true) +public class AddressableTagFilter extends AbstractFilterable { + public final static String FILTER_KEY = "#a"; public AddressableTagFilter(T addressableTag) { - this.addressableTag = addressableTag; + super(addressableTag, FILTER_KEY); } @Override @@ -28,16 +27,6 @@ public Predicate getPredicate() { return this::compare; } - @Override - public T getFilterCriterion() { - return addressableTag; - } - - @Override - public String getFilterKey() { - return filterKey; - } - public static AddressTag createAddressTag(@NonNull JsonNode addressableTag) throws IllegalArgumentException { try { List list = Arrays.stream(addressableTag.asText().split(":")).toList(); @@ -56,6 +45,7 @@ public static AddressTag createAddressTag(@NonNull JsonNode addressableTag) thro @Override public String getFilterableValue() { + T addressableTag = getAddressableTag(); Integer kind = addressableTag.getKind(); String hexString = addressableTag.getPublicKey().toHexString(); String id = addressableTag.getIdentifierTag().getId(); @@ -66,14 +56,19 @@ public String getFilterableValue() { } private boolean compare(@NonNull GenericEvent genericEvent) { + T addressableTag = getAddressableTag(); return !genericEvent.getPubKey().toHexString().equals( - this.addressableTag.getPublicKey().toHexString()) || + addressableTag.getPublicKey().toHexString()) || !genericEvent.getKind().equals( - this.addressableTag.getKind()) || + addressableTag.getKind()) || getTypeSpecificTags(IdentifierTag.class, genericEvent).stream() .anyMatch(identifierTag -> identifierTag.getId().equals( - this.addressableTag.getIdentifierTag().getId())); + addressableTag.getIdentifierTag().getId())); + } + + private T getAddressableTag() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java index dfd0d185a..8ea0a704f 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/AuthorFilter.java @@ -6,33 +6,26 @@ import java.util.function.Predicate; -@EqualsAndHashCode -public class AuthorFilter implements Filterable { - public final static String filterKey = "authors"; - private final T publicKey; +@EqualsAndHashCode(callSuper = true) +public class AuthorFilter extends AbstractFilterable { + public final static String FILTER_KEY = "authors"; public AuthorFilter(T publicKey) { - this.publicKey = publicKey; + super(publicKey, FILTER_KEY); } @Override public Predicate getPredicate() { return (genericEvent) -> - this.publicKey.toHexString().equals(genericEvent.getPubKey().toHexString()); + genericEvent.getPubKey().toHexString().equals(getFilterableValue()); } @Override - public T getFilterCriterion() { - return publicKey; - } - - @Override - public String getFilterKey() { - return filterKey; + public String getFilterableValue() { + return getAuthor().toHexString(); } - @Override - public String getFilterableValue() { - return publicKey.toHexString(); + private T getAuthor() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java index c6fae8a50..d4c3a4174 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/EventFilter.java @@ -5,33 +5,26 @@ import java.util.function.Predicate; -@EqualsAndHashCode -public class EventFilter implements Filterable { - public final static String filterKey = "ids"; - private final T event; +@EqualsAndHashCode(callSuper = true) +public class EventFilter extends AbstractFilterable { + public final static String FILTER_KEY = "ids"; public EventFilter(T event) { - this.event = event; + super(event, FILTER_KEY); } @Override public Predicate getPredicate() { return (genericEvent) -> - this.event.getId().equals(genericEvent.getId()); + genericEvent.getId().equals(getFilterableValue()); } @Override - public T getFilterCriterion() { - return event; - } - - @Override - public String getFilterKey() { - return filterKey; + public String getFilterableValue() { + return getEvent().getId(); } - @Override - public String getFilterableValue() { - return event.getId(); + private T getEvent() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/Filterable.java b/nostr-java-event/src/main/java/nostr/event/filter/Filterable.java index 002ded0ba..70654ee32 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/Filterable.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/Filterable.java @@ -14,7 +14,7 @@ public interface Filterable { ObjectMapper mapper = new ObjectMapper(); Predicate getPredicate(); - T getFilterCriterion(); + T getFilterable(); Object getFilterableValue(); String getFilterKey(); diff --git a/nostr-java-event/src/main/java/nostr/event/filter/Filters.java b/nostr-java-event/src/main/java/nostr/event/filter/Filters.java index 65e1a12e5..73fb75f42 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/Filters.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/Filters.java @@ -7,17 +7,15 @@ import java.util.List; import java.util.Map; -import java.util.Objects; import static java.util.stream.Collectors.groupingBy; +@Getter @EqualsAndHashCode public class Filters { public static final int DEFAULT_FILTERS_LIMIT = 10; - @Getter private final Map> filtersMap; - @Getter @Setter private Integer limit = DEFAULT_FILTERS_LIMIT; diff --git a/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java index 324ba6557..f0fdbda68 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/GenericTagQueryFilter.java @@ -6,15 +6,14 @@ import nostr.event.impl.GenericEvent; import nostr.event.impl.GenericTag; -import java.util.HashSet; import java.util.function.Predicate; -@EqualsAndHashCode -public class GenericTagQueryFilter implements Filterable { - private final T genericTagQuery; +@EqualsAndHashCode(callSuper = true) +public class GenericTagQueryFilter extends AbstractFilterable { + public static final String HASH_PREFIX = "#"; public GenericTagQueryFilter(T genericTagQuery) { - this.genericTagQuery = genericTagQuery; + super(genericTagQuery, genericTagQuery.getTagName()); } @Override @@ -22,27 +21,32 @@ public Predicate getPredicate() { return (genericEvent) -> getTypeSpecificTags(GenericTag.class, genericEvent).stream() .filter(genericTag -> - genericTag.getCode().equals(this.genericTagQuery.getTagName())) + genericTag.getCode().equals(stripLeadingHashTag())) .anyMatch(genericTag -> - new HashSet<>(genericTag + genericTag .getAttributes().stream().map( - ElementAttribute::getValue).toList()) + ElementAttribute::getValue).toList() .contains( - this.genericTagQuery.getValue())); - } - - @Override - public T getFilterCriterion() { - return genericTagQuery; + getFilterableValue())); } @Override public String getFilterKey() { - return genericTagQuery.getTagName(); + return getGenericTagQuery().getTagName(); } @Override public String getFilterableValue() { - return genericTagQuery.getValue(); + return getGenericTagQuery().getValue(); + } + + private T getGenericTagQuery() { + return super.getFilterable(); + } + + private String stripLeadingHashTag() { + return getFilterKey().startsWith(HASH_PREFIX) ? + getFilterKey().substring(1) : + getFilterKey(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/GeohashTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/GeohashTagFilter.java new file mode 100644 index 000000000..9c31bc1ef --- /dev/null +++ b/nostr-java-event/src/main/java/nostr/event/filter/GeohashTagFilter.java @@ -0,0 +1,32 @@ +package nostr.event.filter; + +import lombok.EqualsAndHashCode; +import nostr.event.impl.GenericEvent; +import nostr.event.tag.GeohashTag; + +import java.util.function.Predicate; + +@EqualsAndHashCode(callSuper = true) +public class GeohashTagFilter extends AbstractFilterable { + public final static String FILTER_KEY = "#g"; + + public GeohashTagFilter(T geohashTag) { + super(geohashTag, FILTER_KEY); + } + + @Override + public Predicate getPredicate() { + return (genericEvent) -> + getTypeSpecificTags(GeohashTag.class, genericEvent).stream().anyMatch(geoHashTag -> + geoHashTag.getLocation().equals(getFilterableValue())); + } + + @Override + public String getFilterableValue() { + return getGeoHashTag().getLocation(); + } + + private T getGeoHashTag() { + return super.getFilterable(); + } +} diff --git a/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java index 6efc2b1ff..b746e7269 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/IdentifierTagFilter.java @@ -6,34 +6,27 @@ import java.util.function.Predicate; -@EqualsAndHashCode -public class IdentifierTagFilter implements Filterable { - public final static String filterKey = "#d"; - private final T identifierTag; - +@EqualsAndHashCode(callSuper = true) +public class IdentifierTagFilter extends AbstractFilterable { + public final static String FILTER_KEY = "#d"; public IdentifierTagFilter(T identifierTag) { - this.identifierTag = identifierTag; + super(identifierTag, FILTER_KEY); } @Override public Predicate getPredicate() { return (genericEvent) -> - getTypeSpecificTags(IdentifierTag.class, genericEvent).stream().anyMatch(genericEventIdentifiterTag -> - genericEventIdentifiterTag.getId().equals(this.identifierTag.getId())); - } - - @Override - public T getFilterCriterion() { - return identifierTag; + getTypeSpecificTags(IdentifierTag.class, genericEvent).stream() + .anyMatch(genericEventIdentifierTag -> + genericEventIdentifierTag.getId().equals(getFilterableValue())); } @Override - public String getFilterKey() { - return filterKey; + public String getFilterableValue() { + return getIdentifierTag().getId(); } - @Override - public String getFilterableValue() { - return identifierTag.getId(); + private T getIdentifierTag() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java index d018a913d..5c2765e8a 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/KindFilter.java @@ -7,24 +7,18 @@ import java.util.function.Predicate; -@EqualsAndHashCode -public class KindFilter implements Filterable { - public final static String filterKey = "kinds"; - private final T kind; +@EqualsAndHashCode(callSuper = true) +public class KindFilter extends AbstractFilterable { + public final static String FILTER_KEY = "kinds"; public KindFilter(T kind) { - this.kind = kind; + super(kind, FILTER_KEY); } @Override public Predicate getPredicate() { return (genericEvent) -> - genericEvent.getKind().equals(this.kind.getValue()); - } - - @Override - public T getFilterCriterion() { - return kind; + genericEvent.getKind().equals(getFilterableValue()); } @Override @@ -35,12 +29,11 @@ public void addToArrayNode(ArrayNode arrayNode) { } @Override - public String getFilterKey() { - return filterKey; + public Integer getFilterableValue() { + return getKind().getValue(); } - @Override - public Integer getFilterableValue() { - return kind.getValue(); + private T getKind() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java index 4ac62b0db..352d638eb 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedEventFilter.java @@ -6,13 +6,12 @@ import java.util.function.Predicate; -@EqualsAndHashCode -public class ReferencedEventFilter implements Filterable { - public final static String filterKey = "#e"; - private final T referencedEvent; +@EqualsAndHashCode(callSuper = true) +public class ReferencedEventFilter extends AbstractFilterable { + public final static String FILTER_KEY = "#e"; - public ReferencedEventFilter(T referencedEvent) { - this.referencedEvent = referencedEvent; + public ReferencedEventFilter(T referencedEventTag) { + super(referencedEventTag, FILTER_KEY); } @Override @@ -20,21 +19,15 @@ public Predicate getPredicate() { return (genericEvent) -> getTypeSpecificTags(EventTag.class, genericEvent).stream() .anyMatch(eventTag -> - eventTag.getIdEvent().equals(referencedEvent.getId())); + eventTag.getIdEvent().equals(getFilterableValue())); } @Override - public T getFilterCriterion() { - return referencedEvent; - } - - @Override - public String getFilterKey() { - return filterKey; + public String getFilterableValue() { + return getReferencedEventTag().getIdEvent(); } - @Override - public String getFilterableValue() { - return referencedEvent.getId(); + private T getReferencedEventTag() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java index 4dc4eab03..2eee8214d 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/ReferencedPublicKeyFilter.java @@ -1,19 +1,17 @@ package nostr.event.filter; import lombok.EqualsAndHashCode; -import nostr.base.PublicKey; import nostr.event.impl.GenericEvent; import nostr.event.tag.PubKeyTag; import java.util.function.Predicate; -@EqualsAndHashCode -public class ReferencedPublicKeyFilter implements Filterable { - public final static String filterKey = "#p"; - private final T referencedPublicKey; +@EqualsAndHashCode(callSuper = true) +public class ReferencedPublicKeyFilter extends AbstractFilterable { + public final static String FILTER_KEY = "#p"; - public ReferencedPublicKeyFilter(T referencedPublicKey) { - this.referencedPublicKey = referencedPublicKey; + public ReferencedPublicKeyFilter(T referencedPubKeyTag) { + super(referencedPubKeyTag, FILTER_KEY); } @Override @@ -21,21 +19,15 @@ public Predicate getPredicate() { return (genericEvent) -> getTypeSpecificTags(PubKeyTag.class, genericEvent).stream() .anyMatch(pubKeyTag -> - pubKeyTag.getPublicKey().toHexString().equals(this.referencedPublicKey.toHexString())); + pubKeyTag.getPublicKey().toHexString().equals(getFilterableValue())); } @Override - public T getFilterCriterion() { - return referencedPublicKey; - } - - @Override - public String getFilterKey() { - return filterKey; + public String getFilterableValue() { + return getReferencedPublicKey().getPublicKey().toHexString(); } - @Override - public String getFilterableValue() { - return referencedPublicKey.toHexString(); + private T getReferencedPublicKey() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java index fb06f049e..d6dc288c7 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/SinceFilter.java @@ -6,38 +6,31 @@ import java.util.function.Predicate; -@EqualsAndHashCode -public class SinceFilter implements Filterable { - public final static String filterKey = "since"; - private final Long since; +@EqualsAndHashCode(callSuper = true) +public class SinceFilter extends AbstractFilterable { + public final static String FILTER_KEY = "since"; public SinceFilter(Long since) { - this.since = since; + super(since, FILTER_KEY); } @Override public Predicate getPredicate() { return (genericEvent) -> - this.since < genericEvent.getCreatedAt(); - } - - @Override - public Long getFilterCriterion() { - return since; + genericEvent.getCreatedAt() > getSince(); } @Override public ObjectNode toObjectNode(ObjectNode objectNode) { - return mapper.createObjectNode().put(filterKey, since); + return mapper.createObjectNode().put(FILTER_KEY, getSince()); } @Override - public String getFilterKey() { - return filterKey; + public String getFilterableValue() { + return getSince().toString(); } - @Override - public String getFilterableValue() { - return since.toString(); + private Long getSince() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java b/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java index 54c9e2a99..54ac32872 100644 --- a/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java +++ b/nostr-java-event/src/main/java/nostr/event/filter/UntilFilter.java @@ -6,38 +6,31 @@ import java.util.function.Predicate; -@EqualsAndHashCode -public class UntilFilter implements Filterable { - public final static String filterKey = "until"; - private final Long until; +@EqualsAndHashCode(callSuper = true) +public class UntilFilter extends AbstractFilterable { + public final static String FILTER_KEY = "until"; public UntilFilter(Long until) { - this.until = until; + super(until, FILTER_KEY); } @Override public Predicate getPredicate() { return (genericEvent) -> - this.until >= genericEvent.getCreatedAt(); - } - - @Override - public Long getFilterCriterion() { - return until; + genericEvent.getCreatedAt() < getUntil(); } @Override public ObjectNode toObjectNode(ObjectNode objectNode) { - return mapper.createObjectNode().put(filterKey, until); + return mapper.createObjectNode().put(FILTER_KEY, getUntil()); } @Override - public String getFilterKey() { - return filterKey; + public String getFilterableValue() { + return getUntil().toString(); } - @Override - public String getFilterableValue() { - return until.toString(); + private Long getUntil() { + return super.getFilterable(); } } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java index 507d24f6c..b3792eabf 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FilterableProvider.java @@ -9,6 +9,7 @@ import nostr.event.filter.EventFilter; import nostr.event.filter.Filterable; import nostr.event.filter.GenericTagQueryFilter; +import nostr.event.filter.GeohashTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -16,7 +17,10 @@ import nostr.event.filter.SinceFilter; import nostr.event.filter.UntilFilter; import nostr.event.impl.GenericEvent; +import nostr.event.tag.EventTag; +import nostr.event.tag.GeohashTag; import nostr.event.tag.IdentifierTag; +import nostr.event.tag.PubKeyTag; import java.util.List; import java.util.function.Function; @@ -25,17 +29,17 @@ class FilterableProvider { protected static List getFilterable(String type, JsonNode node) { return switch (type) { - case ReferencedPublicKeyFilter.filterKey -> getFilterable(node, referencedPubKey -> new ReferencedPublicKeyFilter<>(new PublicKey(referencedPubKey.asText()))); - case ReferencedEventFilter.filterKey -> getFilterable(node, referencedEvent -> new ReferencedEventFilter<>(new GenericEvent(referencedEvent.asText()))); - case AddressableTagFilter.filterKey -> getFilterable(node, addressableTag -> new AddressableTagFilter<>(AddressableTagFilter.createAddressTag(addressableTag))); - case IdentifierTagFilter.filterKey -> getFilterable(node, identifierTag -> new IdentifierTagFilter<>(new IdentifierTag(identifierTag.asText()))); - case AuthorFilter.filterKey -> getFilterable(node, author -> new AuthorFilter<>(new PublicKey(author.asText()))); - case EventFilter.filterKey -> getFilterable(node, event -> new EventFilter<>(new GenericEvent(event.asText()))); - case KindFilter.filterKey -> getFilterable(node, kindNode -> new KindFilter<>(Kind.valueOf(kindNode.asInt()))); - case SinceFilter.filterKey -> List.of(new SinceFilter(node.asLong())); - case UntilFilter.filterKey -> List.of(new UntilFilter(node.asLong())); - default -> - getFilterable(node, genericNode -> new GenericTagQueryFilter<>(new GenericTagQuery(type, genericNode.asText()))); + case ReferencedPublicKeyFilter.FILTER_KEY -> getFilterable(node, referencedPubKey -> new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(referencedPubKey.asText())))); + case ReferencedEventFilter.FILTER_KEY -> getFilterable(node, referencedEvent -> new ReferencedEventFilter<>(new EventTag(referencedEvent.asText()))); + case AddressableTagFilter.FILTER_KEY -> getFilterable(node, addressableTag -> new AddressableTagFilter<>(AddressableTagFilter.createAddressTag(addressableTag))); + case IdentifierTagFilter.FILTER_KEY -> getFilterable(node, identifierTag -> new IdentifierTagFilter<>(new IdentifierTag(identifierTag.asText()))); + case GeohashTagFilter.FILTER_KEY -> getFilterable(node, geohashTag -> new GeohashTagFilter<>(new GeohashTag(geohashTag.asText()))); + case AuthorFilter.FILTER_KEY -> getFilterable(node, author -> new AuthorFilter<>(new PublicKey(author.asText()))); + case EventFilter.FILTER_KEY -> getFilterable(node, event -> new EventFilter<>(new GenericEvent(event.asText()))); + case KindFilter.FILTER_KEY -> getFilterable(node, kindNode -> new KindFilter<>(Kind.valueOf(kindNode.asInt()))); + case SinceFilter.FILTER_KEY -> List.of(new SinceFilter(node.asLong())); + case UntilFilter.FILTER_KEY -> List.of(new UntilFilter(node.asLong())); + default -> getFilterable(node, genericNode -> new GenericTagQueryFilter<>(new GenericTagQuery(type, genericNode.asText()))); }; } diff --git a/nostr-java-examples/pom.xml b/nostr-java-examples/pom.xml index ad1dfcf4d..5fa7b1fe7 100644 --- a/nostr-java-examples/pom.xml +++ b/nostr-java-examples/pom.xml @@ -6,7 +6,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-examples diff --git a/nostr-java-id/pom.xml b/nostr-java-id/pom.xml index 3b9796f47..c3a2e4af5 100644 --- a/nostr-java-id/pom.xml +++ b/nostr-java-id/pom.xml @@ -6,7 +6,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-id diff --git a/nostr-java-test/pom.xml b/nostr-java-test/pom.xml index 25ff07bd8..0ad8d8305 100644 --- a/nostr-java-test/pom.xml +++ b/nostr-java-test/pom.xml @@ -6,7 +6,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-test diff --git a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java index 26e88c8a1..988b14eef 100644 --- a/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java +++ b/nostr-java-test/src/test/java/nostr/test/event/ApiEventTest.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; - import nostr.api.EventNostr; import nostr.api.NIP01; import nostr.api.NIP04; @@ -12,26 +11,33 @@ import nostr.api.NIP52; import nostr.api.NIP57; import nostr.base.ElementAttribute; +import nostr.base.GenericTagQuery; import nostr.base.PrivateKey; import nostr.base.PublicKey; import nostr.crypto.bech32.Bech32; import nostr.crypto.bech32.Bech32Prefix; import nostr.event.BaseTag; +import nostr.event.NIP01Event; +import nostr.event.filter.Filters; +import nostr.event.filter.GenericTagQueryFilter; +import nostr.event.filter.GeohashTagFilter; import nostr.event.impl.CalendarContent; import nostr.event.impl.CreateOrUpdateStallEvent; import nostr.event.impl.CreateOrUpdateStallEvent.Stall; import nostr.event.impl.DirectMessageEvent; import nostr.event.impl.EncryptedPayloadEvent; +import nostr.event.impl.GenericTag; import nostr.event.impl.NostrMarketplaceEvent; import nostr.event.impl.NostrMarketplaceEvent.Product.Spec; import nostr.event.impl.TextNoteEvent; import nostr.event.impl.ZapReceiptEvent; import nostr.event.impl.ZapRequestEvent; +import nostr.event.message.OkMessage; +import nostr.event.tag.GeohashTag; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PubKeyTag; import nostr.id.Identity; import nostr.util.NostrException; - import org.junit.jupiter.api.Test; import java.io.IOException; @@ -41,13 +47,14 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; - -import nostr.event.message.OkMessage; +import static org.junit.jupiter.api.Assertions.fail; /** * @author eric @@ -133,6 +140,57 @@ public void testNIP44SendDirectMessage() throws IOException { nip44.close(); } + @Test + public void testNIP01SendTextNoteEventGeoHashTag() throws IOException { + System.out.println("testNIP01SendTextNoteEventGeoHashTag"); + + Identity identity = Identity.generateRandomIdentity(); + + String targetString = "geohash_tag-location"; + GeohashTag geohashTag = new GeohashTag(targetString); + NIP01 nip01 = new NIP01<>(identity); + + nip01.createTextNoteEvent(List.of(geohashTag), "GeohashTag Test location").signAndSend(Map.of("local", "ws://localhost:5555")); + + Filters filters = new Filters( + new GeohashTagFilter<>(new GeohashTag(targetString))); + + List result = nip01.sendRequest(filters, UUID.randomUUID().toString()); + + assertFalse(result.isEmpty()); + assertEquals(2, result.size()); + assertTrue(result.stream().anyMatch(s -> s.contains(targetString))); + + nip01.close(); + } + + @Test + public void testNIP01SendTextNoteEventCustomGenericTag() throws IOException { + System.out.println("testNIP01SendTextNoteEventCustomGenericTag"); + + Identity identity = Identity.generateRandomIdentity(); + + String targetString = "custom-generic-tag"; + GenericTag genericTag = GenericTag.create("m", 1, targetString); + NIP01 nip01 = new NIP01<>(identity); + nip01.createTextNoteEvent(List.of(genericTag), "Custom Generic Tag Test").signAndSend(Map.of("local", "ws://localhost:5555")); + + Filters filters = new Filters( + new GenericTagQueryFilter<>(new GenericTagQuery("#m", targetString))); + + List result = nip01.sendRequest(filters, UUID.randomUUID().toString()); + + assertFalse(result.isEmpty()); + assertEquals(2, result.size()); + + String matcher = """ + ["m","custom-generic-tag"]"""; + + assertTrue(result.stream().anyMatch(s -> s.contains(matcher))); + + nip01.close(); + } + @Test public void testNIP04EncryptDecrypt() { System.out.println("testNIP04EncryptDecrypt"); @@ -320,10 +378,10 @@ public void testNIP52CalendarTimeBasedEventEvent() throws IOException { "Calendar Time-Based Event title", 1716513986268L).build(); - calendarContent.setStartTzid("1687765220"); - calendarContent.setEndTzid("1687765230"); + calendarContent.setStartTzid("1687765220"); + calendarContent.setEndTzid("1687765230"); - calendarContent.setLabels(List.of("english", "mycenaean greek")); + calendarContent.setLabels(List.of("english", "mycenaean greek")); List tags = new ArrayList<>(); tags.add(new PubKeyTag(new PublicKey("2bed79f81439ff794cf5ac5f7bff9121e257f399829e472c7a14d3e86fe76985"), @@ -396,7 +454,7 @@ void testNIP57CreateZapReceiptEvent() throws NostrException { var nip57 = new NIP57(sender); ZapReceiptEvent instance = nip57.createZapReceiptEvent(zapRequestPubKeyTag, baseTags, zapRequestEventTag, - zapRequestAddressTag, ZAP_RECEIPT_IDENTIFIER, ZAP_RECEIPT_RELAY_URI, BOLT_11, DESCRIPTION_SHA256, PRE_IMAGE) + zapRequestAddressTag, ZAP_RECEIPT_IDENTIFIER, ZAP_RECEIPT_RELAY_URI, BOLT_11, DESCRIPTION_SHA256, PRE_IMAGE) .getEvent(); instance.update(); diff --git a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java index 85c8bdeca..caa589845 100644 --- a/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java +++ b/nostr-java-test/src/test/java/nostr/test/filters/FiltersDecoderTest.java @@ -8,6 +8,7 @@ import nostr.event.filter.EventFilter; import nostr.event.filter.Filters; import nostr.event.filter.GenericTagQueryFilter; +import nostr.event.filter.GeohashTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -17,7 +18,10 @@ import nostr.event.impl.GenericEvent; import nostr.event.json.codec.FiltersDecoder; import nostr.event.tag.AddressTag; +import nostr.event.tag.EventTag; +import nostr.event.tag.GeohashTag; import nostr.event.tag.IdentifierTag; +import nostr.event.tag.PubKeyTag; import org.junit.jupiter.api.Test; import java.time.Instant; @@ -25,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; @Log public class FiltersDecoderTest { @@ -131,7 +136,7 @@ public void testMultipleAddressableTagFiltersDecoder() { public void testKindFiltersDecoder() { log.info("testKindFiltersDecoder"); - String filterKey = KindFilter.filterKey; + String filterKey = KindFilter.FILTER_KEY; Kind kind = Kind.valueOf(1); String expected = "{\"" + filterKey + "\":[" + kind.toString() + "]}"; @@ -144,7 +149,7 @@ public void testKindFiltersDecoder() { public void testMultipleKindFiltersDecoder() { log.info("testMultipleKindFiltersDecoder"); - String filterKey = KindFilter.filterKey; + String filterKey = KindFilter.FILTER_KEY; Kind kind1 = Kind.valueOf(1); Kind kind2 = Kind.valueOf(2); @@ -201,7 +206,7 @@ public void testReferencedEventFilterDecoder() { String expected = "{\"#e\":[\"" + eventId + "\"]}"; Filters decodedFilters = new FiltersDecoder<>().decode(expected); - assertEquals(new Filters(new ReferencedEventFilter<>(new GenericEvent(eventId))), decodedFilters); + assertEquals(new Filters(new ReferencedEventFilter<>(new EventTag(eventId))), decodedFilters); } @Test @@ -217,13 +222,13 @@ public void testMultipleReferencedEventFilterDecoder() { assertEquals( new Filters( - new ReferencedEventFilter<>(new GenericEvent(eventId1)), - new ReferencedEventFilter<>(new GenericEvent(eventId2))), + new ReferencedEventFilter<>(new EventTag(eventId1)), + new ReferencedEventFilter<>(new EventTag(eventId2))), decodedFilters); } @Test - public void testReferencedPublicKeyFilterDecoder() { + public void testReferencedPublicKeyFilterDecofder() { log.info("testReferencedPublicKeyFilterDecoder"); String pubkeyString = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; @@ -231,7 +236,7 @@ public void testReferencedPublicKeyFilterDecoder() { String expected = "{\"#p\":[\"" + pubkeyString + "\"]}"; Filters decodedFilters = new FiltersDecoder<>().decode(expected); - assertEquals(new Filters(new ReferencedPublicKeyFilter<>(new PublicKey(pubkeyString))), decodedFilters); + assertEquals(new Filters(new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(pubkeyString)))), decodedFilters); } @Test @@ -248,14 +253,14 @@ public void testMultipleReferencedPublicKeyFilterDecoder() { assertEquals( new Filters( - new ReferencedPublicKeyFilter<>(new PublicKey(pubkeyString1)), - new ReferencedPublicKeyFilter<>(new PublicKey(pubkeyString2))), + new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(pubkeyString1))), + new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(pubkeyString2)))), decodedFilters); } @Test - public void testGenericTagFiltersDecoder() { - log.info("testGenericTagFiltersDecoder"); + public void testGeohashTagFiltersDecoder() { + log.info("testGeohashTagFiltersDecoder"); String geohashKey = "#g"; String geohashValue = "2vghde"; @@ -263,12 +268,12 @@ public void testGenericTagFiltersDecoder() { Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); - assertEquals(new Filters(new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue))), decodedFilters); + assertEquals(new Filters(new GeohashTagFilter<>(new GeohashTag(geohashValue))), decodedFilters); } @Test - public void testMultipleGenericTagFiltersDecoder() { - log.info("testMultipleGenericTagFiltersDecoder"); + public void testMultipleGeohashTagFiltersDecoder() { + log.info("testMultipleGeohashTagFiltersDecoder"); String geohashKey = "#g"; String geohashValue1 = "2vghde"; @@ -277,10 +282,41 @@ public void testMultipleGenericTagFiltersDecoder() { Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + assertEquals(new Filters( + new GeohashTagFilter<>(new GeohashTag(geohashValue1)), + new GeohashTagFilter<>(new GeohashTag(geohashValue2))), + decodedFilters); + } + + @Test + public void testGenericTagFiltersDecoder() { + log.info("testGenericTagFiltersDecoder"); + + String customTagKey = "#b"; + String customTagValue = "2vghde"; + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + customTagKey + "\":[\"" + customTagValue + "\"]}"; + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + + assertEquals(new Filters(new GenericTagQueryFilter<>(new GenericTagQuery(customTagKey, customTagValue))), decodedFilters); + } + + @Test + public void testMultipleGenericTagFiltersDecoder() { + log.info("testMultipleGenericTagFiltersDecoder"); + + String customTagKey = "#b"; + String customTagValue1 = "2vghde"; + String customTagValue2 = "3abcde"; + + String reqJsonWithCustomTagQueryFilterToDecode = "{\"" + customTagKey + "\":[\"" + customTagValue1 + "\",\"" + customTagValue2 + "\"]}"; + + Filters decodedFilters = new FiltersDecoder<>().decode(reqJsonWithCustomTagQueryFilterToDecode); + assertEquals( new Filters( - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue1)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue2))), + new GenericTagQueryFilter<>(new GenericTagQuery(customTagKey, customTagValue1)), + new GenericTagQueryFilter<>(new GenericTagQuery(customTagKey, customTagValue2))), decodedFilters); } diff --git a/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java b/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java index 3331c8106..6cafac92f 100644 --- a/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java +++ b/nostr-java-test/src/test/java/nostr/test/filters/FiltersEncoderTest.java @@ -10,6 +10,7 @@ import nostr.event.filter.Filterable; import nostr.event.filter.Filters; import nostr.event.filter.GenericTagQueryFilter; +import nostr.event.filter.GeohashTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -20,7 +21,10 @@ import nostr.event.json.codec.FiltersEncoder; import nostr.event.message.ReqMessage; import nostr.event.tag.AddressTag; +import nostr.event.tag.EventTag; +import nostr.event.tag.GeohashTag; import nostr.event.tag.IdentifierTag; +import nostr.event.tag.PubKeyTag; import org.junit.jupiter.api.Test; import java.time.Instant; @@ -182,7 +186,7 @@ public void testReferencedEventFilterEncoder() { String eventId = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; - FiltersEncoder encoder = new FiltersEncoder(new Filters(new ReferencedEventFilter<>(new GenericEvent(eventId)))); + FiltersEncoder encoder = new FiltersEncoder(new Filters(new ReferencedEventFilter<>(new EventTag(eventId)))); String encodedFilters = encoder.encode(); assertEquals("{\"#e\":[\"" + eventId + "\"]}", encodedFilters); } @@ -196,35 +200,21 @@ public void testMultipleReferencedEventFilterEncoder() { FiltersEncoder encoder = new FiltersEncoder(new Filters( List.of( - new ReferencedEventFilter<>(new GenericEvent(eventId1)), - new ReferencedEventFilter<>(new GenericEvent(eventId2))))); + new ReferencedEventFilter<>(new EventTag(eventId1)), + new ReferencedEventFilter<>(new EventTag(eventId2))))); String encodedFilters = encoder.encode(); String eventIds = String.join("\",\"", eventId1, eventId2); assertEquals("{\"#e\":[\"" + eventIds + "\"]}", encodedFilters); } - @Test - public void testSingleGenericTagQueryFiltersEncoder() { - log.info("testSingleGenericTagQueryFiltersEncoder"); - - String geohashKey = "#g"; - String new_geohash = "2vghde"; - - FiltersEncoder encoder = new FiltersEncoder( - new Filters(new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, new_geohash)))); - - String encodedFilters = encoder.encode(); - assertEquals("{\"#g\":[\"2vghde\"]}", encodedFilters); - } - @Test public void testReferencedPublicKeyFilterEncoder() { log.info("testReferencedPublicKeyFilterEncoder"); String pubKeyString = "f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75"; - FiltersEncoder encoder = new FiltersEncoder(new Filters(new ReferencedPublicKeyFilter<>(new PublicKey(pubKeyString)))); + FiltersEncoder encoder = new FiltersEncoder(new Filters(new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(pubKeyString))))); String encodedFilters = encoder.encode(); assertEquals("{\"#p\":[\"" + pubKeyString + "\"]}", encodedFilters); @@ -238,8 +228,8 @@ public void testMultipleReferencedPublicKeyFilterEncoder() { String pubKeyString2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; FiltersEncoder encoder = new FiltersEncoder(new Filters( - new ReferencedPublicKeyFilter<>(new PublicKey(pubKeyString1)), - new ReferencedPublicKeyFilter<>(new PublicKey(pubKeyString2)))); + new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(pubKeyString1))), + new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(pubKeyString2))))); String encodedFilters = encoder.encode(); String pubKeyTags = String.join("\",\"", pubKeyString1, pubKeyString2); @@ -247,21 +237,63 @@ public void testMultipleReferencedPublicKeyFilterEncoder() { } @Test - public void testMultipleGenericTagQueryFiltersEncoder() { + public void testSingleGeohashTagQueryFiltersEncoder() { + log.info("testSingleGeohashTagQueryFiltersEncoder"); + + String new_geohash = "2vghde"; + + FiltersEncoder encoder = new FiltersEncoder( + new Filters(new GeohashTagFilter<>(new GeohashTag(new_geohash)))); + + String encodedFilters = encoder.encode(); + assertEquals("{\"#g\":[\"2vghde\"]}", encodedFilters); + } + + @Test + public void testMultipleGeohashTagQueryFiltersEncoder() { log.info("testMultipleGenericTagQueryFiltersEncoder"); - String geohashKey = "#g"; String geohashValue1 = "2vghde"; String geohashValue2 = "3abcde"; FiltersEncoder encoder = new FiltersEncoder(new Filters( - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue1)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue2)))); + new GeohashTagFilter<>(new GeohashTag(geohashValue1)), + new GeohashTagFilter<>(new GeohashTag(geohashValue2)))); String encodedFilters = encoder.encode(); assertEquals("{\"#g\":[\"2vghde\",\"3abcde\"]}", encodedFilters); } + @Test + public void testSingleCustomGenericTagQueryFiltersEncoder() { + log.info("testSingleCustomGenericTagQueryFiltersEncoder"); + + String customKey = "#b"; + String customValue = "2vghde"; + + FiltersEncoder encoder = new FiltersEncoder( + new Filters(new GenericTagQueryFilter<>(new GenericTagQuery(customKey, customValue)))); + + String encodedFilters = encoder.encode(); + assertEquals("{\"#b\":[\"2vghde\"]}", encodedFilters); + } + + @Test + public void testMultipleCustomGenericTagQueryFiltersEncoder() { + log.info("testMultipleCustomGenericTagQueryFiltersEncoder"); + + String customKey = "#b"; + String customValue1 = "2vghde"; + String customValue2 = "3abcde"; + + FiltersEncoder encoder = new FiltersEncoder(new Filters( + new GenericTagQueryFilter<>(new GenericTagQuery(customKey, customValue1)), + new GenericTagQueryFilter<>(new GenericTagQuery(customKey, customValue2)))); + + String encodedFilters = encoder.encode(); + assertEquals("{\"#b\":[\"2vghde\",\"3abcde\"]}", encodedFilters); + } + @Test public void testMultipleAddressableTagFilterEncoder() { log.info("testMultipleAddressableTagFilterEncoder"); diff --git a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java index 65a7aed69..fe86d6ae1 100644 --- a/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java +++ b/nostr-java-test/src/test/java/nostr/test/json/JsonParseTest.java @@ -20,6 +20,7 @@ import nostr.event.filter.Filterable; import nostr.event.filter.Filters; import nostr.event.filter.GenericTagQueryFilter; +import nostr.event.filter.GeohashTagFilter; import nostr.event.filter.IdentifierTagFilter; import nostr.event.filter.KindFilter; import nostr.event.filter.ReferencedEventFilter; @@ -35,6 +36,7 @@ import nostr.event.message.ReqMessage; import nostr.event.tag.AddressTag; import nostr.event.tag.EventTag; +import nostr.event.tag.GeohashTag; import nostr.event.tag.IdentifierTag; import nostr.event.tag.PriceTag; import nostr.event.tag.PubKeyTag; @@ -80,17 +82,17 @@ public void testBaseMessageDecoderEventFilter() throws JsonProcessingException { Filters filters = ((ReqMessage) message).getFiltersList().getFirst(); - List kindFilters = filters.getFilterByType(KindFilter.filterKey); + List kindFilters = filters.getFilterByType(KindFilter.FILTER_KEY); assertEquals(1, kindFilters.size()); assertEquals(new KindFilter<>(Kind.TEXT_NOTE), kindFilters.getFirst()); - List eventFilter = filters.getFilterByType(EventFilter.filterKey); + List eventFilter = filters.getFilterByType(EventFilter.FILTER_KEY); assertEquals(1, eventFilter.size()); assertEquals(new EventFilter<>(new GenericEvent("f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75")), eventFilter.getFirst()); - List referencedPublicKeyfilter = filters.getFilterByType(ReferencedPublicKeyFilter.filterKey); + List referencedPublicKeyfilter = filters.getFilterByType(ReferencedPublicKeyFilter.FILTER_KEY); assertEquals(1, referencedPublicKeyfilter.size()); - assertEquals(new ReferencedPublicKeyFilter<>(new PublicKey("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712")), referencedPublicKeyfilter.getFirst()); + assertEquals(new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"))), referencedPublicKeyfilter.getFirst()); } @Test @@ -112,17 +114,17 @@ public void testBaseMessageDecoderKindsAuthorsReferencedPublicKey() throws JsonP Filters filters = ((ReqMessage) message).getFiltersList().getFirst(); - List kindFilters = filters.getFilterByType(KindFilter.filterKey); + List kindFilters = filters.getFilterByType(KindFilter.FILTER_KEY); assertEquals(1, kindFilters.size()); assertEquals(new KindFilter<>(Kind.TEXT_NOTE), kindFilters.getFirst()); - List authorFilters = filters.getFilterByType(AuthorFilter.filterKey); + List authorFilters = filters.getFilterByType(AuthorFilter.FILTER_KEY); assertEquals(1, authorFilters.size()); assertEquals(new AuthorFilter<>(new PublicKey("f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75")), authorFilters.getFirst()); - List referencedPublicKeyfilter = filters.getFilterByType(ReferencedPublicKeyFilter.filterKey); + List referencedPublicKeyfilter = filters.getFilterByType(ReferencedPublicKeyFilter.FILTER_KEY); assertEquals(1, referencedPublicKeyfilter.size()); - assertEquals(new ReferencedPublicKeyFilter<>(new PublicKey("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712")), referencedPublicKeyfilter.getFirst()); + assertEquals(new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712"))), referencedPublicKeyfilter.getFirst()); } @Test @@ -144,17 +146,17 @@ public void testBaseMessageDecoderKindsAuthorsReferencedEvents() throws JsonProc Filters filters = ((ReqMessage) message).getFiltersList().getFirst(); - List kindFilters = filters.getFilterByType(KindFilter.filterKey); + List kindFilters = filters.getFilterByType(KindFilter.FILTER_KEY); assertEquals(1, kindFilters.size()); assertEquals(new KindFilter<>(Kind.TEXT_NOTE), kindFilters.getFirst()); - List authorFilters = filters.getFilterByType(AuthorFilter.filterKey); + List authorFilters = filters.getFilterByType(AuthorFilter.FILTER_KEY); assertEquals(1, authorFilters.size()); assertEquals(new AuthorFilter<>(new PublicKey("f1b419a95cb0233a11d431423b41a42734e7165fcab16081cd08ef1c90e0be75")), authorFilters.getFirst()); - List referencedEventFilters = filters.getFilterByType(ReferencedEventFilter.filterKey); + List referencedEventFilters = filters.getFilterByType(ReferencedEventFilter.FILTER_KEY); assertEquals(1, referencedEventFilters.size()); - assertEquals(new ReferencedEventFilter<>(new GenericEvent("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712")), referencedEventFilters.getFirst()); + assertEquals(new ReferencedEventFilter<>(new EventTag("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712")), referencedEventFilters.getFirst()); } @Test @@ -390,7 +392,7 @@ public void testReqMessageDeserializer() throws JsonProcessingException { ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, new Filters( - new GenericTagQueryFilter<>(new GenericTagQuery("#g", geohashValue)))); + new GeohashTagFilter<>(new GeohashTag(geohashValue)))); assertEquals(expectedReqMessage, decodedReqMessage); } @@ -410,8 +412,8 @@ public void testReqMessageFilterListDecoder() { ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, new Filters( - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue1)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue2)))); + new GeohashTagFilter<>(new GeohashTag(geohashValue1)), + new GeohashTagFilter<>(new GeohashTag(geohashValue2)))); assertEquals(reqJsonWithCustomTagQueryFiltersToDecode, decodedReqMessage.encode()); assertEquals(expectedReqMessage, decodedReqMessage); @@ -444,12 +446,12 @@ public void testReqMessagePopulatedFilterDecoder() { ReqMessage expectedReqMessage = new ReqMessage(subscriptionId, new Filters( - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue1)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue2)), - new ReferencedPublicKeyFilter<>(new PublicKey(author)), + new GeohashTagFilter<>(new GeohashTag(geohashValue1)), + new GeohashTagFilter<>(new GeohashTag(geohashValue2)), + new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(author))), new KindFilter<>(Kind.TEXT_NOTE), new AuthorFilter<>(new PublicKey(author)), - new ReferencedEventFilter<>(new GenericEvent(referencedEventId)))); + new ReferencedEventFilter<>(new EventTag(referencedEventId)))); assertEquals(expectedReqMessage, decodedReqMessage); }); @@ -485,9 +487,9 @@ public void testReqMessagePopulatedListOfFiltersWithIdentityDecoder() throws Jso new Filters( new KindFilter<>(Kind.TEXT_NOTE), new AuthorFilter<>(new PublicKey(author)), - new ReferencedEventFilter<>(new GenericEvent(referencedEventId)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue1)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue2)), + new ReferencedEventFilter<>(new EventTag(referencedEventId)), + new GeohashTagFilter<>(new GeohashTag(geohashValue1)), + new GeohashTagFilter<>(new GeohashTag(geohashValue2)), new IdentifierTagFilter<>(new IdentifierTag(uuidValue1)), new IdentifierTagFilter<>(new IdentifierTag(uuidValue2)))); @@ -527,8 +529,8 @@ public void testReqMessagePopulatedListOfFiltersListDecoder() throws JsonProcess new Filters( new KindFilter<>(Kind.TEXT_NOTE), new AuthorFilter<>(new PublicKey(author)), - new ReferencedEventFilter<>(new GenericEvent(referencedEventId)), - new ReferencedPublicKeyFilter<>(new PublicKey(author)), + new ReferencedEventFilter<>(new EventTag(referencedEventId)), + new ReferencedPublicKeyFilter<>(new PubKeyTag(new PublicKey(author))), new AddressableTagFilter<>(addressTag1))); assertEquals(expectedReqMessage.encode(), decodedReqMessage.encode()); @@ -561,7 +563,7 @@ public void testReqMessagePopulatedListOfMultipleTypeFiltersListDecoder() throws new KindFilter<>(Kind.RECOMMEND_SERVER), new AuthorFilter<>(new PublicKey(author)), new AuthorFilter<>(new PublicKey(author2)), - new ReferencedEventFilter<>(new GenericEvent(referencedEventId)))); + new ReferencedEventFilter<>(new EventTag(referencedEventId)))); assertEquals(expectedReqMessage.encode(), decodedReqMessage.encode()); assertEquals(expectedReqMessage, decodedReqMessage); @@ -601,9 +603,9 @@ public void testGenericTagQueryListDecoder() throws JsonProcessingException { new KindFilter<>(Kind.RECOMMEND_SERVER), new AuthorFilter<>(new PublicKey(author)), new AuthorFilter<>(new PublicKey(author2)), - new ReferencedEventFilter<>(new GenericEvent(referencedEventId)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue1)), - new GenericTagQueryFilter<>(new GenericTagQuery(geohashKey, geohashValue2)), + new ReferencedEventFilter<>(new EventTag(referencedEventId)), + new GeohashTagFilter<>(new GeohashTag(geohashValue1)), + new GeohashTagFilter<>(new GeohashTag(geohashValue2)), new IdentifierTagFilter<>(new IdentifierTag(uuidValue1)), new IdentifierTagFilter<>(new IdentifierTag(uuidValue2)))); diff --git a/nostr-java-util/pom.xml b/nostr-java-util/pom.xml index 055036fd6..7dc6acd13 100644 --- a/nostr-java-util/pom.xml +++ b/nostr-java-util/pom.xml @@ -6,7 +6,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT nostr-java-util @@ -22,11 +22,5 @@ org.projectlombok lombok - - ${project.groupId} - nostr-java-context-interface - ${project.version} - compile - - \ No newline at end of file + diff --git a/nostr-java-util/src/main/java/module-info.java b/nostr-java-util/src/main/java/module-info.java index 6c586eb94..8658ffc7d 100644 --- a/nostr-java-util/src/main/java/module-info.java +++ b/nostr-java-util/src/main/java/module-info.java @@ -2,8 +2,6 @@ requires static lombok; requires java.logging; - requires nostr.context; - exports nostr.util; exports nostr.util.thread; } diff --git a/pom.xml b/pom.xml index 6db953756..df4632823 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ xyz.tcheeric nostr-java - 0.6.4-SNAPSHOT + 0.6.5-SNAPSHOT pom ${project.artifactId}