diff --git a/src/chat/chat_msg.c b/src/chat/chat_msg.c index 3325fda8..6bb93a7c 100644 --- a/src/chat/chat_msg.c +++ b/src/chat/chat_msg.c @@ -216,16 +216,19 @@ static void on_media_registered(void* arg, int err, const struct media_index_res u_free(sig_msg); u_free(json); u_free(full_data); u_free(mctx); return; } - int ret = db_sync_insert_signed(si, json, strlen(json), json_sig, 64, ts, NULL); + /* local_attrs готовим заранее и пишем атомарно при вставке — иначе GUI по + MSG_RECEIVED может прочитать сообщение раньше отдельного UPDATE (гонка), + и своё голосовое покажется «без медиа» (серый media bar + попытка скачать) */ + const char* base = strrchr(mctx->media_dest, '/'); + const char* filename = base ? base + 1 : mctx->media_dest; + char attrs[1100]; snprintf(attrs, sizeof(attrs), "{\"st\":\"fl\",\"fp\":\"%s\"}", filename); + + int ret = db_sync_insert_signed(si, json, strlen(json), json_sig, 64, ts, attrs); if (ret != 0) { DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: media insert failed ret=%d", CC_ID, ret); } else { DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "%s: media message inserted ch=%s ts=%llu", CC_ID, mctx->channel_id, (unsigned long long)ts); - const char* base = strrchr(mctx->media_dest, '/'); - const char* filename = base ? base + 1 : mctx->media_dest; - char attrs[1100]; snprintf(attrs, sizeof(attrs), "{\"st\":\"fl\",\"fp\":\"%s\"}", filename); - chat_core_update_local_attrs(mctx->inst, mctx->channel_id, ts, json_sig, attrs); /* анонсируем блоки суперузлам — иначе первый скачивающий не найдёт держателя */ media_delivery_announce_media(mctx->inst, strtoull(mctx->channel_id, NULL, 10),