added argument parsing, now a request string can be sent to a relay, and its results printed as tree

This commit is contained in:
vishalxl 2022-08-07 23:08:47 +05:30
parent 701e357d87
commit d36b6b51c7
4 changed files with 73 additions and 23 deletions

View File

@ -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<void> 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<void> main(List<String> arguments) async {
List<Event> 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<void> 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);
});
});

View File

@ -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<Event> events) {
stdout.write("in factory fromEvents list. number of events: ${events.length}\n");
@ -230,7 +229,15 @@ class Tree {
List<String> processed = [];
m.forEach((key, value) {
if( !processed.contains(key)) {
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]
}

View File

@ -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<Event>
*/
void connect(String relay, String publicKey, List<Event> events, int numEventsToGet) {
void gerUserEvents(String relay, String publicKey, List<Event> 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<Event> events) {
Future<WebSocket>? 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<Contact> 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);
}

View File

@ -12,3 +12,5 @@ environment:
dev_dependencies:
lints: ^2.0.0
test: ^1.16.0
dependencies:
args: ^2.3.1