From 585262fe4f9e4129d45033d23c89cea5653ffeeb Mon Sep 17 00:00:00 2001 From: m1ngsama Date: Sun, 17 May 2026 14:17:02 +0800 Subject: [PATCH] commands: refresh :list output to match M7 aesthetic (UX-8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :list used to look like an ASCII printout from the 90s: ======================================== Online Users / 在线用户 ======================================== Total / 总数: 3 ---------------------------------------- * 1. alice (5m) 2. bob (12s) 3. carol (1h2m) ======================================== * = you / 你 Now it matches the rest of the TUI: 在线用户 · online · 3 ▎ alice · 5m bob · 12s carol · 1h2m - bold cyan title chip, dim grey total count - 1-column ▎ gutter on your own row (same vocabulary as UX-1 message gutter) - dim grey "· duration" separator instead of parentheses + ASCII rule - no trailing rule, no legend explaining "* = you" because the gutter speaks for itself --- src/commands.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/commands.c b/src/commands.c index 641c52f..f9b59fc 100644 --- a/src/commands.c +++ b/src/commands.c @@ -78,20 +78,15 @@ void commands_dispatch(client_t *client) { if (strcmp(cmd, "list") == 0 || strcmp(cmd, "users") == 0 || strcmp(cmd, "who") == 0) { - buffer_appendf(output, sizeof(output), &pos, - "========================================\n" - " Online Users / 在线用户\n" - "========================================\n"); - pthread_rwlock_rdlock(&g_room->lock); + int total = g_room->client_count; buffer_appendf(output, sizeof(output), &pos, - "Total / 总数: %d\n" - "----------------------------------------\n", - g_room->client_count); + "\033[1;36m在线用户 · online\033[0m " + "\033[2;37m· %d\033[0m\n", total); time_t now = time(NULL); - for (int i = 0; i < g_room->client_count; i++) { - char marker = (g_room->clients[i] == client) ? '*' : ' '; + for (int i = 0; i < total; i++) { + bool is_self = (g_room->clients[i] == client); int dur = (int)(now - g_room->clients[i]->connect_time); char dur_str[32]; if (dur < 60) { @@ -99,19 +94,17 @@ void commands_dispatch(client_t *client) { } else if (dur < 3600) { snprintf(dur_str, sizeof(dur_str), "%dm", dur / 60); } else { - snprintf(dur_str, sizeof(dur_str), "%dh%dm", dur / 3600, (dur % 3600) / 60); + snprintf(dur_str, sizeof(dur_str), "%dh%dm", + dur / 3600, (dur % 3600) / 60); } + /* 1-column gutter: ▎ for you, blank for others */ buffer_appendf(output, sizeof(output), &pos, - "%c %d. %s (%s)\n", marker, i + 1, + "%s \033[37m%s\033[0m \033[2;37m· %s\033[0m\n", + is_self ? "\033[36m▎\033[0m" : " ", g_room->clients[i]->username, dur_str); } - pthread_rwlock_unlock(&g_room->lock); - buffer_appendf(output, sizeof(output), &pos, - "========================================\n" - "* = you / 你\n"); - } else if (strcmp(cmd, "help") == 0 || strcmp(cmd, "commands") == 0) { buffer_appendf(output, sizeof(output), &pos, "========================================\n"