v0.0.34 - Fix NIP-17 send hang by removing re-entrant relay query and nested polling; add startup kind 10050 relay list

This commit is contained in:
Your Name
2026-03-05 09:36:26 -04:00
parent d12d58baff
commit 59baa471a3
4 changed files with 17 additions and 75 deletions
+2 -2
View File
@@ -51,11 +51,11 @@ Agents learn capabilities through skills — Nostr events that any agent can di
Didactyl will support local inference, which is very privacy preserving. Remote inference does however have it's advantages, and in those cases Didactyl supports using Bitcoin Lightning and eCash inference providers.
## Current Status — v0.0.33
## Current Status — v0.0.34
**Active build — this project is barely working. Experiment at your own risk.**
> Last release update: v0.0.33 — Skip self-sent NIP-17 sender-copy DMs to prevent self-reply loops
> Last release update: v0.0.34 — Fix NIP-17 send hang by removing re-entrant relay query and nested polling; add startup kind 10050 relay list
- Connects to configured relays with auto-reconnect and relay state transition logging
- Publishes configured startup events per relay as each relay becomes connected
+10 -1
View File
@@ -245,10 +245,19 @@ int main(int argc, char** argv) {
char startup_dm[768];
const char* startup_name = nostr_handler_get_startup_display_name();
int connected_relays = nostr_handler_connected_relay_count();
time_t startup_now = time(NULL);
struct tm startup_tm;
char startup_time_str[32] = {0};
if (localtime_r(&startup_now, &startup_tm)) {
(void)strftime(startup_time_str, sizeof(startup_time_str), "%Y-%m-%d %H:%M:%S", &startup_tm);
} else {
snprintf(startup_time_str, sizeof(startup_time_str), "%ld", (long)startup_now);
}
snprintf(startup_dm,
sizeof(startup_dm),
"%s has started up and is online (version %s, connected relays: %d/%d).",
"%s has started up and is online at %s (version %s, connected relays: %d/%d).",
(startup_name && startup_name[0] != '\0') ? startup_name : "Didactyl",
startup_time_str,
DIDACTYL_VERSION,
connected_relays,
cfg.relay_count);
+2 -2
View File
@@ -12,8 +12,8 @@
// Using DIDACTYL_ prefix to avoid conflicts with nostr_core_lib VERSION macros
#define DIDACTYL_VERSION_MAJOR 0
#define DIDACTYL_VERSION_MINOR 0
#define DIDACTYL_VERSION_PATCH 33
#define DIDACTYL_VERSION "v0.0.33"
#define DIDACTYL_VERSION_PATCH 34
#define DIDACTYL_VERSION "v0.0.34"
// Agent metadata
#define DIDACTYL_NAME "Didactyl"
+3 -70
View File
@@ -1876,78 +1876,15 @@ int nostr_handler_send_dm_nip17(const char* recipient_pubkey_hex, const char* me
return -1;
}
cJSON* filter = cJSON_CreateObject();
cJSON* kinds = cJSON_CreateArray();
cJSON* authors = cJSON_CreateArray();
if (!filter || !kinds || !authors) {
cJSON_Delete(filter);
cJSON_Delete(kinds);
cJSON_Delete(authors);
return -1;
}
cJSON_AddItemToArray(kinds, cJSON_CreateNumber(10050));
cJSON_AddItemToObject(filter, "kinds", kinds);
cJSON_AddItemToArray(authors, cJSON_CreateString(recipient_pubkey_hex));
cJSON_AddItemToObject(filter, "authors", authors);
cJSON_AddNumberToObject(filter, "limit", 1);
int event_count = 0;
cJSON** events = nostr_relay_pool_query_sync(
g_pool,
(const char**)g_cfg->relays,
g_cfg->relay_count,
filter,
&event_count,
5000);
cJSON_Delete(filter);
char* extracted_dm_relays[NIP17_MAX_RELAYS] = {0};
int extracted_count = 0;
if (events && event_count > 0 && events[0]) {
int extracted = nostr_nip17_extract_dm_relays(events[0], extracted_dm_relays, NIP17_MAX_RELAYS);
if (extracted > 0) {
extracted_count = extracted;
}
}
if (events) {
for (int i = 0; i < event_count; i++) {
cJSON_Delete(events[i]);
}
free(events);
}
const char* target_relays[NIP17_MAX_RELAYS] = {0};
int target_count = 0;
if (extracted_count > 0) {
for (int i = 0; i < g_cfg->relay_count && target_count < NIP17_MAX_RELAYS; i++) {
if (nostr_relay_pool_get_relay_status(g_pool, g_cfg->relays[i]) != NOSTR_POOL_RELAY_CONNECTED) {
continue;
}
for (int j = 0; j < extracted_count; j++) {
if (extracted_dm_relays[j] && strcmp(g_cfg->relays[i], extracted_dm_relays[j]) == 0) {
target_relays[target_count++] = g_cfg->relays[i];
break;
}
}
for (int i = 0; i < g_cfg->relay_count && target_count < NIP17_MAX_RELAYS; i++) {
if (nostr_relay_pool_get_relay_status(g_pool, g_cfg->relays[i]) == NOSTR_POOL_RELAY_CONNECTED) {
target_relays[target_count++] = g_cfg->relays[i];
}
}
if (target_count == 0) {
for (int i = 0; i < g_cfg->relay_count && target_count < NIP17_MAX_RELAYS; i++) {
if (nostr_relay_pool_get_relay_status(g_pool, g_cfg->relays[i]) == NOSTR_POOL_RELAY_CONNECTED) {
target_relays[target_count++] = g_cfg->relays[i];
}
}
}
for (int i = 0; i < extracted_count; i++) {
free(extracted_dm_relays[i]);
}
if (target_count <= 0) {
return -1;
}
@@ -1995,10 +1932,6 @@ int nostr_handler_send_dm_nip17(const char* recipient_pubkey_hex, const char* me
cJSON_Delete(gift_wraps[i]);
}
for (int i = 0; i < 5; i++) {
(void)nostr_relay_pool_poll(g_pool, 100);
}
return any_sent ? 0 : -1;
}