|
|
|
|
@ -84,6 +84,8 @@ void chat_core_serialize_member(const struct chat_member_display* src, uint8_t*
|
|
|
|
|
dst[13] = src->nat_type; |
|
|
|
|
dst[14] = src->storage; |
|
|
|
|
memcpy(dst + 15, src->name, 64); |
|
|
|
|
mf_put64(dst + 79, src->avatar_server); |
|
|
|
|
memcpy(dst + 87, src->avatar_file, 69); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int chat_core_deserialize_member(const uint8_t* src, struct chat_member_display* dst) { |
|
|
|
|
@ -97,9 +99,26 @@ int chat_core_deserialize_member(const uint8_t* src, struct chat_member_display*
|
|
|
|
|
dst->storage = src[14]; |
|
|
|
|
memcpy(dst->name, src + 15, 64); |
|
|
|
|
dst->name[63] = '\0'; |
|
|
|
|
dst->avatar_server = mf_get64(src + 79); |
|
|
|
|
memcpy(dst->avatar_file, src + 87, 69); dst->avatar_file[68] = 0; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void member_avatar(struct chat_member_display* m, const char* userinfo) { |
|
|
|
|
m->avatar_server = 0; memset(m->avatar_file, 0, sizeof(m->avatar_file)); |
|
|
|
|
char server[MS_USERINFO_MAX + 1], file[MS_USERINFO_MAX + 1]; |
|
|
|
|
if (!userinfo || json_flat_get(userinfo, "avatar_server", server, sizeof(server)) < 0 || |
|
|
|
|
json_flat_get(userinfo, "avatar_file", file, sizeof(file)) < 0) return; |
|
|
|
|
if (strlen(server) != 16 || !mf_avatar_file_valid(file)) { |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CHAT, "avatar: invalid profile reference node=%016llx", (unsigned long long)m->node_id); return; |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < 16; i++) if (!((server[i] >= '0' && server[i] <= '9') || (server[i] >= 'a' && server[i] <= 'f'))) { |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_CHAT, "avatar: invalid server ID node=%016llx", (unsigned long long)m->node_id); return; |
|
|
|
|
} |
|
|
|
|
m->avatar_server = strtoull(server, NULL, 16); |
|
|
|
|
if (m->avatar_server) memcpy(m->avatar_file, file, 69); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ─── запрос списка мемберов ─── */ |
|
|
|
|
|
|
|
|
|
int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uint8_t** out, int* count) { |
|
|
|
|
@ -120,7 +139,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.storage,0), COALESCE(p.deleted,0), COALESCE(p.userinfo,'')" |
|
|
|
|
" FROM \"%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id" |
|
|
|
|
" ORDER BY p.node_id ASC", peers_tbl); |
|
|
|
|
|
|
|
|
|
@ -142,6 +161,7 @@ int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uin
|
|
|
|
|
} |
|
|
|
|
struct chat_member_display* m = &members[cnt]; |
|
|
|
|
m->node_id = (uint64_t)sqlite3_column_int64(st, 0); |
|
|
|
|
member_avatar(m, (const char*)sqlite3_column_text(st, 6)); |
|
|
|
|
m->online = (uint8_t)chat_core_member_online(inst, ch_id, m->node_id); |
|
|
|
|
const char* node_name = (const char*)sqlite3_column_text(st, 1); |
|
|
|
|
const char* local_nick = (const char*)sqlite3_column_text(st, 2); |
|
|
|
|
@ -247,7 +267,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.storage,0), COALESCE(p.deleted,0), COALESCE(p.userinfo,'')" |
|
|
|
|
" FROM \"%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id" |
|
|
|
|
" WHERE p.node_id=?", peers_tbl); |
|
|
|
|
|
|
|
|
|
@ -257,6 +277,7 @@ int chat_core_get_single_member(struct UTUN_INSTANCE* inst, const char* ch_id, u
|
|
|
|
|
|
|
|
|
|
struct chat_member_display m; |
|
|
|
|
m.node_id = node_id; |
|
|
|
|
member_avatar(&m, (const char*)sqlite3_column_text(st, 5)); |
|
|
|
|
m.online = (uint8_t)chat_core_member_online(inst, ch_id, node_id); |
|
|
|
|
const char* node_name = (const char*)sqlite3_column_text(st, 0); |
|
|
|
|
const char* local_nick = (const char*)sqlite3_column_text(st, 1); |
|
|
|
|
|