mirror of
https://github.com/vishalxl/nostr_console.git
synced 2025-06-29 10:09:45 +02:00
added overwrite flag. improved chat display.
This commit is contained in:
@ -47,6 +47,10 @@ usage: dart run bin/nostr_console.dart [OPTIONS]
|
|||||||
-y, --difficulty <number> The difficulty number in bits, only for kind 1 messages. Tne next larger number divisible by 4 is
|
-y, --difficulty <number> The difficulty number in bits, only for kind 1 messages. Tne next larger number divisible by 4 is
|
||||||
taken as difficulty. Can't be more than 24 bits, because otherwise it typically takes too much
|
taken as difficulty. Can't be more than 24 bits, because otherwise it typically takes too much
|
||||||
time. Minimum and default is 0, which means no difficulty.
|
time. Minimum and default is 0, which means no difficulty.
|
||||||
|
-v, --overwrite Will over write the file with all the events that were read from file, and all newly received. Is
|
||||||
|
useful when the file has to be cleared of old unused events. A backup should be made just in case
|
||||||
|
of original file before invoking.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
To get ALL the latest messages for last 3 days (on linux which allows backtick execution):
|
To get ALL the latest messages for last 3 days (on linux which allows backtick execution):
|
||||||
|
@ -24,6 +24,7 @@ const String disableFileArg = "disable-file";
|
|||||||
const String difficultyArg = "difficulty";
|
const String difficultyArg = "difficulty";
|
||||||
const String translateArg = "translate";
|
const String translateArg = "translate";
|
||||||
const String colorArg = "color";
|
const String colorArg = "color";
|
||||||
|
const String overWriteFlag = "overwrite";
|
||||||
|
|
||||||
void printUsage() {
|
void printUsage() {
|
||||||
print(gUsage);
|
print(gUsage);
|
||||||
@ -44,6 +45,7 @@ Future<void> main(List<String> arguments) async {
|
|||||||
..addFlag(translateArg, abbr: "t", defaultsTo: false)
|
..addFlag(translateArg, abbr: "t", defaultsTo: false)
|
||||||
..addOption(colorArg, abbr:"c")
|
..addOption(colorArg, abbr:"c")
|
||||||
..addOption(difficultyArg, abbr:"y")
|
..addOption(difficultyArg, abbr:"y")
|
||||||
|
..addFlag(overWriteFlag, abbr:"v", defaultsTo: false)
|
||||||
..addFlag("debug");
|
..addFlag("debug");
|
||||||
try {
|
try {
|
||||||
ArgResults argResults = parser.parse(arguments);
|
ArgResults argResults = parser.parse(arguments);
|
||||||
@ -56,6 +58,11 @@ Future<void> main(List<String> arguments) async {
|
|||||||
gDebug = 1;
|
gDebug = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( argResults[overWriteFlag]) {
|
||||||
|
print("Going to overwrite file at the end of program execution.");
|
||||||
|
gOverWriteFile = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if( argResults[translateArg]) {
|
if( argResults[translateArg]) {
|
||||||
gTranslate = true;
|
gTranslate = true;
|
||||||
|
@ -88,19 +88,16 @@ Future<void> sendChatMessage(Store node, String channelId, String messageToSend)
|
|||||||
sendRequest( gListRelayUrls, toSendMessage);
|
sendRequest( gListRelayUrls, toSendMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// is same as above. remove it TODO
|
// send DM
|
||||||
Future<void> sendDirectMessage(Store node, String otherPubkey, String messageToSend) async {
|
Future<void> sendDirectMessage(Store node, String otherPubkey, String messageToSend) async {
|
||||||
String otherPubkey02 = "02" + otherPubkey;
|
String otherPubkey02 = "02" + otherPubkey;
|
||||||
String encryptedMessageToSend = myEncrypt(userPrivateKey, otherPubkey02, messageToSend);
|
String encryptedMessageToSend = myEncrypt(userPrivateKey, otherPubkey02, messageToSend);
|
||||||
|
|
||||||
|
/* int ivIndex = encryptedMessageToSend.indexOf("?iv=");
|
||||||
//print("encrypted = $encryptedMessageToSend");
|
|
||||||
int ivIndex = encryptedMessageToSend.indexOf("?iv=");
|
|
||||||
var iv = encryptedMessageToSend.substring( ivIndex + 4, encryptedMessageToSend.length);
|
var iv = encryptedMessageToSend.substring( ivIndex + 4, encryptedMessageToSend.length);
|
||||||
var enc_str = encryptedMessageToSend.substring(0, ivIndex);
|
var enc_str = encryptedMessageToSend.substring(0, ivIndex);
|
||||||
//print("enc_str = $enc_str len = ${enc_str.length} iv = $iv len = ${iv.length}");
|
|
||||||
String decrypted = myPrivateDecrypt(userPrivateKey, otherPubkey02, enc_str, iv);
|
String decrypted = myPrivateDecrypt(userPrivateKey, otherPubkey02, enc_str, iv);
|
||||||
//print( "decrypted = |$decrypted|");;
|
*/
|
||||||
|
|
||||||
String replyKind = "4";
|
String replyKind = "4";
|
||||||
String strTags = '["p","$otherPubkey"]';
|
String strTags = '["p","$otherPubkey"]';
|
||||||
@ -109,9 +106,7 @@ Future<void> sendDirectMessage(Store node, String otherPubkey, String messageToS
|
|||||||
|
|
||||||
String id = getShaId(userPublicKey, createdAt, replyKind, strTags, encryptedMessageToSend);
|
String id = getShaId(userPublicKey, createdAt, replyKind, strTags, encryptedMessageToSend);
|
||||||
String sig = sign(userPrivateKey, id, "12345612345612345612345612345612");
|
String sig = sign(userPrivateKey, id, "12345612345612345612345612345612");
|
||||||
|
|
||||||
String eventStrToSend = '["EVENT",{"id":"$id","pubkey":"$userPublicKey","created_at":$createdAt,"kind":$replyKind,"tags":[$strTags],"content":"$encryptedMessageToSend","sig":"$sig"}]';
|
String eventStrToSend = '["EVENT",{"id":"$id","pubkey":"$userPublicKey","created_at":$createdAt,"kind":$replyKind,"tags":[$strTags],"content":"$encryptedMessageToSend","sig":"$sig"}]';
|
||||||
//print(toSendMessage);
|
|
||||||
|
|
||||||
sendRequest( gListRelayUrls, eventStrToSend);
|
sendRequest( gListRelayUrls, eventStrToSend);
|
||||||
}
|
}
|
||||||
|
@ -310,19 +310,28 @@ class EventData {
|
|||||||
|
|
||||||
String getAsLine({int len = 20}) {
|
String getAsLine({int len = 20}) {
|
||||||
String contentToPrint = evaluatedContent.isEmpty? content: evaluatedContent;
|
String contentToPrint = evaluatedContent.isEmpty? content: evaluatedContent;
|
||||||
|
//print("$contentToPrint|");
|
||||||
|
//print("len = ${contentToPrint.length}");
|
||||||
if( len == 0 || len > contentToPrint.length) {
|
if( len == 0 || len > contentToPrint.length) {
|
||||||
len = contentToPrint.length;
|
len = contentToPrint.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
contentToPrint = contentToPrint.padLeft(len);
|
||||||
contentToPrint = contentToPrint.replaceAll("\n", " ");
|
contentToPrint = contentToPrint.replaceAll("\n", " ");
|
||||||
contentToPrint = contentToPrint.replaceAll("\r", " ");
|
contentToPrint = contentToPrint.replaceAll("\r", " ");
|
||||||
String strToPrint = '"${contentToPrint.substring(0, len)}..." - ${getAuthorName(pubkey)}';
|
String strToPrint = '${contentToPrint.substring(0, len)}... - ${getAuthorName(pubkey)}';
|
||||||
if( isNotification) {
|
if( isNotification) {
|
||||||
strToPrint = "$gNotificationColor$strToPrint$gColorEndMarker";
|
strToPrint = "$gNotificationColor$strToPrint$gColorEndMarker";
|
||||||
isNotification = false;
|
isNotification = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return strToPrint;
|
int strWidth = 40;
|
||||||
|
String paddedStrToPrint = strToPrint.padLeft(strWidth);
|
||||||
|
//print("\n$paddedStrToPrint");
|
||||||
|
paddedStrToPrint = paddedStrToPrint.substring(0, strWidth);
|
||||||
|
|
||||||
|
//print("\nstrToPrint = $strToPrint len = ${strToPrint.length} paddedStrToPrint = $paddedStrToPrint len = ${paddedStrToPrint.length}");
|
||||||
|
return paddedStrToPrint;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getStrForChannel(int depth) {
|
String getStrForChannel(int depth) {
|
||||||
@ -343,7 +352,7 @@ class EventData {
|
|||||||
tempEvaluatedContent = tempContent = content; // content would be changed so show that
|
tempEvaluatedContent = tempContent = content; // content would be changed so show that
|
||||||
}
|
}
|
||||||
|
|
||||||
const int nameWidthDepth = 3; // how wide name will be in depth spaces
|
const int nameWidthDepth = 2; // how wide name will be in depth spaces
|
||||||
const int timeWidthDepth = 2;
|
const int timeWidthDepth = 2;
|
||||||
int nameWidth = gSpacesPerDepth * nameWidthDepth;
|
int nameWidth = gSpacesPerDepth * nameWidthDepth;
|
||||||
String nameToPrint = name.padLeft(nameWidth).substring(0, nameWidth);
|
String nameToPrint = name.padLeft(nameWidth).substring(0, nameWidth);
|
||||||
@ -949,7 +958,7 @@ try {
|
|||||||
offset += cipherImpl.doFinal(cipherText, offset, finalPlainText, offset);
|
offset += cipherImpl.doFinal(cipherText, offset, finalPlainText, offset);
|
||||||
assert(offset == cipherText.length);
|
assert(offset == cipherText.length);
|
||||||
|
|
||||||
return finalPlainText.sublist(0, finalPlainText.length);
|
return finalPlainText.sublist(0, offset);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
//print("cannot open file $gEventsFilename");
|
//print("cannot open file $gEventsFilename");
|
||||||
if( gDebug >= 0) print("Decryption error = $e");
|
if( gDebug >= 0) print("Decryption error = $e");
|
||||||
|
@ -7,10 +7,12 @@ String gCheckEventId = ""; //"1763016774ceaa8c135dce01e77923994c5afad4cd3e126704
|
|||||||
|
|
||||||
const int gDefaultNumWaitSeconds = 3000; // is used in main()
|
const int gDefaultNumWaitSeconds = 3000; // is used in main()
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////// file related settings
|
||||||
const String gDefaultEventsFilename = "all_nostr_events.txt";
|
const String gDefaultEventsFilename = "all_nostr_events.txt";
|
||||||
String gEventsFilename = ""; // is set in arguments, and if set, then file is read from and written to
|
String gEventsFilename = ""; // is set in arguments, and if set, then file is read from and written to
|
||||||
bool gDontWriteOldEvents = true;
|
bool gDontWriteOldEvents = true;
|
||||||
const int gDontSaveBeforeDays = 100; // dont save events older than this many days if gDontWriteOldEvents flag is true
|
const int gDontSaveBeforeDays = 100; // dont save events older than this many days if gDontWriteOldEvents flag is true
|
||||||
|
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 gDaysToGetEventsFor = 100; // when getting events, this is the since field (unless a fully formed request is given in command line)
|
||||||
@ -156,6 +158,9 @@ usage: $exename [OPTIONS]
|
|||||||
-y, --difficulty <number> The difficulty number in bits, only for kind 1 messages. Tne next larger number divisible by 4 is
|
-y, --difficulty <number> The difficulty number in bits, only for kind 1 messages. Tne next larger number divisible by 4 is
|
||||||
taken as difficulty. Can't be more than 24 bits, because otherwise it typically takes too much
|
taken as difficulty. Can't be more than 24 bits, because otherwise it typically takes too much
|
||||||
time. Minimum and default is 0, which means no difficulty.
|
time. Minimum and default is 0, which means no difficulty.
|
||||||
|
-v, --overwrite Will over write the file with all the events that were read from file, and all newly received. Is
|
||||||
|
useful when the file has to be cleared of old unused events. A backup should be made just in case
|
||||||
|
of original file before invoking.
|
||||||
""";
|
""";
|
||||||
|
|
||||||
const String helpAndAbout =
|
const String helpAndAbout =
|
||||||
|
@ -839,13 +839,14 @@ class Store {
|
|||||||
int numMessages = value.messageIds.length;
|
int numMessages = value.messageIds.length;
|
||||||
stdout.write("${name} ${getNumSpaces(32-name.length)} $numMessages${getNumSpaces(12- numMessages.toString().length)}");
|
stdout.write("${name} ${getNumSpaces(32-name.length)} $numMessages${getNumSpaces(12- numMessages.toString().length)}");
|
||||||
|
|
||||||
// print latest event in one lin
|
// print latest event in one line
|
||||||
List<String> messageIds = value.messageIds;
|
List<String> messageIds = value.messageIds;
|
||||||
for( int i = messageIds.length - 1; i >= 0; i++) {
|
for( int i = messageIds.length - 1; i >= 0; i++) {
|
||||||
if( allChildEventsMap.containsKey(messageIds[i])) {
|
if( allChildEventsMap.containsKey(messageIds[i])) {
|
||||||
Event? e = allChildEventsMap[messageIds[i]]?.event;
|
Event? e = allChildEventsMap[messageIds[i]]?.event;
|
||||||
if( e!= null) {
|
if( e!= null) {
|
||||||
stdout.write("${e.eventData.getAsLine()}");
|
String line = e.eventData.getAsLine();
|
||||||
|
stdout.write(line);
|
||||||
break; // print only one event, the latest one
|
break; // print only one event, the latest one
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -984,6 +985,10 @@ class Store {
|
|||||||
try {
|
try {
|
||||||
final File file = File(filename);
|
final File file = File(filename);
|
||||||
|
|
||||||
|
if( gOverWriteFile) {
|
||||||
|
await file.writeAsString("", mode: FileMode.write).then( (file) => file);
|
||||||
|
}
|
||||||
|
|
||||||
//await file.writeAsString("", mode: FileMode.append).then( (file) => file);
|
//await file.writeAsString("", mode: FileMode.append).then( (file) => file);
|
||||||
int eventCounter = 0;
|
int eventCounter = 0;
|
||||||
String nLinesStr = "";
|
String nLinesStr = "";
|
||||||
@ -993,10 +998,16 @@ class Store {
|
|||||||
int linesWritten = 0;
|
int linesWritten = 0;
|
||||||
for( var tree in allChildEventsMap.values) {
|
for( var tree in allChildEventsMap.values) {
|
||||||
|
|
||||||
if( tree.event.readFromFile || tree.event.eventData.isDeleted) { // ignore those already in file; only the new ones are writen/appended to file, or those deleted
|
if( tree.event.eventData.isDeleted) { // dont write those deleted
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( gOverWriteFile == false) {
|
||||||
|
if( tree.event.readFromFile) { // ignore those already in file; only the new ones are writen/appended to file
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// only write if its not too old
|
// only write if its not too old
|
||||||
if( gDontWriteOldEvents) {
|
if( gDontWriteOldEvents) {
|
||||||
if( tree.event.eventData.createdAt < getSecondsDaysAgo(gDontSaveBeforeDays)) {
|
if( tree.event.eventData.createdAt < getSecondsDaysAgo(gDontSaveBeforeDays)) {
|
||||||
|
@ -4,7 +4,7 @@ version: 0.0.7-beta
|
|||||||
homepage: https://github.com/vishalxl/nostr_console
|
homepage: https://github.com/vishalxl/nostr_console
|
||||||
|
|
||||||
|
|
||||||
# colored new chat msgs
|
# improved display
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.17.3 <3.0.0'
|
sdk: '>=2.17.3 <3.0.0'
|
||||||
|
Reference in New Issue
Block a user