17 const char *ipv6_address, uint16_t port, time_t start_time,
18 discovery_status_t *out_status) {
19 if (!server || !db || !out_status) {
20 return SET_ERRNO(ERROR_INVALID_PARAM,
"Invalid parameters for discovery_status_gather");
23 memset(out_status, 0,
sizeof(*out_status));
26 out_status->ipv4_bound = (ipv4_address && ipv4_address[0] !=
'\0');
27 if (out_status->ipv4_bound) {
28 snprintf(out_status->ipv4_address,
sizeof(out_status->ipv4_address),
"%s:%u", ipv4_address, port);
32 out_status->ipv6_bound = (ipv6_address && ipv6_address[0] !=
'\0');
33 if (out_status->ipv6_bound) {
34 snprintf(out_status->ipv6_address,
sizeof(out_status->ipv6_address),
"[%s]:%u", ipv6_address, port);
37 out_status->port = port;
38 out_status->start_time = start_time;
44 out_status->active_sessions = 0;
55 terminal_size_t term_size;
63 const int CONTENT_WIDTH = 80;
64 int box_padding = (term_size.cols > CONTENT_WIDTH) ? (term_size.cols - CONTENT_WIDTH) / 2 : 0;
67 time_t now = time(NULL);
68 time_t uptime_secs = now - status->start_time;
69 int uptime_hours = uptime_secs / SEC_PER_HOUR;
70 int uptime_mins = (uptime_secs % SEC_PER_HOUR) / SEC_PER_MIN;
71 int uptime_secs_rem = uptime_secs % 60;
74 printf(
"\033[H\033[2J");
78 for (
int i = 0; i < vertical_padding; i++)
82 for (
int i = 0; i < box_padding; i++)
84 for (
int i = 0; i < CONTENT_WIDTH; i++)
89 char title[] =
"ascii-chat discovery-service Status";
91 char colored_title[256];
92 snprintf(colored_title,
sizeof(colored_title),
"\033[1;36m%s\033[0m", title);
98 for (
int i = 0; i < box_padding; i++)
100 for (
int i = 0; i < horizontal_padding; i++)
102 printf(
"%s\n", colored_title);
105 for (
int i = 0; i < box_padding; i++)
107 for (
int i = 0; i < CONTENT_WIDTH; i++)
112 if (status->ipv4_bound) {
114 const char *type =
"";
118 for (
int i = 0; i < box_padding; i++)
120 if (type[0] !=
'\0') {
121 printf(
"📍 IPv4: %s (%s)\n", status->ipv4_address, type);
123 printf(
"📍 IPv4: %s\n", status->ipv4_address);
126 if (status->ipv6_bound) {
128 const char *type =
"";
132 for (
int i = 0; i < box_padding; i++)
134 if (type[0] !=
'\0') {
135 printf(
"📍 IPv6: %s (%s)\n", status->ipv6_address, type);
137 printf(
"📍 IPv6: %s\n", status->ipv6_address);
142 for (
int i = 0; i < box_padding; i++)
144 printf(
"🖥️ Connected Servers: \033[1;33m%zu\033[0m\n", status->connected_servers);
147 for (
int i = 0; i < box_padding; i++)
149 printf(
"🔗 Active Sessions: \033[1;33m%zu\033[0m\n", status->active_sessions);
153 format_uptime_hms(uptime_hours, uptime_mins, uptime_secs_rem, uptime_str,
sizeof(uptime_str));
154 for (
int i = 0; i < box_padding; i++)
156 printf(
"⏱️ %s\n", uptime_str);
159 for (
int i = 0; i < box_padding; i++)
161 for (
int i = 0; i < CONTENT_WIDTH; i++)
168 const char *ipv6_address, uint16_t port, time_t start_time, time_t *last_update) {
169 if (!server || !db || !last_update) {
174 time_t now = time(NULL);
175 if (now - *last_update < 1) {
179 discovery_status_t status;
180 if (
discovery_status_gather(server, db, ipv4_address, ipv6_address, port, start_time, &status) == ASCIICHAT_OK) {
void discovery_status_update(tcp_server_t *server, discovery_database_t *db, const char *ipv4_address, const char *ipv6_address, uint16_t port, time_t start_time, time_t *last_update)
asciichat_error_t discovery_status_gather(tcp_server_t *server, discovery_database_t *db, const char *ipv4_address, const char *ipv6_address, uint16_t port, time_t start_time, discovery_status_t *out_status)