|
|
|
@ -710,11 +710,11 @@ char* utun_bridge_get_channel_members_json(const char* channel_id) { |
|
|
|
if (member_count == 0) return u_strdup("[]"); |
|
|
|
if (member_count == 0) return u_strdup("[]"); |
|
|
|
|
|
|
|
|
|
|
|
snprintf(sql, sizeof(sql), |
|
|
|
snprintf(sql, sizeof(sql), |
|
|
|
"SELECT p.node_id, COALESCE(n.online,0), COALESCE(n.name,'')," |
|
|
|
"SELECT p.node_id, COALESCE(n.name,'')," |
|
|
|
" COALESCE(p.local_nick,''), COALESCE(p.adm_tags,'')," |
|
|
|
" COALESCE(p.local_nick,''), COALESCE(p.adm_tags,'')," |
|
|
|
" COALESCE(p.node_type,0), COALESCE(p.node_RTT,0), COALESCE(p.storage,0)" |
|
|
|
" COALESCE(p.node_type,0), COALESCE(p.node_RTT,0), COALESCE(p.storage,0)" |
|
|
|
" FROM \"%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id" |
|
|
|
" FROM \"%s\" p LEFT JOIN nodes n ON p.node_id=n.node_id" |
|
|
|
" ORDER BY n.online DESC, p.node_id ASC", peers_tbl); |
|
|
|
" ORDER BY p.node_id ASC", peers_tbl); |
|
|
|
|
|
|
|
|
|
|
|
sqlite3_stmt* st = NULL; |
|
|
|
sqlite3_stmt* st = NULL; |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) { |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) { |
|
|
|
@ -733,13 +733,12 @@ char* utun_bridge_get_channel_members_json(const char* channel_id) { |
|
|
|
|
|
|
|
|
|
|
|
while (sqlite3_step(st) == SQLITE_ROW) { |
|
|
|
while (sqlite3_step(st) == SQLITE_ROW) { |
|
|
|
uint64_t node_id = (uint64_t)sqlite3_column_int64(st, 0); |
|
|
|
uint64_t node_id = (uint64_t)sqlite3_column_int64(st, 0); |
|
|
|
int online = sqlite3_column_int(st, 1); |
|
|
|
const char* name = (const char*)sqlite3_column_text(st, 1); |
|
|
|
const char* name = (const char*)sqlite3_column_text(st, 2); |
|
|
|
const char* local_nick = (const char*)sqlite3_column_text(st, 2); |
|
|
|
const char* local_nick = (const char*)sqlite3_column_text(st, 3); |
|
|
|
const char* adm_tags = (const char*)sqlite3_column_text(st, 3); |
|
|
|
const char* adm_tags = (const char*)sqlite3_column_text(st, 4); |
|
|
|
int node_type = sqlite3_column_int(st, 4); |
|
|
|
int node_type = sqlite3_column_int(st, 5); |
|
|
|
int node_rtt = sqlite3_column_int(st, 5); |
|
|
|
int node_rtt = sqlite3_column_int(st, 6); |
|
|
|
int storage_flag = sqlite3_column_int(st, 6); |
|
|
|
int storage_flag = sqlite3_column_int(st, 7); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int is_admin = 0, is_super = 0, is_moder = 0, is_verified = 0, is_deleted = 0; |
|
|
|
int is_admin = 0, is_super = 0, is_moder = 0, is_verified = 0, is_deleted = 0; |
|
|
|
if (adm_tags) { |
|
|
|
if (adm_tags) { |
|
|
|
@ -763,18 +762,18 @@ char* utun_bridge_get_channel_members_json(const char* channel_id) { |
|
|
|
first = 0; |
|
|
|
first = 0; |
|
|
|
|
|
|
|
|
|
|
|
size_t needed = snprintf(NULL, 0, |
|
|
|
size_t needed = snprintf(NULL, 0, |
|
|
|
"%s{\"n\":\"%s\",\"ni\":%llu,\"on\":%d,\"ad\":%d,\"sp\":%d,\"md\":%d,\"st\":%d," |
|
|
|
"%s{\"n\":\"%s\",\"ni\":%llu,\"on\":0,\"ad\":%d,\"sp\":%d,\"md\":%d,\"st\":%d," |
|
|
|
"\"vd\":%d,\"dl\":%d,\"tp\":%d,\"rt\":%d,\"is\":%d}", |
|
|
|
"\"vd\":%d,\"dl\":%d,\"tp\":%d,\"rt\":%d,\"is\":%d}", |
|
|
|
sep, esc_name, (unsigned long long)node_id, online, |
|
|
|
sep, esc_name, (unsigned long long)node_id, |
|
|
|
is_admin, is_super, is_moder, storage_flag, |
|
|
|
is_admin, is_super, is_moder, storage_flag, |
|
|
|
is_verified, is_deleted, node_type, node_rtt, (node_id == my_id) ? 1 : 0); |
|
|
|
is_verified, is_deleted, node_type, node_rtt, (node_id == my_id) ? 1 : 0); |
|
|
|
|
|
|
|
|
|
|
|
while (pos + needed + 2 > cap) { char* tmp = u_realloc(json, cap * 2); if (!tmp) break; json = tmp; cap *= 2; } |
|
|
|
while (pos + needed + 2 > cap) { char* tmp = u_realloc(json, cap * 2); if (!tmp) break; json = tmp; cap *= 2; } |
|
|
|
if (pos + needed + 2 <= cap) |
|
|
|
if (pos + needed + 2 <= cap) |
|
|
|
pos += (size_t)snprintf(json + pos, cap - pos, |
|
|
|
pos += (size_t)snprintf(json + pos, cap - pos, |
|
|
|
"%s{\"n\":\"%s\",\"ni\":%llu,\"on\":%d,\"ad\":%d,\"sp\":%d,\"md\":%d,\"st\":%d," |
|
|
|
"%s{\"n\":\"%s\",\"ni\":%llu,\"on\":0,\"ad\":%d,\"sp\":%d,\"md\":%d,\"st\":%d," |
|
|
|
"\"vd\":%d,\"dl\":%d,\"tp\":%d,\"rt\":%d,\"is\":%d}", |
|
|
|
"\"vd\":%d,\"dl\":%d,\"tp\":%d,\"rt\":%d,\"is\":%d}", |
|
|
|
sep, esc_name, (unsigned long long)node_id, online, |
|
|
|
sep, esc_name, (unsigned long long)node_id, |
|
|
|
is_admin, is_super, is_moder, storage_flag, |
|
|
|
is_admin, is_super, is_moder, storage_flag, |
|
|
|
is_verified, is_deleted, node_type, node_rtt, (node_id == my_id) ? 1 : 0); |
|
|
|
is_verified, is_deleted, node_type, node_rtt, (node_id == my_id) ? 1 : 0); |
|
|
|
u_free(esc_name); |
|
|
|
u_free(esc_name); |
|
|
|
@ -796,19 +795,18 @@ char* utun_bridge_get_member_detail_json(const char* channel_id, uint64_t node_i |
|
|
|
|
|
|
|
|
|
|
|
sqlite3_stmt* st = NULL; |
|
|
|
sqlite3_stmt* st = NULL; |
|
|
|
if (sqlite3_prepare_v2(db, |
|
|
|
if (sqlite3_prepare_v2(db, |
|
|
|
"SELECT COALESCE(name,''), COALESCE(online,0)," |
|
|
|
"SELECT COALESCE(name,'')," |
|
|
|
" COALESCE(last_seen_at,0), COALESCE(created_at,0)" |
|
|
|
" COALESCE(last_seen_at,0), COALESCE(created_at,0)" |
|
|
|
" FROM nodes WHERE node_id=?", -1, &st, NULL) == SQLITE_OK) { |
|
|
|
" FROM nodes WHERE node_id=?", -1, &st, NULL) == SQLITE_OK) { |
|
|
|
sqlite3_bind_int64(st, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int64(st, 1, (sqlite3_int64)node_id); |
|
|
|
if (sqlite3_step(st) == SQLITE_ROW) { |
|
|
|
if (sqlite3_step(st) == SQLITE_ROW) { |
|
|
|
const char* name = (const char*)sqlite3_column_text(st, 0); |
|
|
|
const char* name = (const char*)sqlite3_column_text(st, 0); |
|
|
|
int online = sqlite3_column_int(st, 1); |
|
|
|
int64_t last_seen = sqlite3_column_int64(st, 1); |
|
|
|
int64_t last_seen = sqlite3_column_int64(st, 2); |
|
|
|
int64_t created = sqlite3_column_int64(st, 2); |
|
|
|
int64_t created = sqlite3_column_int64(st, 3); |
|
|
|
|
|
|
|
char* esc_name = json_escape_alloc(name && name[0] ? name : ""); |
|
|
|
char* esc_name = json_escape_alloc(name && name[0] ? name : ""); |
|
|
|
pos += (size_t)snprintf(buf + pos, sizeof(buf) - pos, |
|
|
|
pos += (size_t)snprintf(buf + pos, sizeof(buf) - pos, |
|
|
|
",\"n\":\"%s\",\"on\":%d,\"ls\":%lld,\"cr\":%lld", |
|
|
|
",\"n\":\"%s\",\"on\":0,\"ls\":%lld,\"cr\":%lld", |
|
|
|
esc_name, online, (long long)last_seen, (long long)created); |
|
|
|
esc_name, (long long)last_seen, (long long)created); |
|
|
|
u_free(esc_name); |
|
|
|
u_free(esc_name); |
|
|
|
} |
|
|
|
} |
|
|
|
sqlite3_finalize(st); |
|
|
|
sqlite3_finalize(st); |
|
|
|
|