|
|
|
|
@ -87,6 +87,7 @@ void chat_core_serialize_member(const struct chat_member_display* src, uint8_t*
|
|
|
|
|
memcpy(dst + 15, src->name, 64); |
|
|
|
|
mf_put64(dst + 79, src->avatar_server); |
|
|
|
|
memcpy(dst + 87, src->avatar_file, 69); |
|
|
|
|
dst[156] = src->storage_role; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int chat_core_deserialize_member(const uint8_t* src, struct chat_member_display* dst) { |
|
|
|
|
@ -102,6 +103,7 @@ int chat_core_deserialize_member(const uint8_t* src, struct chat_member_display*
|
|
|
|
|
dst->name[63] = '\0'; |
|
|
|
|
dst->avatar_server = mf_get64(src + 79); |
|
|
|
|
memcpy(dst->avatar_file, src + 87, 69); dst->avatar_file[68] = 0; |
|
|
|
|
dst->storage_role = src[156]; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -120,6 +122,12 @@ static void member_avatar(struct chat_member_display* m, const char* userinfo) {
|
|
|
|
|
if (m->avatar_server) memcpy(m->avatar_file, file, 69); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int member_storage_role(const char* tags, sqlite3_stmt* st, int source, int signature, int deleted) { |
|
|
|
|
char role[16]; |
|
|
|
|
return !deleted && sqlite3_column_int(st, source) == 0 && sqlite3_column_bytes(st, signature) == 64 && |
|
|
|
|
tags && json_flat_get(tags, "storage", role, sizeof(role)) == 0 && !strcmp(role, "yes"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ─── запрос списка мемберов ─── */ |
|
|
|
|
|
|
|
|
|
int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uint8_t** out, int* count) { |
|
|
|
|
@ -140,7 +148,7 @@ int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uin
|
|
|
|
|
snprintf(sql, sizeof(sql), |
|
|
|
|
"SELECT p.node_id, COALESCE(n.name,'')," |
|
|
|
|
" COALESCE(p.local_nick,''), COALESCE(p.adm_tags,'')," |
|
|
|
|
" COALESCE(p.storage,0), COALESCE(p.deleted,0), COALESCE(p.userinfo,'')" |
|
|
|
|
" COALESCE(p.storage,0), COALESCE(p.deleted,0), COALESCE(p.userinfo,''),p.source,p.adm_tags_sig" |
|
|
|
|
" FROM \"%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id" |
|
|
|
|
" ORDER BY p.node_id ASC", peers_tbl); |
|
|
|
|
|
|
|
|
|
@ -168,6 +176,7 @@ int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uin
|
|
|
|
|
const char* local_nick = (const char*)sqlite3_column_text(st, 2); |
|
|
|
|
const char* adm_tags = (const char*)sqlite3_column_text(st, 3); |
|
|
|
|
m->storage = (uint8_t)sqlite3_column_int(st, 4); |
|
|
|
|
m->storage_role = member_storage_role(adm_tags, st, 7, 8, sqlite3_column_int(st, 5)); |
|
|
|
|
m->is_self = (uint8_t)(m->node_id == my_id ? 1 : 0); |
|
|
|
|
m->flags = parse_adm_tags_flags(adm_tags) | member_radio_flag(inst, ch_id, m->node_id); |
|
|
|
|
if (sqlite3_column_int(st, 5)) m->flags |= CHAT_MEMBER_FLAG_DELETED; |
|
|
|
|
@ -268,7 +277,7 @@ int chat_core_get_single_member(struct UTUN_INSTANCE* inst, const char* ch_id, u
|
|
|
|
|
snprintf(sql, sizeof(sql), |
|
|
|
|
"SELECT COALESCE(n.name,'')," |
|
|
|
|
" COALESCE(p.local_nick,''), COALESCE(p.adm_tags,'')," |
|
|
|
|
" COALESCE(p.storage,0), COALESCE(p.deleted,0), COALESCE(p.userinfo,'')" |
|
|
|
|
" COALESCE(p.storage,0), COALESCE(p.deleted,0), COALESCE(p.userinfo,''),p.source,p.adm_tags_sig" |
|
|
|
|
" FROM \"%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id" |
|
|
|
|
" WHERE p.node_id=?", peers_tbl); |
|
|
|
|
|
|
|
|
|
@ -284,6 +293,7 @@ int chat_core_get_single_member(struct UTUN_INSTANCE* inst, const char* ch_id, u
|
|
|
|
|
const char* local_nick = (const char*)sqlite3_column_text(st, 1); |
|
|
|
|
const char* adm_tags = (const char*)sqlite3_column_text(st, 2); |
|
|
|
|
m.storage = (uint8_t)sqlite3_column_int(st, 3); |
|
|
|
|
m.storage_role = member_storage_role(adm_tags, st, 6, 7, sqlite3_column_int(st, 4)); |
|
|
|
|
m.is_self = (uint8_t)(node_id == my_id ? 1 : 0); |
|
|
|
|
m.flags = parse_adm_tags_flags(adm_tags) | member_radio_flag(inst, ch_id, node_id); |
|
|
|
|
if (sqlite3_column_int(st, 4)) m.flags |= CHAT_MEMBER_FLAG_DELETED; |
|
|
|
|
|