diff --git a/lib/console_ui.dart b/lib/console_ui.dart index 68a3ef2..fa0b94a 100644 --- a/lib/console_ui.dart +++ b/lib/console_ui.dart @@ -269,14 +269,16 @@ Future otherMenuUi(Store node) async { // if contact list was found, get user's feed, and keep the contact list for later use String authorName = gKindONames[pubkey.first]?.name??""; printUnderlined("\nProfile for User"); - print("\nName : $authorName ( ${pubkey.first} )."); + print("\nName : $authorName ( ${pubkey.first} )."); if (contactEvent != null ) { String about = gKindONames[pubkey.first]?.about??""; String picture = gKindONames[pubkey.first]?.picture??""; + int dateLastUpdated = gKindONames[pubkey.first]?.createdAt??0; - print("About : $about"); - print("Picture: $picture"); + print("About : $about"); + print("Picture : $picture"); + print("Last Updated: ${getPrintableDate(dateLastUpdated)}"); if( contactEvent.eventData.contactList.any((x) => (x.id == userPublicKey))) { print("\n* They follow you"); diff --git a/lib/event_ds.dart b/lib/event_ds.dart index 8858fff..f5d12db 100644 --- a/lib/event_ds.dart +++ b/lib/event_ds.dart @@ -463,6 +463,7 @@ class Event { void printEvent(int depth) { eventData.printEventData(depth); + //print("\n$seenOnRelays"); //stdout.write("\n$originalJson --------------------------------\n\n"); } diff --git a/lib/relays.dart b/lib/relays.dart index ab6fa75..b39cc23 100644 --- a/lib/relays.dart +++ b/lib/relays.dart @@ -46,18 +46,26 @@ class Relays { return Relays(mapRelay, {}, {}); } + + void getKindEvents(List kind, String relayUrl, int limit, int sinceWhen) { + kind.toString(); + String subscriptionId = "kind_" + kind.toString() + "_" + relayUrl.substring(6); + String request = getKindRequest(subscriptionId, kind, limit, sinceWhen); + + sendRequest(relayUrl, request); + } /* * @connect Connect to given relay and get all events for the given publicKey and insert the * received events in the given List */ - void getUserEvents(String relayUrl, String publicKey, int numEventsToGet, int sinceWhen) { + void getUserEvents(String relayUrl, String publicKey, int limit, int sinceWhen) { for(int i = 0; i < gBots.length; i++) { // ignore bots if( publicKey == gBots[i]) { return; } } - String subscriptionId = "single_user" + (relays[relayUrl]?.numRequestsSent??"").toString(); + String subscriptionId = "single_user" + (relays[relayUrl]?.numRequestsSent??"").toString() + "_" + relayUrl.substring(6); if( relays.containsKey(relayUrl)) { List? users = relays[relayUrl]?.users; if( users != null) { // get a user only if it has not already been requested @@ -71,7 +79,7 @@ class Relays { } } - String request = getUserRequest(subscriptionId, publicKey, numEventsToGet, sinceWhen); + String request = getUserRequest(subscriptionId, publicKey, limit, sinceWhen); sendRequest(relayUrl, request); } @@ -79,7 +87,7 @@ class Relays { * @connect Connect to given relay and get all events for multiple users/publicKey and insert the * received events in the given List */ - void getMultiUserEvents(String relayUrl, List publicKeys, int numEventsToGet, int sinceWhen) { + void getMultiUserEvents(String relayUrl, List publicKeys, int limit, int sinceWhen) { List reqKeys = []; if( relays.containsKey(relayUrl)) { @@ -99,9 +107,9 @@ class Relays { } } // if relay exists and has a user list - String subscriptionId = "multiple_user" + (relays[relayUrl]?.numRequestsSent??"").toString(); + String subscriptionId = "multiple_user" + (relays[relayUrl]?.numRequestsSent??"").toString() + "_" + relayUrl.substring(6); - String request = getMultiUserRequest( subscriptionId, reqKeys, numEventsToGet, sinceWhen); + String request = getMultiUserRequest( subscriptionId, reqKeys, limit, sinceWhen); sendRequest(relayUrl, request); } @@ -168,7 +176,7 @@ class Relays { return; } }, - onError: (err) { print("\n${gWarningColor}Warning: In SendRequest creating connection onError. Kindly check your internet connection or change the relay by command line --relay="); print(gColorEndMarker); }, + onError: (err) { print("\n${gWarningColor}Warning: In SendRequest creating connection to $relay. Kindly check your internet connection. Or maybe only this relay is down.>"); print(gColorEndMarker); }, onDone: () { if( gDebug != 0) print('Info: In onDone'); } ); } on WebSocketException { @@ -203,6 +211,26 @@ class Relays { Relays relays = Relays({}, {}, {}); +String getKindRequest(String subscriptionId, List kind, int limit, int sinceWhen) { + String strTime = ""; + if( sinceWhen != 0) { + strTime = ', "since":${sinceWhen.toString()}'; + } + var strSubscription1 = '["REQ","$subscriptionId",{"kinds":['; + var strSubscription2 ='], "limit":$limit$strTime } ]'; + + String strKind = ""; + for(int i = 0; i < kind.length; i++) { + String comma = ","; + if( i == kind.length-1) { + comma = ""; + } + strKind = strKind + kind[i].toString() + comma; + } + String strRequest = strSubscription1 + strKind + strSubscription2; + //print(strRequest); + return strRequest; +} String getUserRequest(String subscriptionId, String publicKey, int numUserEvents, int sinceWhen) { String strTime = ""; if( sinceWhen != 0) { @@ -232,35 +260,29 @@ String getMultiUserRequest(String subscriptionId, List publicKeys, int n return strSubscription1 + s + strSubscription2; } -List getContactFeed(List relayUrls, List contacts, int numEventsToGet, int sinceWhen) { +void getContactFeed(List relayUrls, List contacts, int numEventsToGet, int sinceWhen) { - // maps from relay url to list of users that it supplies events for - Map > mContacts = {}; - List contactList = []; + for( int i = 0; i < contacts.length; i += gMaxAuthorsInOneRequest) { - // creat the mapping between relay and its hosted users - for( int i = 0; i < contacts.length; i++) { - if( mContacts.containsKey(contacts[i].relay) ) { - mContacts[contacts[i].relay]?.add(contacts[i].id); - } else { - mContacts[contacts[i].relay] = [contacts[i].id]; + // for last iteration change upper limit + int upperLimit = (i + gMaxAuthorsInOneRequest) > contacts.length? + (contacts.length - i): gMaxAuthorsInOneRequest; + + List groupContacts = []; + for( int j = 0; j < i + upperLimit; j++) { + groupContacts.add(contacts[i + j]); } - contactList.add(contacts[i].id); + + //print( "i = $i upperLimit = $upperLimit") ; + relayUrls.forEach((relayUrl) { + relays.getMultiUserEvents(relayUrl, groupContacts, numEventsToGet, sinceWhen); + }); + } - // send request for the users events to the relays - mContacts.forEach((key, value) { - //relays.getMultiUserEvents(key, value, numEventsToGet, sinceWhen); - - relayUrls.forEach((relayUrl) { - relays.getMultiUserEvents(relayUrl, value, numEventsToGet, sinceWhen); - }); - - }); - // return contact list for use by caller - return contactList; + return; } void getUserEvents(List serverUrls, String publicKey, int numUserEvents, int sinceWhen) { @@ -269,6 +291,12 @@ void getUserEvents(List serverUrls, String publicKey, int numUserEvents, }); } +getKindEvents(List kind, List serverUrls, int limit, int sinceWhen) { + serverUrls.forEach((serverUrl) { + relays.getKindEvents(kind, serverUrl, limit, sinceWhen); + }); +} + void getMultiUserEvents(List serverUrls, List publicKeys, int numUserEvents, int sinceWhen) { if( gDebug > 0) print("Sending multi user request for ${publicKeys.length} users"); diff --git a/lib/settings.dart b/lib/settings.dart index f5632c6..c2ce8ff 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -15,8 +15,8 @@ const int gDontSaveBeforeDays = 100; // dont save events older than this m bool gOverWriteFile = false; // overwrite the file, and don't just append. Will write all events in memory. -const int gDaysToGetEventsFor = 100; // when getting events, this is the since field (unless a fully formed request is given in command line) -const int gLimitPerSubscription = 10000; +const int gDaysToGetEventsFor = 30; // when getting events, this is the since field (unless a fully formed request is given in command line) +const int gLimitPerSubscription = 5000; // don't show notifications for events that are older than 5 days and come when program is running // applicable only for notifications and not for search results. Search results set a flag in EventData and don't use this variable @@ -50,6 +50,23 @@ const String gDefaultPublicKey = "e8caa2028a7090ffa85f1afee67451b309ba2f9dee655 String userPrivateKey = gDefaultPrivateKey; String userPublicKey = gDefaultPublicKey; +// default follows; taken from nostr.io/stats +List gDefaultFollows = [ + "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681", //damus + "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245", // jb55 + "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d", // fiatjaf + "2ef93f01cd2493e04235a6b87b10d3c4a74e2a7eb7c3caf168268f6af73314b5", // unclebobmarting + "ed1d0e1f743a7d19aa2dfb0162df73bacdbc699f67cc55bb91a98c35f7deac69", // Melvincarvalho + "35d26e4690cbe1a898af61cc3515661eb5fa763b57bd0b42e45099c8b32fd50f", // scsibug + "9ec7a778167afb1d30c4833de9322da0c08ba71a69e1911d5578d3144bb56437", // balas + "46fcbe3065eaf1ae7811465924e48923363ff3f526bd6f73d7c184b16bd8ce4d", // Giszmo + "8c0da4862130283ff9e67d889df264177a508974e2feb96de139804ea66d6168", // monlovesmango + "3235036bd0957dfb27ccda02d452d7c763be40c91a1ac082ba6983b25238388c", // vishalxl + "c5072866b41d6b88ab2ffee16ad7cb648f940867371a7808aaa94cf7d01f4188", // randymcmillan + "2183e94758481d0f124fbd93c56ccaa45e7e545ceeb8d52848f98253f497b975", // Brill + "c7eda660a6bc8270530e82b4a7712acdea2e31dc0a56f8dc955ac009efd97c86" ]; // shawn + + // dummy account pubkey const String gDummyAccountPubkey = "Non"; diff --git a/lib/tree_ds.dart b/lib/tree_ds.dart index f7077d2..f68aad1 100644 --- a/lib/tree_ds.dart +++ b/lib/tree_ds.dart @@ -789,6 +789,10 @@ class Store { for( int i = 0; i < gapBetweenTopTrees; i++ ) { stdout.write("\n"); } + + String topPostLine = getDepthSpaces(depth+1); + topPostLine += ("+\n"); + stdout.write(topPostLine); numPrinted += topPosts[i].printTree(depth+1, newerThan); }