From 208a0c8ae846f2f0c52b0317f27c391319c31aac Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 19 Jul 2026 07:54:06 +0300 Subject: [PATCH] fix(chat_sync): peer online status not updated in invite flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cs_on_conn_up: call cs_on_peer_status_changed(peer,1) before return in invite path (was skipped, leaving inviter at online=0 in DB) - cs_handle_welcome: remove unconditional set_online(0) — online status is managed by conn_up/conn_down, not by WELCOME - cs_handle_welcome: add cs_post_channel_online() after WELCOME to send PEERS_ONLINE to GUI when channel is fully loaded - cs_post_channel_online: add DEBUG log for PEERS_ONLINE event - db_sync peer_check: suppress spam log when no peers connected --- src/db_sync.c | 10 ++++++---- tools/chatgui/transport/chat_sync.c | 6 +++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/db_sync.c b/src/db_sync.c index b4ead016..2e96fbe0 100644 --- a/src/db_sync.c +++ b/src/db_sync.c @@ -1267,7 +1267,7 @@ static void db_sync_peer_check_cb(void* arg) return; } - int total_synced = 0, total_skipped = 0; + int total_synced = 0, total_skipped = 0, any_peers = 0; for (int i = 0; i < db->instance_count; i++) { struct DB_SYNC_INSTANCE* si = &db->instances[i]; if (!si->enabled) continue; @@ -1278,7 +1278,7 @@ static void db_sync_peer_check_cb(void* arg) struct TOPO_GROUP_CONN_ITEM* item = (struct TOPO_GROUP_CONN_ITEM*)e->data; if (item->conn && item->conn->peer_node_id != 0 && item->conn->links_up && item->conn->initialized) { uint64_t pid = item->conn->peer_node_id; - if (pid != db->inst->node_id) { si_peer_add(si, pid); peers_found++; } + if (pid != db->inst->node_id) { si_peer_add(si, pid); peers_found++; any_peers = 1; } } e = e->next; } @@ -1314,8 +1314,10 @@ static void db_sync_peer_check_cb(void* arg) } } - DEBUG_INFO(DEBUG_CATEGORY_DB_SYNC, "peer_check: instances=%d synced=%d skipped=%d", - db->instance_count, total_synced, total_skipped); + if (any_peers) { + DEBUG_INFO(DEBUG_CATEGORY_DB_SYNC, "peer_check: instances=%d synced=%d skipped=%d", + db->instance_count, total_synced, total_skipped); + } db->peer_check_timer = uasync_set_timeout(db->inst->ua, DB_SYNC_PEER_CHECK_INTERVAL * 10000u, db, db_sync_peer_check_cb, "db_sync_peer"); diff --git a/tools/chatgui/transport/chat_sync.c b/tools/chatgui/transport/chat_sync.c index 546912af..11242a7f 100644 --- a/tools/chatgui/transport/chat_sync.c +++ b/tools/chatgui/transport/chat_sync.c @@ -486,6 +486,7 @@ static void cs_post_channel_online(struct chat_sync* cs, const char* ch_id) { memcpy(evt + 1, ch_id, cl); uint16_t oc = (uint16_t)online; memcpy(evt + 1 + cl, &oc, 2); gui_bridge_post(GUI_EVT_CHANNEL_PEERS_ONLINE, evt, 1 + (int)cl + 2); + DEBUG_DEBUG(DEBUG_CATEGORY_DB_SYNC, "%s: PEERS_ONLINE ch=%.*s online=%d", CS_ID, (int)cl, ch_id, online); } /* ── Throttled sync (не чаще CS_SYNC_INTERVAL_MS) ── */ @@ -600,6 +601,8 @@ static void cs_on_conn_up(struct ETCP_CONN* conn, void* arg) { cs_send(g_cs, ch_id_str, peer, req, 1); g_cs->info_req_timer = uasync_set_timeout(g_cs->inst->ua, CS_INFO_REQ_TIMEOUT_MS * 10, g_cs, cs_info_req_timeout_cb, "cs_info_req"); + DEBUG_INFO(DEBUG_CATEGORY_DB_SYNC, "%s: conn_up invite path, marking peer=%016llx online", CS_ID, (unsigned long long)peer); + cs_on_peer_status_changed(peer, 1); return; } @@ -1336,7 +1339,6 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer, CS_ID, (unsigned long long)node_id, sid, port); } member_sync_cancel(g_cs->inst, node_id, ch_id); - member_sync_set_online(g_cs->inst, node_id, 0); } cs_refresh_channels(cs); @@ -1360,6 +1362,8 @@ static void cs_handle_welcome(struct chat_sync* cs, uint64_t peer, gui_bridge_post(GUI_EVT_MEMBERS_CHANGED, evt, 1 + ch_id_len); + cs_post_channel_online(cs, ch_id); + DEBUG_INFO(DEBUG_CATEGORY_DB_SYNC, "%s: WELCOME processed ch=%s peers=%d — message sync triggered via db_sync (active conn or peer_check timer every 5s)", CS_ID, ch_id, pc); }