diff --git a/nostr-java-api/src/main/java/nostr/api/NIP01.java b/nostr-java-api/src/main/java/nostr/api/NIP01.java index 76f12ef31..4a9d24039 100644 --- a/nostr-java-api/src/main/java/nostr/api/NIP01.java +++ b/nostr-java-api/src/main/java/nostr/api/NIP01.java @@ -19,6 +19,7 @@ import nostr.api.factory.impl.NIP01Impl.ReplaceableEventFactory; import nostr.api.factory.impl.NIP01Impl.ReqMessageFactory; import nostr.api.factory.impl.NIP01Impl.TextNoteEventFactory; +import nostr.base.GenericTagQuery; import nostr.base.IEvent; import nostr.base.PublicKey; import nostr.base.Relay; @@ -29,7 +30,6 @@ import nostr.event.impl.Filters; import nostr.event.list.EventList; import nostr.event.list.FiltersList; -import nostr.event.list.GenericTagQueryList; import nostr.event.list.KindList; import nostr.event.list.PublicKeyList; import nostr.event.message.CloseMessage; @@ -206,15 +206,15 @@ public static PubKeyTag createPubKeyTag(@NonNull PublicKey publicKey, String mai * @param until an integer unix timestamp in seconds, events must be older * than this to pass * @param limit maximum number of events to be returned in the initial query - * @param genericTagQueryList a generic tag query list + * @param genericTagQuery a generic tag query * @return a filters object */ @Deprecated(forRemoval = true) - public static Filters createFilters(EventList events, PublicKeyList authors, KindList kinds, EventList referencedEvents, PublicKeyList referencePubKeys, Long since, Long until, Integer limit, GenericTagQueryList genericTagQueryList) { + public static Filters createFilters(EventList events, PublicKeyList authors, KindList kinds, EventList referencedEvents, PublicKeyList referencePubKeys, Long since, Long until, Integer limit, GenericTagQuery genericTagQuery) { return Filters.builder() .authors(authors) .events(events) - .genericTagQueryList(genericTagQueryList) + .genericTagQuery(genericTagQuery) .kinds(kinds).limit(limit) .referencePubKeys(referencePubKeys) .referencedEvents(referencedEvents) diff --git a/nostr-java-base/src/main/java/nostr/base/GenericTagQuery.java b/nostr-java-base/src/main/java/nostr/base/GenericTagQuery.java index 6ab3921eb..184e303f3 100644 --- a/nostr-java-base/src/main/java/nostr/base/GenericTagQuery.java +++ b/nostr-java-base/src/main/java/nostr/base/GenericTagQuery.java @@ -1,10 +1,12 @@ package nostr.base; -import java.util.List; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + /** * * @author squirrel @@ -17,7 +19,8 @@ public class GenericTagQuery implements IElement { private List value; @Override + @JsonIgnore public Integer getNip() { return 1; - } + } } diff --git a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java index c8d34538d..c37c9feb3 100644 --- a/nostr-java-event/src/main/java/nostr/event/impl/Filters.java +++ b/nostr-java-event/src/main/java/nostr/event/impl/Filters.java @@ -5,19 +5,18 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import nostr.base.GenericTagQuery; import nostr.base.annotation.Key; import nostr.event.BaseEvent; -import nostr.event.json.deserializer.CustomGenericTagQueryListDeserializer; -import nostr.event.json.serializer.CustomGenericTagQueryListSerializer; +import nostr.event.json.deserializer.CustomGenericTagQueryDeserializer; +import nostr.event.json.serializer.CustomGenericTagQuerySerializer; import nostr.event.json.serializer.CustomIdEventListSerializer; import nostr.event.list.EventList; -import nostr.event.list.GenericTagQueryList; import nostr.event.list.KindList; import nostr.event.list.PublicKeyList; @@ -63,9 +62,9 @@ public class Filters extends BaseEvent { private Integer limit; @Key(nip = 12) - @JsonSerialize(using=CustomGenericTagQueryListSerializer.class) - @JsonDeserialize(using=CustomGenericTagQueryListDeserializer.class) - private GenericTagQueryList genericTagQueryList; + @JsonSerialize(using=CustomGenericTagQuerySerializer.class) + @JsonDeserialize(using=CustomGenericTagQueryDeserializer.class) + private GenericTagQuery genericTagQuery; @Override public String toBech32() { @@ -81,6 +80,6 @@ public Integer getNip() { @Override @JsonIgnore public String getId() { - throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody + throw new UnsupportedOperationException("Not supported."); } } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageDecoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageDecoder.java index fac0355c8..d7cf79f62 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageDecoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageDecoder.java @@ -91,7 +91,12 @@ public BaseMessage decode() { } } case "REQ" -> { - var filtersList = mapper.convertValue(msgArr[2], new TypeReference() { + var len = msgArr.length - 2; + var filtersArr = new Object[len]; + for (int i = 0; i < len; i++) { + filtersArr[i] = msgArr[i + 2]; + } + var filtersList = mapper.convertValue(filtersArr, new TypeReference() { }); message = new ReqMessage(arg.toString(), filtersList); } diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageEncoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageEncoder.java index f393e774c..3f1d6b17c 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageEncoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/BaseMessageEncoder.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import lombok.AllArgsConstructor; import lombok.Data; @@ -12,6 +11,7 @@ import nostr.base.Relay; import nostr.event.BaseEvent; import nostr.event.BaseMessage; +import nostr.event.impl.Filters; import nostr.event.impl.GenericMessage; import nostr.event.message.CanonicalAuthenticationMessage; import nostr.event.message.CloseMessage; @@ -20,6 +20,8 @@ import nostr.event.message.RelayAuthenticationMessage; import nostr.event.message.ReqMessage; +import java.util.List; + /** * @author squirrel */ @@ -45,18 +47,16 @@ public String encode() { } else if (message instanceof ReqMessage msg) { arrayNode.add(msg.getSubscriptionId()); // Encode each filter individually and join them with a comma - ArrayNode filtersNode = JsonNodeFactory.instance.arrayNode(); - msg.getFiltersList().getList().stream() - .map(filter -> { - try { - return IEncoder.MAPPER.valueToTree(filter); - } catch (Exception e) { - throw new RuntimeException(e); - } - }) - .map(n -> ((JsonNode) n)) - .forEach(filtersNode::add); - arrayNode.add(filtersNode); + List filtersList = msg.getFiltersList().getList(); + for (Filters f : filtersList) { + try { + FiltersEncoder filtersEncoder = new FiltersEncoder(f, relay); + var filterNode = MAPPER.readTree(filtersEncoder.encode()); + arrayNode.add(filterNode); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } else if (message instanceof NoticeMessage msg) { arrayNode.add(msg.getMessage()); } else if (message instanceof CloseMessage msg) { diff --git a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersEncoder.java b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersEncoder.java index 5ebfef671..ec1e57260 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersEncoder.java +++ b/nostr-java-event/src/main/java/nostr/event/json/codec/FiltersEncoder.java @@ -2,11 +2,10 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.Data; import lombok.EqualsAndHashCode; -import nostr.base.IEncoder; import nostr.base.Relay; import nostr.event.impl.Filters; import nostr.util.NostrException; @@ -17,7 +16,6 @@ /** * @author guilhermegps - * */ @Data @EqualsAndHashCode(callSuper = false) @@ -36,19 +34,30 @@ protected String toJson() throws NostrException { try { JsonNode node = IEncoder.MAPPER.valueToTree(getEvent()); ObjectNode objNode = (ObjectNode) node; - var arrayNode = (ArrayNode) node.get("genericTagQueryList"); - if (arrayNode != null && !arrayNode.isNull()) { - for (JsonNode jn : arrayNode) { + //var arrayNode = (ArrayNode) node.get("genericTagQuery"); + if (objNode != null && !objNode.isNull()) { + for (JsonNode jn : objNode) { StreamSupport.stream( - Spliterators.spliteratorUnknownSize(jn.fields(), Spliterator.ORDERED), false) + Spliterators.spliteratorUnknownSize(jn.fields(), Spliterator.ORDERED), false) .forEach(f -> { - objNode.set(f.getKey(), f.getValue()); + if ("genericTagQuery".equals(f.getKey())) { + var mapper = new ObjectMapper(); + try { + mapper.readTree(f.getValue().toString()) + .fields() + .forEachRemaining(g -> objNode.set(g.getKey(), g.getValue())); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } else { + objNode.set(f.getKey(), f.getValue()); + } }); } } - objNode.remove("genericTagQueryList"); + objNode.remove("genericTagQuery"); - return IEncoder.MAPPER.writeValueAsString(node); + return MAPPER.writeValueAsString(objNode); } catch (JsonProcessingException | IllegalArgumentException e) { throw new NostrException(e); } diff --git a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java index f69c365ca..ca00c1da6 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java +++ b/nostr-java-event/src/main/java/nostr/event/json/deserializer/CustomGenericTagQueryDeserializer.java @@ -5,13 +5,13 @@ import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import nostr.base.GenericTagQuery; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; -import nostr.base.GenericTagQuery; public class CustomGenericTagQueryDeserializer extends JsonDeserializer { @@ -28,7 +28,7 @@ public GenericTagQuery deserialize(JsonParser jsonParser, DeserializationContext String tagName = field.getKey(); JsonNode valuesNode = field.getValue(); List values = objectMapper.convertValue(valuesNode, ArrayList.class); - genericTagQuery.setTagName(tagName.charAt(1)); // Assuming tagName is always a single character preceded by '#' + genericTagQuery.setTagName(tagName.charAt(0)); // Assuming tagName is always a single character preceded by '#' genericTagQuery.setValue(values); } diff --git a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java index c4f3edfa1..df7c68d04 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java +++ b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQueryListSerializer.java @@ -1,18 +1,16 @@ package nostr.event.json.serializer; -import java.io.IOException; -import java.util.stream.Collectors; - import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.node.ObjectNode; - import nostr.base.GenericTagQuery; import nostr.base.IEncoder; import nostr.event.list.GenericTagQueryList; +import java.io.IOException; + /** * @author guilhermegps * @@ -20,15 +18,13 @@ public class CustomGenericTagQueryListSerializer extends JsonSerializer { @Override - public void serialize(GenericTagQueryList value, JsonGenerator gen, SerializerProvider serializers) { - try { - var list = value.getList().parallelStream().map(gtq -> toJson(gtq)) - .collect(Collectors.toList()); - - gen.writePOJO(list); - } catch (IOException e) { - throw new RuntimeException(e); + public void serialize(GenericTagQueryList value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartObject(); + for (GenericTagQuery gtq : value.getList()) { + JsonNode node = toJson(gtq); + gen.writeObjectField(node.fieldNames().next(), node.get(node.fieldNames().next())); } + gen.writeEndObject(); } private JsonNode toJson(GenericTagQuery gtq) { @@ -39,8 +35,9 @@ private JsonNode toJson(GenericTagQuery gtq) { objNode.set("#" + node.get("tagName").textValue(), node.get("value")); objNode.remove("tagName"); objNode.remove("value"); + objNode.remove("nip"); - return node; + return node.get("genericTagQueryList").get(0); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } diff --git a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java index adff41e11..155af514f 100644 --- a/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java +++ b/nostr-java-event/src/main/java/nostr/event/json/serializer/CustomGenericTagQuerySerializer.java @@ -1,20 +1,18 @@ package nostr.event.json.serializer; -import java.io.IOException; -import java.io.Serial; - import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.ser.std.StdSerializer; - import nostr.base.GenericTagQuery; import nostr.base.IEncoder; +import java.io.IOException; +import java.io.Serial; + /** * @author guilhermegps - * */ public class CustomGenericTagQuerySerializer extends StdSerializer { @@ -26,27 +24,15 @@ public CustomGenericTagQuerySerializer() { } @Override - public void serialize(GenericTagQuery value, JsonGenerator gen, SerializerProvider serializers) { - try { - gen.writePOJO(toJson(value)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static JsonNode toJson(GenericTagQuery gtq) { + public void serialize(GenericTagQuery value, JsonGenerator gen, SerializerProvider serializers) throws IOException { var mapper = IEncoder.MAPPER; - try { - JsonNode node = mapper.valueToTree(gtq); - ObjectNode objNode = (ObjectNode) node; - objNode.set("#" + node.get("tagName").textValue(), node.get("value")); - objNode.remove("tagName"); - objNode.remove("value"); - - return node; - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); - } + JsonNode node = mapper.valueToTree(value); + ObjectNode objNode = (ObjectNode) node; + String attrName = "#" + value.getTagName(); + objNode.set(attrName, node.get("value")); + objNode.remove("tagName"); + objNode.remove("value"); + + gen.writeTree(objNode); } - } diff --git a/nostr-java-event/src/main/java/nostr/event/list/GenericTagQueryList.java b/nostr-java-event/src/main/java/nostr/event/list/GenericTagQueryList.java index 844fe7250..3c16ddf1a 100644 --- a/nostr-java-event/src/main/java/nostr/event/list/GenericTagQueryList.java +++ b/nostr-java-event/src/main/java/nostr/event/list/GenericTagQueryList.java @@ -1,5 +1,6 @@ package nostr.event.list; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Builder; import lombok.NonNull; import nostr.base.GenericTagQuery; @@ -26,4 +27,10 @@ private GenericTagQueryList(@NonNull List list) { super(list); } + @Override + @JsonIgnore + public Integer getNip() { + return 1; + } + } diff --git a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java index 8bea7d3b2..431ee9aba 100644 --- a/nostr-java-test/src/main/java/nostr/test/EntityFactory.java +++ b/nostr-java-test/src/main/java/nostr/test/EntityFactory.java @@ -1,18 +1,11 @@ package nostr.test; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import lombok.extern.java.Log; import nostr.base.ElementAttribute; import nostr.base.GenericTagQuery; import nostr.base.IEvent; -import nostr.base.UserProfile; import nostr.base.PublicKey; +import nostr.base.UserProfile; import nostr.event.BaseTag; import nostr.event.Kind; import nostr.event.Reaction; @@ -29,12 +22,18 @@ import nostr.event.impl.ReplaceableEvent; import nostr.event.impl.TextNoteEvent; import nostr.event.list.EventList; -import nostr.event.list.GenericTagQueryList; import nostr.event.list.KindList; import nostr.event.list.PublicKeyList; import nostr.event.tag.EventTag; import nostr.event.tag.PubKeyTag; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + /** * * @author squirrel @@ -150,10 +149,7 @@ public static Filters createFilters(PublicKey publicKey) { EventList refEvents = new EventList(); refEvents.add(createTextNoteEvent(publicKey)); - GenericTagQueryList gtqList = new GenericTagQueryList(); - gtqList.add(createGenericTagQuery()); - - return Filters.builder().events(eventList).referencedEvents(refEvents).genericTagQueryList(gtqList).build(); + return Filters.builder().events(eventList).referencedEvents(refEvents).genericTagQuery(createGenericTagQuery()).build(); } public static GenericTagQuery createGenericTagQuery() { 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 66a59ace6..d6f78c479 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 @@ -2,6 +2,7 @@ import nostr.base.Command; import nostr.base.ElementAttribute; +import nostr.base.GenericTagQuery; import nostr.base.PublicKey; import nostr.crypto.bech32.Bech32; import nostr.event.BaseEvent; @@ -14,6 +15,7 @@ import nostr.event.json.codec.BaseMessageDecoder; import nostr.event.json.codec.BaseMessageEncoder; import nostr.event.json.codec.BaseTagDecoder; +import nostr.event.json.codec.FiltersEncoder; import nostr.event.json.codec.GenericTagDecoder; import nostr.event.list.EventList; import nostr.event.list.FiltersList; @@ -28,6 +30,11 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * @author eric */ @@ -46,20 +53,20 @@ public void testBaseReqMessageDecoder() { final var message = new BaseMessageDecoder(parseTarget).decode(); - Assertions.assertEquals(Command.REQ.toString(), message.getCommand()); - Assertions.assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((ReqMessage) message).getSubscriptionId()); - Assertions.assertEquals(1, ((ReqMessage) message).getFiltersList().size()); + assertEquals(Command.REQ.toString(), message.getCommand()); + assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((ReqMessage) message).getSubscriptionId()); + assertEquals(1, ((ReqMessage) message).getFiltersList().size()); var filters = ((ReqMessage) message).getFiltersList().getList().get(0); - Assertions.assertEquals(1, filters.getKinds().size()); - Assertions.assertEquals(1, filters.getKinds().getList().get(0).intValue()); + assertEquals(1, filters.getKinds().size()); + assertEquals(1, filters.getKinds().getList().get(0).intValue()); - Assertions.assertEquals(1, filters.getAuthors().size()); - Assertions.assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", filters.getAuthors().getList().get(0).toBech32String()); + assertEquals(1, filters.getAuthors().size()); + assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", filters.getAuthors().getList().get(0).toBech32String()); - Assertions.assertEquals(1, filters.getReferencedEvents().size()); - Assertions.assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", filters.getReferencedEvents().getList().get(0).getId()); + assertEquals(1, filters.getReferencedEvents().size()); + assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", filters.getReferencedEvents().getList().get(0).getId()); } @Test @@ -80,7 +87,7 @@ public void testBaseReqMessageEncoder() { var message = new BaseMessageDecoder(jsonMessage).decode(); - Assertions.assertEquals(reqMessage, message); + assertEquals(reqMessage, message); } @Test @@ -102,13 +109,13 @@ public void testBaseEventMessageDecoder() { final var message = new BaseMessageDecoder(parseTarget).decode(); - Assertions.assertEquals(Command.EVENT.toString(), message.getCommand()); + assertEquals(Command.EVENT.toString(), message.getCommand()); final var event = (GenericEvent) (((EventMessage) message).getEvent()); - Assertions.assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((EventMessage) message).getSubscriptionId()); - Assertions.assertEquals(1, event.getKind().intValue()); - Assertions.assertEquals(1686199583, event.getCreatedAt().longValue()); - Assertions.assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", event.getId()); + assertEquals("npub17x6pn22ukq3n5yw5x9prksdyyu6ww9jle2ckpqwdprh3ey8qhe6stnpujh", ((EventMessage) message).getSubscriptionId()); + assertEquals(1, event.getKind().intValue()); + assertEquals(1686199583, event.getCreatedAt().longValue()); + assertEquals("fc7f200c5bed175702bd06c7ca5dba90d3497e827350b42fc99c3a4fa276a712", event.getId()); } @Test @@ -139,7 +146,7 @@ public void testBaseEventMessageMarkerDecoder() { for (BaseTag t : tags) { if (t.getCode().equalsIgnoreCase("e")) { EventTag et = (EventTag) t; - Assertions.assertEquals(Marker.ROOT, et.getMarker()); + assertEquals(Marker.ROOT, et.getMarker()); } } } @@ -151,10 +158,10 @@ public void testGenericTagDecoder() { var tag = new GenericTagDecoder(jsonString).decode(); - Assertions.assertEquals("saturn", tag.getCode()); - Assertions.assertEquals(2, tag.getAttributes().size()); - Assertions.assertEquals("jetpack", ((ElementAttribute) (tag.getAttributes().toArray())[0]).getValue()); - Assertions.assertEquals(false, Boolean.valueOf(((ElementAttribute) (tag.getAttributes().toArray())[1]).getValue().toString())); + assertEquals("saturn", tag.getCode()); + assertEquals(2, tag.getAttributes().size()); + assertEquals("jetpack", ((ElementAttribute) (tag.getAttributes().toArray())[0]).getValue()); + assertEquals(false, Boolean.valueOf(((ElementAttribute) (tag.getAttributes().toArray())[1]).getValue().toString())); } @Test @@ -168,9 +175,9 @@ public void testDeserializeTag() throws NostrException { Assertions.assertTrue(tag instanceof PubKeyTag); PubKeyTag pTag = (PubKeyTag) tag; - Assertions.assertEquals("wss://nostr.java", pTag.getMainRelayUrl()); - Assertions.assertEquals(npubHex, pTag.getPublicKey().toString()); - Assertions.assertEquals("alice", pTag.getPetName()); + assertEquals("wss://nostr.java", pTag.getMainRelayUrl()); + assertEquals(npubHex, pTag.getPublicKey().toString()); + assertEquals("alice", pTag.getPetName()); } @Test @@ -184,6 +191,69 @@ public void testDeserializeGenericTag() throws NostrException { Assertions.assertTrue(tag instanceof GenericTag); GenericTag gTag = (GenericTag) tag; - Assertions.assertEquals("gt", gTag.getCode()); + assertEquals("gt", gTag.getCode()); + } + + @Test + public void testFiltersEncoder() { + System.out.println("testFiltersEncoder"); + + String new_geohash = "2vghde"; + List geohashList = new ArrayList<>(); + geohashList.add(new_geohash); + GenericTagQuery genericTagQuery = new GenericTagQuery(); + genericTagQuery.setTagName('g'); + genericTagQuery.setValue(geohashList); + Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + + FiltersEncoder encoder = new FiltersEncoder(filters); + String jsonMessage = encoder.encode(); + assertEquals("{\"#g\":[\"2vghde\"]}", jsonMessage); + } + + @Test + public void testReqMessageSerializer() throws NostrException { + System.out.println("testReqMessageSerializer"); + + String new_geohash = "2vghde"; + List geohashList = new ArrayList<>(); + geohashList.add(new_geohash); + GenericTagQuery genericTagQuery = new GenericTagQuery(); + genericTagQuery.setTagName('g'); + genericTagQuery.setValue(geohashList); + Filters filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + + ReqMessage reqMessage = new ReqMessage("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9", new FiltersList(filters)); + BaseMessageEncoder encoder = new BaseMessageEncoder(reqMessage); + String jsonMessage = encoder.encode(); + + assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#g\":[\"2vghde\"]}]", jsonMessage); + + List hashtagList = new ArrayList<>(); + hashtagList.add("bitcoin"); + hashtagList.add("ethereum"); + hashtagList.add("dogecoin"); + genericTagQuery = new GenericTagQuery(); + genericTagQuery.setTagName('t'); + + genericTagQuery.setValue(hashtagList); + filters = Filters.builder().genericTagQuery(genericTagQuery).build(); + + reqMessage = new ReqMessage("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9", new FiltersList(filters)); + encoder = new BaseMessageEncoder(reqMessage); + jsonMessage = encoder.encode(); + + assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#t\":[\"bitcoin\",\"ethereum\",\"dogecoin\"]}]", jsonMessage); + + var rawPubKey = Bech32.decode("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9").data; + var filters1 = Filters.builder().authors(new PublicKeyList(new PublicKey(rawPubKey))).build(); + reqMessage = new ReqMessage("npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9", new FiltersList(filters, filters1)); + assertEquals(2, reqMessage.getFiltersList().size()); + + encoder = new BaseMessageEncoder(reqMessage); + jsonMessage = encoder.encode(); + + assertEquals("181f161a0c180506171201070014180e100a1a0a0e1c090a191715021c0c0e1c01090b0f111704150b0b0000131b1e190f120300", new PublicKey(rawPubKey).toString()); + assertEquals("[\"REQ\",\"npub1clk6vc9xhjp8q5cws262wuf2eh4zuvwupft03hy4ttqqnm7e0jrq3upup9\",{\"#t\":[\"bitcoin\",\"ethereum\",\"dogecoin\"]},{\"authors\":[\"181f161a0c180506171201070014180e100a1a0a0e1c090a191715021c0c0e1c01090b0f111704150b0b0000131b1e190f120300\"]}]", jsonMessage); } }