mirror of
https://github.com/vishalxl/nostr_console.git
synced 2025-12-06 02:31:08 +01:00
sorted direct room main view
made gStore a global. Made directRooms a list rather than a map.
This commit is contained in:
@@ -288,6 +288,7 @@ Future<void> main(List<String> arguments) async {
|
|||||||
|
|
||||||
// Creat tree from all events read form file
|
// Creat tree from all events read form file
|
||||||
Store node = getTree(initialEvents);
|
Store node = getTree(initialEvents);
|
||||||
|
gStore = node;
|
||||||
|
|
||||||
clearEvents();
|
clearEvents();
|
||||||
mainMenuUi(node);
|
mainMenuUi(node);
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import 'package:kepler/kepler.dart';
|
|||||||
|
|
||||||
int gDebug = 0;
|
int gDebug = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// translate
|
// translate
|
||||||
GoogleTranslator? translator; // initialized in main when argument given
|
GoogleTranslator? translator; // initialized in main when argument given
|
||||||
|
|
||||||
@@ -131,11 +133,12 @@ class EventData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( json['id'] == gCheckEventId) {
|
if( gDebug > 0 && json['id'] == gCheckEventId) {
|
||||||
print("\n----------------------------------------Creating EventData with content: ${json['content']}");
|
print("\n----------------------------------------Creating EventData with content: ${json['content']}");
|
||||||
print("In Event fromJson: got message: $gCheckEventId");
|
print("In Event fromJson: got message: $gCheckEventId");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return EventData(json['id'] as String, json['pubkey'] as String,
|
return EventData(json['id'] as String, json['pubkey'] as String,
|
||||||
json['created_at'] as int, json['kind'] as int,
|
json['created_at'] as int, json['kind'] as int,
|
||||||
json['content'].trim() as String,
|
json['content'].trim() as String,
|
||||||
@@ -793,6 +796,8 @@ bool isWhitespace(String s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension StringX on String {
|
extension StringX on String {
|
||||||
|
|
||||||
|
|
||||||
isChannelPageNumber(int max) {
|
isChannelPageNumber(int max) {
|
||||||
|
|
||||||
int? n = int.tryParse(this);
|
int? n = int.tryParse(this);
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
|
|
||||||
final log = Logger('ExampleLogger');
|
final log = Logger('ExampleLogger');
|
||||||
|
|
||||||
// for debugging
|
// for debugging
|
||||||
String gCheckEventId = ""; //"1763016774ceaa8c135dce01e77923994c5afad4cd3e126704a1292ebb1a577e"; //"15d86a36a620fc1f735f2322f31366b2adde786361f568faf6a0dc8368f7e534";
|
String gCheckEventId = "d367bb6ed06c23238f1b0b68470d332c931d635b2cc85a577f487304563946ff"; //"1763016774ceaa8c135dce01e77923994c5afad4cd3e126704a1292ebb1a577e"; //"15d86a36a620fc1f735f2322f31366b2adde786361f568faf6a0dc8368f7e534";
|
||||||
|
|
||||||
const int gDefaultNumWaitSeconds = 2000; // is used in main()
|
const int gDefaultNumWaitSeconds = 2000; // is used in main()
|
||||||
|
|
||||||
@@ -16,8 +17,8 @@ bool gOverWriteFile = false; // overwrite the file, and don't ju
|
|||||||
|
|
||||||
const int gDontAddToStoreBeforeDays = 60; // events older than this are not added to the Store of all events
|
const int gDontAddToStoreBeforeDays = 60; // events older than this are not added to the Store of all events
|
||||||
|
|
||||||
const int gDaysToGetEventsFor = 70; // when getting events, this is the since field (unless a fully formed request is given in command line)
|
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;
|
const int gLimitPerSubscription = 6000;
|
||||||
|
|
||||||
// don't show notifications for events that are older than 5 days and come when program is running
|
// 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
|
// applicable only for notifications and not for search results. Search results set a flag in EventData and don't use this variable
|
||||||
|
|||||||
364
lib/tree_ds.dart
364
lib/tree_ds.dart
@@ -1,3 +1,4 @@
|
|||||||
|
import 'dart:collection';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:nostr_console/event_ds.dart';
|
import 'package:nostr_console/event_ds.dart';
|
||||||
@@ -5,16 +6,71 @@ import 'package:nostr_console/settings.dart';
|
|||||||
|
|
||||||
typedef fTreeSelector = bool Function(Tree a);
|
typedef fTreeSelector = bool Function(Tree a);
|
||||||
|
|
||||||
|
Store? gStore = null;
|
||||||
|
|
||||||
bool selectAll(Tree t) {
|
bool selectAll(Tree t) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getLatestMessageTime(List<String> _messageIds) {
|
||||||
|
if( _messageIds.length <= 0 || gStore == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int latest = 0;
|
||||||
|
for(int i = 0; i < _messageIds.length; i++) {
|
||||||
|
if( gStore != null) {
|
||||||
|
Tree? tree = (gStore?.allChildEventsMap[_messageIds[i]] );
|
||||||
|
if( tree != null) {
|
||||||
|
EventData ed = tree.event.eventData;
|
||||||
|
if( ed.createdAt > latest) {
|
||||||
|
latest = ed.createdAt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return latest;
|
||||||
|
}
|
||||||
|
|
||||||
|
DirectMessageRoom? getDirectRoom(List<DirectMessageRoom> rooms, String otherPubkey) {
|
||||||
|
for( int i = 0; i < rooms.length; i++) {
|
||||||
|
if( rooms[i].otherPubkey == otherPubkey) {
|
||||||
|
return rooms[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int directRoomCompareTo(DirectMessageRoom a, DirectMessageRoom b) {
|
||||||
|
|
||||||
|
if( gStore == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int otherLatest = getLatestMessageTime(b.messageIds);
|
||||||
|
int thisLatest = getLatestMessageTime(a.messageIds);
|
||||||
|
|
||||||
|
if( thisLatest < otherLatest) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
if( thisLatest == otherLatest) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class ScrollableMessages {
|
class ScrollableMessages {
|
||||||
String topHeader;
|
String topHeader;
|
||||||
List<String> messageIds;
|
List<String> messageIds;
|
||||||
|
|
||||||
ScrollableMessages(this.topHeader, this.messageIds);
|
ScrollableMessages(this.topHeader, this.messageIds);
|
||||||
|
|
||||||
|
|
||||||
void printOnePage(Map<String, Tree> tempChildEventsMap, [int page = 1]) {
|
void printOnePage(Map<String, Tree> tempChildEventsMap, [int page = 1]) {
|
||||||
if( page < 1) {
|
if( page < 1) {
|
||||||
if( gDebug > 0) log.info("In ScrollableMessages::printOnepage got page = $page");
|
if( gDebug > 0) log.info("In ScrollableMessages::printOnepage got page = $page");
|
||||||
@@ -82,7 +138,46 @@ class DirectMessageRoom extends ScrollableMessages{
|
|||||||
super ( "${getAuthorName(otherPubkey)} ($otherPubkey)", messageIds) {
|
super ( "${getAuthorName(otherPubkey)} ($otherPubkey)", messageIds) {
|
||||||
//print ("Created direct room with otherPubkey = $otherPubkey");
|
//print ("Created direct room with otherPubkey = $otherPubkey");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addMessageToDirectRoom(String messageId, Map<String, Tree> tempChildEventsMap) {
|
||||||
|
int newEventTime = (tempChildEventsMap[messageId]?.event.eventData.createdAt??0);
|
||||||
|
|
||||||
|
DirectMessageRoom room = this;
|
||||||
|
|
||||||
|
if(gDebug> 0) print("direct room has ${room.messageIds.length} messages already. adding new one to it. ");
|
||||||
|
|
||||||
|
for(int i = 0; i < room.messageIds.length; i++) {
|
||||||
|
int eventTime = (tempChildEventsMap[room.messageIds[i]]?.event.eventData.createdAt??0);
|
||||||
|
if( newEventTime < eventTime) {
|
||||||
|
// shift current i and rest one to the right, and put event Time here
|
||||||
|
if(gDebug> 0) print("In addMessageToChannel: inserted in middle to channel ${room.otherPubkey} ");
|
||||||
|
room.messageIds.insert(i, messageId);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if(gDebug> 0) print("In addMessageToChannel: added to channel ${room.otherPubkey} ");
|
||||||
|
|
||||||
|
// insert at end
|
||||||
|
room.messageIds.add(messageId);
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isPrivateMessageRoom() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printDirectMessageRoom(Store store, [int page = 1]) {
|
||||||
|
if( page < 1) {
|
||||||
|
if( gDebug > 0) log.info("In printChannel got page = $page");
|
||||||
|
page = 1;
|
||||||
|
}
|
||||||
|
printOnePage(store.allChildEventsMap, page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Tree {
|
class Tree {
|
||||||
Event event; // is dummy for very top level tree. Holds an event otherwise.
|
Event event; // is dummy for very top level tree. Holds an event otherwise.
|
||||||
@@ -333,8 +428,9 @@ class Store {
|
|||||||
|
|
||||||
Map<String, Tree> allChildEventsMap; // has events of kind typesInEventMap
|
Map<String, Tree> allChildEventsMap; // has events of kind typesInEventMap
|
||||||
List<String> eventsWithoutParent;
|
List<String> eventsWithoutParent;
|
||||||
|
|
||||||
Map<String, ChatRoom> chatRooms = {};
|
Map<String, ChatRoom> chatRooms = {};
|
||||||
Map<String, DirectMessageRoom> directRooms = {};
|
List<DirectMessageRoom> directRooms = [];
|
||||||
|
|
||||||
Store(this.topPosts, this.allChildEventsMap, this.eventsWithoutParent, this.chatRooms, this.directRooms) {
|
Store(this.topPosts, this.allChildEventsMap, this.eventsWithoutParent, this.chatRooms, this.directRooms) {
|
||||||
allChildEventsMap.forEach((eventId, tree) {
|
allChildEventsMap.forEach((eventId, tree) {
|
||||||
@@ -406,7 +502,7 @@ class Store {
|
|||||||
} // end switch
|
} // end switch
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handleDirectMessages( Map<String, DirectMessageRoom> directRooms, Map<String, Tree> tempChildEventsMap, Event ce) {
|
static void handleDirectMessages( List<DirectMessageRoom> directRooms, Map<String, Tree> tempChildEventsMap, Event ce) {
|
||||||
String eId = ce.eventData.id;
|
String eId = ce.eventData.id;
|
||||||
int eKind = ce.eventData.kind;
|
int eKind = ce.eventData.kind;
|
||||||
|
|
||||||
@@ -419,14 +515,25 @@ class Store {
|
|||||||
{
|
{
|
||||||
String directRoomId = getDirectRoomId(ce.eventData);
|
String directRoomId = getDirectRoomId(ce.eventData);
|
||||||
if( directRoomId != "") {
|
if( directRoomId != "") {
|
||||||
if( directRooms.containsKey(directRoomId)) {
|
|
||||||
|
bool alreadyExists = false;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for(i = 0; i < directRooms.length; i++) {
|
||||||
|
if ( directRoomId == directRooms[i].otherPubkey) {
|
||||||
|
alreadyExists = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( alreadyExists) {
|
||||||
if( gDebug > 0) print("Adding new message ${ce.eventData.id} to a direct room $directRoomId sender pubkey = ${ce.eventData.pubkey}. ");
|
if( gDebug > 0) print("Adding new message ${ce.eventData.id} to a direct room $directRoomId sender pubkey = ${ce.eventData.pubkey}. ");
|
||||||
addMessageToDirectRoom(directRoomId, eId, tempChildEventsMap, directRooms);
|
directRooms[i].addMessageToDirectRoom( eId, tempChildEventsMap);
|
||||||
} else {
|
} else {
|
||||||
List<String> temp = [];
|
List<String> temp = [];
|
||||||
temp.add(eId);
|
temp.add(eId);
|
||||||
DirectMessageRoom newDirectRoom= DirectMessageRoom(directRoomId, temp);
|
DirectMessageRoom newDirectRoom= DirectMessageRoom(directRoomId, temp);
|
||||||
directRooms[directRoomId] = newDirectRoom;
|
directRooms.add( newDirectRoom);
|
||||||
if( gDebug > 0) print("Adding new message ${ce.eventData.id} to NEW direct room $directRoomId. sender pubkey = ${ce.eventData.pubkey}.");
|
if( gDebug > 0) print("Adding new message ${ce.eventData.id} to NEW direct room $directRoomId. sender pubkey = ${ce.eventData.pubkey}.");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -444,7 +551,9 @@ class Store {
|
|||||||
// first create a map. then process each element in the map by adding it to its parent ( if its a child tree)
|
// first create a map. then process each element in the map by adding it to its parent ( if its a child tree)
|
||||||
factory Store.fromEvents(Set<Event> events) {
|
factory Store.fromEvents(Set<Event> events) {
|
||||||
if( events.isEmpty) {
|
if( events.isEmpty) {
|
||||||
return Store( [], {}, [], {}, {});
|
List<DirectMessageRoom> temp = [];
|
||||||
|
|
||||||
|
return Store( [], {}, [], {}, temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a map tempChildEventsMap from list of events, key is eventId and value is event itself
|
// create a map tempChildEventsMap from list of events, key is eventId and value is event itself
|
||||||
@@ -465,7 +574,8 @@ class Store {
|
|||||||
List<Tree> topLevelTrees = [];// this will become the children of the main top node. These are events without parents, which are printed at top.
|
List<Tree> topLevelTrees = [];// this will become the children of the main top node. These are events without parents, which are printed at top.
|
||||||
List<String> tempWithoutParent = [];
|
List<String> tempWithoutParent = [];
|
||||||
Map<String, ChatRoom> rooms = {};
|
Map<String, ChatRoom> rooms = {};
|
||||||
Map<String, DirectMessageRoom> tempDirectRooms= {};
|
List<DirectMessageRoom> tempDirectRooms = [];
|
||||||
|
|
||||||
|
|
||||||
int numEventsNotPosts = 0; // just for debugging info
|
int numEventsNotPosts = 0; // just for debugging info
|
||||||
int numKind40Events = 0;
|
int numKind40Events = 0;
|
||||||
@@ -623,9 +733,10 @@ class Store {
|
|||||||
//print("in insert events: got directRoomId = ${directRoomId}");
|
//print("in insert events: got directRoomId = ${directRoomId}");
|
||||||
|
|
||||||
if( directRoomId != "") {
|
if( directRoomId != "") {
|
||||||
if( directRooms.containsKey(directRoomId)) {
|
DirectMessageRoom? room = getDirectRoom(directRooms, directRoomId);
|
||||||
|
if( room != null) {
|
||||||
if( gDebug > 0) print("added event to direct room $directRoomId in insert event");
|
if( gDebug > 0) print("added event to direct room $directRoomId in insert event");
|
||||||
addMessageToDirectRoom(directRoomId, newTree.event.eventData.id, allChildEventsMap, directRooms);
|
room.addMessageToDirectRoom(newTree.event.eventData.id, allChildEventsMap);
|
||||||
newTree.event.eventData.isNotification = true; // highlight it too in next printing
|
newTree.event.eventData.isNotification = true; // highlight it too in next printing
|
||||||
//print(" in from event: added it to a direct room");
|
//print(" in from event: added it to a direct room");
|
||||||
break;
|
break;
|
||||||
@@ -634,7 +745,7 @@ class Store {
|
|||||||
|
|
||||||
List<String> temp = [];
|
List<String> temp = [];
|
||||||
temp.add(newTree.event.eventData.id);
|
temp.add(newTree.event.eventData.id);
|
||||||
directRooms[directRoomId] = DirectMessageRoom(directRoomId, temp); // TODO sort it
|
directRooms.add(DirectMessageRoom(directRoomId, temp)); // TODO sort it
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -831,92 +942,6 @@ class Store {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @printAllChennelsInfo Print one line information about all channels, which are type 40 events ( class ChatRoom)
|
|
||||||
*/
|
|
||||||
void printDirectRoomInfo() {
|
|
||||||
print("\n\nDirect messages inbox:");
|
|
||||||
printUnderlined(" From Num of Messages Latest Message ");
|
|
||||||
directRooms.forEach((key, value) {
|
|
||||||
String name = getAuthorName(key, 4);
|
|
||||||
|
|
||||||
int numMessages = value.messageIds.length;
|
|
||||||
stdout.write("${name} ${getNumSpaces(32-name.length)} $numMessages${getNumSpaces(12- numMessages.toString().length)}");
|
|
||||||
|
|
||||||
// print latest event in one line
|
|
||||||
List<String> messageIds = value.messageIds;
|
|
||||||
for( int i = messageIds.length - 1; i >= 0; i++) {
|
|
||||||
if( allChildEventsMap.containsKey(messageIds[i])) {
|
|
||||||
Event? e = allChildEventsMap[messageIds[i]]?.event;
|
|
||||||
if( e!= null) {
|
|
||||||
String line = e.eventData.getAsLine();
|
|
||||||
stdout.write(line);
|
|
||||||
break; // print only one event, the latest one
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print("");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// shows the given directRoomId, where directRoomId is prefix-id or pubkey of the other user. returns full id of other user.
|
|
||||||
String showDirectRoom(String directRoomId, [int page = 1]) {
|
|
||||||
//print("In show DirectRoom to show with id: $directRoomId");
|
|
||||||
if( directRoomId.length > 64) { // TODO revisit cause if name is > 64 should not return
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
Set<String> lookedUpName = {};
|
|
||||||
|
|
||||||
// TODO improve lookup logic.
|
|
||||||
directRooms.forEach((roomId, directRoom) {
|
|
||||||
//print("looking up $directRoomId in $roomId ${directRoom.otherPubkey}");
|
|
||||||
if( directRoomId == roomId) {
|
|
||||||
lookedUpName.add(roomId);
|
|
||||||
}
|
|
||||||
|
|
||||||
//print("directRoom.otherPubkey = ${directRoom.otherPubkey} len = ${directRoom.otherPubkey.length}");
|
|
||||||
if( directRoom.otherPubkey.substring(0, directRoomId.length) == directRoomId){
|
|
||||||
lookedUpName.add(roomId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( getAuthorName( directRoom.otherPubkey) == directRoomId){
|
|
||||||
lookedUpName.add(roomId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
if( lookedUpName.length == 1) {
|
|
||||||
DirectMessageRoom? room = directRooms[lookedUpName.first];
|
|
||||||
if( room != null) {
|
|
||||||
printDirectMessageRoom(room, page);
|
|
||||||
return lookedUpName.first;
|
|
||||||
} else {
|
|
||||||
if( isValidPubkey(lookedUpName.first)) {
|
|
||||||
print("Could not find a conversation or room with the given id. Creating one with ${lookedUpName.first}");
|
|
||||||
createDirectRoom(directRoomId);
|
|
||||||
return directRoomId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if( lookedUpName.length > 0)
|
|
||||||
print("Got more than one public id for the name given, which are: ${lookedUpName.length}");
|
|
||||||
else {
|
|
||||||
if( isValidPubkey(directRoomId)) {
|
|
||||||
print("Could not find a conversation or room with the given id. Creating one with $directRoomId");
|
|
||||||
createDirectRoom(directRoomId);
|
|
||||||
return directRoomId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
void createDirectRoom(String directRoomId) {
|
|
||||||
if( !directRooms.containsKey(directRoomId))
|
|
||||||
directRooms[directRoomId] = DirectMessageRoom(directRoomId, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
void printChannel(ChatRoom room, [int page = 1]) {
|
void printChannel(ChatRoom room, [int page = 1]) {
|
||||||
if( page < 1) {
|
if( page < 1) {
|
||||||
if( gDebug > 0) log.info("In printChannel got page = $page");
|
if( gDebug > 0) log.info("In printChannel got page = $page");
|
||||||
@@ -926,16 +951,6 @@ class Store {
|
|||||||
room.printOnePage(allChildEventsMap, page);
|
room.printOnePage(allChildEventsMap, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printDirectMessageRoom(DirectMessageRoom directRoom, [int page = 1]) {
|
|
||||||
if( page < 1) {
|
|
||||||
if( gDebug > 0) log.info("In printChannel got page = $page");
|
|
||||||
page = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
directRoom.printOnePage(allChildEventsMap, page);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// shows the given channelId, where channelId is prefix-id or channel name as mentioned in room.name. returns full id of channel.
|
// shows the given channelId, where channelId is prefix-id or channel name as mentioned in room.name. returns full id of channel.
|
||||||
// looks for channelId in id first, then in names.
|
// looks for channelId in id first, then in names.
|
||||||
String showChannel(String channelId, [int page = 1]) {
|
String showChannel(String channelId, [int page = 1]) {
|
||||||
@@ -983,6 +998,96 @@ class Store {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @printDirectRoomInfo Print one line information about chat rooms
|
||||||
|
*/
|
||||||
|
void printDirectRoomInfo() {
|
||||||
|
directRooms.sort(directRoomCompareTo);
|
||||||
|
print("\n\nDirect messages inbox:");
|
||||||
|
printUnderlined(" From Num of Messages Latest Message ");
|
||||||
|
for( int j = 0; j < directRooms.length; j++) {
|
||||||
|
|
||||||
|
DirectMessageRoom room = directRooms[j];
|
||||||
|
String name = getAuthorName(room.otherPubkey, 4);
|
||||||
|
|
||||||
|
int numMessages = room.messageIds.length;
|
||||||
|
stdout.write("${name} ${getNumSpaces(32-name.length)} $numMessages${getNumSpaces(12- numMessages.toString().length)}");
|
||||||
|
|
||||||
|
// print latest event in one line
|
||||||
|
List<String> messageIds = room.messageIds;
|
||||||
|
for( int i = messageIds.length - 1; i >= 0; i++) {
|
||||||
|
if( allChildEventsMap.containsKey(messageIds[i])) {
|
||||||
|
Event? e = allChildEventsMap[messageIds[i]]?.event;
|
||||||
|
if( e!= null) {
|
||||||
|
String line = e.eventData.getAsLine();
|
||||||
|
stdout.write(line);
|
||||||
|
break; // print only one event, the latest one
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// shows the given directRoomId, where directRoomId is prefix-id or pubkey of the other user. returns full id of other user.
|
||||||
|
String showDirectRoom( String directRoomId, [int page = 1]) {
|
||||||
|
//print("In show DirectRoom to show with id: $directRoomId");
|
||||||
|
if( directRoomId.length > 64) { // TODO revisit cause if name is > 64 should not return
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
Set<String> lookedUpName = {};
|
||||||
|
|
||||||
|
// TODO improve lookup logic.
|
||||||
|
for( int j = 0; j < directRooms.length; j++) {
|
||||||
|
String roomId = directRooms[j].otherPubkey;
|
||||||
|
//print("looking up $directRoomId in $roomId ${directRoom.otherPubkey}");
|
||||||
|
if( directRoomId == roomId) {
|
||||||
|
lookedUpName.add(roomId);
|
||||||
|
}
|
||||||
|
|
||||||
|
//print("directRoom.otherPubkey = ${directRoom.otherPubkey} len = ${directRoom.otherPubkey.length}");
|
||||||
|
if( directRooms[j].otherPubkey.substring(0, directRoomId.length) == directRoomId){
|
||||||
|
lookedUpName.add(roomId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( getAuthorName( directRooms[j].otherPubkey) == directRoomId){
|
||||||
|
lookedUpName.add(roomId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if( lookedUpName.length == 1) {
|
||||||
|
DirectMessageRoom? room = getDirectRoom(directRooms, lookedUpName.first);
|
||||||
|
if( room != null) {
|
||||||
|
room.printDirectMessageRoom(this, page);
|
||||||
|
return lookedUpName.first;
|
||||||
|
} else {
|
||||||
|
if( isValidPubkey(lookedUpName.first)) {
|
||||||
|
print("Could not find a conversation or room with the given id. Creating one with ${lookedUpName.first}");
|
||||||
|
createDirectRoom( directRoomId);
|
||||||
|
return directRoomId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if( lookedUpName.length > 0)
|
||||||
|
print("Got more than one public id for the name given, which are: ${lookedUpName.length}");
|
||||||
|
else {
|
||||||
|
if( isValidPubkey(directRoomId)) {
|
||||||
|
print("Could not find a conversation or room with the given id. Creating one with $directRoomId");
|
||||||
|
createDirectRoom(directRoomId);
|
||||||
|
return directRoomId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void createDirectRoom(String directRoomId) {
|
||||||
|
directRooms.add(DirectMessageRoom(directRoomId, []));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Write the tree's events to file as one event's json per line
|
// Write the tree's events to file as one event's json per line
|
||||||
Future<void> writeEventsToFile(String filename) async {
|
Future<void> writeEventsToFile(String filename) async {
|
||||||
if( gDebug > 0) print("opening $filename to write to.");
|
if( gDebug > 0) print("opening $filename to write to.");
|
||||||
@@ -1256,8 +1361,8 @@ class Store {
|
|||||||
// the reactedTo event's id, blank if invalid reaction etc
|
// the reactedTo event's id, blank if invalid reaction etc
|
||||||
static String processReaction(Event event, Map<String, Tree> tempChildEventsMap) {
|
static String processReaction(Event event, Map<String, Tree> tempChildEventsMap) {
|
||||||
|
|
||||||
if( gDebug > 0 && event.eventData.id == "e8a8a1f526af1023ba85ab3874d2310871e034eb8a0bcb3c289be671065ad03e")
|
if( gDebug > 0 && event.eventData.id == gCheckEventId)
|
||||||
print("in processReaction: 0 got reaction e8a8a1f526af1023ba85ab3874d2310871e034eb8a0bcb3c289be671065ad03e");
|
print("in processReaction: 0 got reaction $gCheckEventId");
|
||||||
|
|
||||||
List<String> validReactionList = ["+", "!"]; // TODO support opposite reactions
|
List<String> validReactionList = ["+", "!"]; // TODO support opposite reactions
|
||||||
List<String> opppositeReactions = ['-', "~"];
|
List<String> opppositeReactions = ['-', "~"];
|
||||||
@@ -1271,8 +1376,8 @@ class Store {
|
|||||||
int lastEIndex = event.eventData.eTags.length - 1;
|
int lastEIndex = event.eventData.eTags.length - 1;
|
||||||
String reactedTo = event.eventData.eTags[lastEIndex];
|
String reactedTo = event.eventData.eTags[lastEIndex];
|
||||||
|
|
||||||
if( gDebug > 0 && event.eventData.id == "e8a8a1f526af1023ba85ab3874d2310871e034eb8a0bcb3c289be671065ad03e")
|
if( gDebug > 0 && event.eventData.id == gCheckEventId)
|
||||||
print("in processReaction: 1 got reaction e8a8a1f526af1023ba85ab3874d2310871e034eb8a0bcb3c289be671065ad03e");
|
print("in processReaction: 1 got reaction $gCheckEventId");
|
||||||
|
|
||||||
if( !validReactionList.any((element) => element == comment)) {
|
if( !validReactionList.any((element) => element == comment)) {
|
||||||
return "";
|
return "";
|
||||||
@@ -1368,41 +1473,6 @@ void addMessageToChannel(String channelId, String messageId, Map<String, Tree> t
|
|||||||
print("In addMessageToChannel: returning without inserting message");
|
print("In addMessageToChannel: returning without inserting message");
|
||||||
}
|
}
|
||||||
|
|
||||||
void addMessageToDirectRoom(String directRoomId, String messageId, Map<String, Tree> tempChildEventsMap, var directRooms) {
|
|
||||||
int newEventTime = (tempChildEventsMap[messageId]?.event.eventData.createdAt??0);
|
|
||||||
|
|
||||||
if( directRooms.containsKey(directRoomId)) {
|
|
||||||
DirectMessageRoom? room = directRooms[directRoomId];
|
|
||||||
if( room != null ) {
|
|
||||||
if( room.messageIds.isEmpty) {
|
|
||||||
room.messageIds.add(messageId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(gDebug> 0) print("direct room has ${room.messageIds.length} messages already. adding new one to it. ");
|
|
||||||
|
|
||||||
for(int i = 0; i < room.messageIds.length; i++) {
|
|
||||||
int eventTime = (tempChildEventsMap[room.messageIds[i]]?.event.eventData.createdAt??0);
|
|
||||||
if( newEventTime < eventTime) {
|
|
||||||
// shift current i and rest one to the right, and put event Time here
|
|
||||||
if(gDebug> 0) print("In addMessageToChannel: inserted in middle to channel ${room.otherPubkey} ");
|
|
||||||
room.messageIds.insert(i, messageId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(gDebug> 0) print("In addMessageToChannel: added to channel ${room.otherPubkey} ");
|
|
||||||
|
|
||||||
// insert at end
|
|
||||||
room.messageIds.add(messageId);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
print("In addMessageToChannel: could not find room");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print("In addMessageToChannel: could not find channel id");
|
|
||||||
}
|
|
||||||
print("In addMessageToChannel: returning without inserting message");
|
|
||||||
}
|
|
||||||
|
|
||||||
int ascendingTimeTree(Tree a, Tree b) {
|
int ascendingTimeTree(Tree a, Tree b) {
|
||||||
if(a.event.eventData.createdAt < b.event.eventData.createdAt) {
|
if(a.event.eventData.createdAt < b.event.eventData.createdAt) {
|
||||||
@@ -1439,7 +1509,9 @@ int sortTreeNewestReply(Tree a, Tree b) {
|
|||||||
Store getTree(Set<Event> events) {
|
Store getTree(Set<Event> events) {
|
||||||
if( events.isEmpty) {
|
if( events.isEmpty) {
|
||||||
if(gDebug > 0) log.info("Warning: In printEventsAsTree: events length = 0");
|
if(gDebug > 0) log.info("Warning: In printEventsAsTree: events length = 0");
|
||||||
return Store([], {}, [], {}, {});
|
|
||||||
|
List<DirectMessageRoom> temp =[];
|
||||||
|
return Store([], {}, [], {}, temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove all events other than kind 0 (meta data), 1(posts replies likes), 3 (contact list), 7(reactions), 40 and 42 (chat rooms)
|
// remove all events other than kind 0 (meta data), 1(posts replies likes), 3 (contact list), 7(reactions), 40 and 42 (chat rooms)
|
||||||
|
|||||||
Reference in New Issue
Block a user