|
|
|
|
@ -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), |
|
|
|
|
|