From d36b6b51c7353e40ab98d959c8ada3a91f30e34c Mon Sep 17 00:00:00 2001 From: vishalxl <> Date: Sun, 7 Aug 2022 23:08:47 +0530 Subject: [PATCH] added argument parsing, now a request string can be sent to a relay, and its results printed as tree --- bin/nostr_console.dart | 55 ++++++++++++++++++++++++++++++--------- lib/nostr_console_ds.dart | 17 +++++++++--- lib/relays.dart | 22 +++++++++++----- pubspec.yaml | 2 ++ 4 files changed, 73 insertions(+), 23 deletions(-) diff --git a/bin/nostr_console.dart b/bin/nostr_console.dart index 295ea94..180c66c 100644 --- a/bin/nostr_console.dart +++ b/bin/nostr_console.dart @@ -1,16 +1,56 @@ import 'dart:io'; import 'package:nostr_console/nostr_console_ds.dart'; import 'package:nostr_console/relays.dart'; +import 'package:args/args.dart'; + var userPublickey = "3235036bd0957dfb27ccda02d452d7c763be40c91a1ac082ba6983b25238388c"; // vishalxl // var userPublickey = "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"; // jb55 // var userPublickey = "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"; // fiatjaf +const request = "request"; +void printEventsAsTree(events) { + if( events.length == 0) { + stdout.write("events length = 0\n"); + return; + } + events.removeWhere( (item) => item.eventData.kind != 1 ); + // remove duplicate events + final ids = Set(); + events.retainWhere((x) => ids.add(x.eventData.id)); -Future main() async { + // create tree from events + Tree node = Tree.fromEvents(events); + + // print all the events in tree form + node.printTree(0, true); + + print('\nnumber of all events: ${events.length}'); + +} + +Future main(List arguments) async { List events = []; int numEvents = 6; + + String requestString = ""; + //final parser = ArgParser()..addFlag(request, negatable: false, abbr: 'r')..addOption(request); + final parser = ArgParser()..addOption(request, abbr: 'r'); + + ArgResults argResults = parser.parse(arguments); + + + if( argResults[request] != null) { + stdout.write("got argument request ${argResults[request]}"); + sendRequest("wss://nostr-pub.wellorder.net", argResults[request], events); + Future.delayed(const Duration(milliseconds: 6000), () { + printEventsAsTree(events); + exit(0); + }); + return; + } + getUserEvents(defaultServerUrl, userPublickey, events, numEvents); print('waiting for user events to come in'); @@ -37,18 +77,7 @@ Future main() async { } Future.delayed(const Duration(milliseconds: 4000), () { - events.removeWhere( (item) => item.eventData.kind != 1 ); - // remove duplicate events - final ids = Set(); - events.retainWhere((x) => ids.add(x.eventData.id)); - - // create tree from events - Tree node = Tree.fromEvents(events); - - // print all the events in tree form - node.printTree(0, true); - - print('\nnumber of all events: ${events.length}'); + printEventsAsTree(events); exit(0); }); }); diff --git a/lib/nostr_console_ds.dart b/lib/nostr_console_ds.dart index 4447937..b1f94d5 100644 --- a/lib/nostr_console_ds.dart +++ b/lib/nostr_console_ds.dart @@ -217,7 +217,6 @@ class Tree { // @method create top level Tree from events. // first create a map. then add all top trees to the final list/ChildTrees. then add children to it. - factory Tree.fromEvents(List events) { stdout.write("in factory fromEvents list. number of events: ${events.length}\n"); @@ -229,8 +228,16 @@ class Tree { //stdout.write(m); List processed = []; - m.forEach((key, value) { - if( !processed.contains(key)) { + m.forEach((key, value) { + bool alreadyProcessed = false; + for( int i = 0; i < processed.length; i++) { + if( processed[i] == key) { + alreadyProcessed = true; + break; + } + } + + if( !alreadyProcessed) { if( !value.e.eventData.eTagsRest.isNotEmpty ) { // in case this node is a parent, then move it to processed() processed.add(key); @@ -240,19 +247,21 @@ class Tree { String id = key; String parentId = value.e.eventData.getParent(); m[parentId]?.addChildNode(value); + processed.add(key); } } else { // entry already exists // do nothing } }); + // add parent trees as top level child trees of this tree for( var value in m.values) { if( !value.e.eventData.eTagsRest.isNotEmpty) { // if its a parent childTrees.add(value); } } - stdout.write("Ending: factory fromEvents list. number of events: ${events.length}\n"); + stdout.write("Ending: factory fromEvents list. number of processed events: ${processed.length}\n"); return Tree( events[0], childTrees); // TODO remove events[0] } diff --git a/lib/relays.dart b/lib/relays.dart index 678a0d5..919c9be 100644 --- a/lib/relays.dart +++ b/lib/relays.dart @@ -35,7 +35,7 @@ class Relays { * @connect Connect to given relay and get all events for the given publicKey and insert the * received events in the given List */ - void connect(String relay, String publicKey, List events, int numEventsToGet) { + void gerUserEvents(String relay, String publicKey, List events, int numEventsToGet) { // following is too restrictive. TODO improve it for(int i = 0; i < users.length; i++) { @@ -43,6 +43,12 @@ class Relays { return; } } + users.add(publicKey); + String request = getSubscriptionRequest(publicKey, numEventsToGet); + sendRequest(relay, request, events); + } + + void sendRequest(String relay, String request, List events) { Future? fws; if(relays.containsKey(relay)) { @@ -84,9 +90,9 @@ class Relays { } } - users.add(publicKey); - print('sending request ${getSubscriptionRequest(publicKey, numEventsToGet)} to $relay'); - fws?.then((WebSocket ws) { ws.add(getSubscriptionRequest(publicKey, numEventsToGet)); }); + + print('sending request: $request to $relay'); + fws?.then((WebSocket ws) { ws.add(request); }); } @@ -101,10 +107,14 @@ Relays relays = Relays(Map(), []); void getFeed(List contacts, events, numEventsToGet) { for( int i = 0; i < contacts.length; i++) { var contact = contacts[i]; - relays.connect(contact.relay, contact.id, events, numEventsToGet); + relays.gerUserEvents(contact.relay, contact.id, events, numEventsToGet); } } void getUserEvents(serverUrl, publicKey, events, numUserEvents) { - relays.connect(serverUrl, publicKey, events, numUserEvents); + relays.gerUserEvents(serverUrl, publicKey, events, numUserEvents); +} + +void sendRequest(serverUrl, request, events) { + relays.sendRequest(serverUrl, request, events); } \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 53dac77..e1a8cf4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,3 +12,5 @@ environment: dev_dependencies: lints: ^2.0.0 test: ^1.16.0 +dependencies: + args: ^2.3.1