ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
discovery_status.c File Reference

Discovery service status screen display implementation. More...

Go to the source code of this file.

Functions

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)
 
void discovery_status_display (const discovery_status_t *status)
 
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)
 

Detailed Description

Discovery service status screen display implementation.

Definition in file discovery_status.c.

Function Documentation

◆ discovery_status_display()

void discovery_status_display ( const discovery_status_t *  status)

Definition at line 49 of file discovery_status.c.

49 {
50 if (!status) {
51 return;
52 }
53
54 // Get actual terminal dimensions
55 terminal_size_t term_size;
56 if (terminal_get_size(&term_size) != ASCIICHAT_OK) {
57 // Fallback to standard dimensions
58 term_size.cols = 80;
59 term_size.rows = 24;
60 }
61
62 // Content is max 80 chars wide, centered in terminal
63 const int CONTENT_WIDTH = 80;
64 int box_padding = (term_size.cols > CONTENT_WIDTH) ? (term_size.cols - CONTENT_WIDTH) / 2 : 0;
65
66 // Calculate uptime
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;
72
73 // Clear screen and move to home position
74 printf("\033[H\033[2J");
75
76 // Add vertical centering
77 int vertical_padding = display_center_vertical(10, term_size.rows);
78 for (int i = 0; i < vertical_padding; i++)
79 printf("\n");
80
81 // Print top border (80 chars wide, centered)
82 for (int i = 0; i < box_padding; i++)
83 printf(" ");
84 for (int i = 0; i < CONTENT_WIDTH; i++)
85 printf("━");
86 printf("\n");
87
88 // Build and center the title
89 char title[] = "ascii-chat discovery-service Status";
90
91 char colored_title[256];
92 snprintf(colored_title, sizeof(colored_title), "\033[1;36m%s\033[0m", title);
93
94 // Calculate horizontal padding to center within the 80-char box
95 int horizontal_padding = display_center_horizontal(title, CONTENT_WIDTH);
96
97 // Print centered title (80 chars wide, centered)
98 for (int i = 0; i < box_padding; i++)
99 printf(" ");
100 for (int i = 0; i < horizontal_padding; i++)
101 printf(" ");
102 printf("%s\n", colored_title);
103
104 // Print bottom border (80 chars wide, centered)
105 for (int i = 0; i < box_padding; i++)
106 printf(" ");
107 for (int i = 0; i < CONTENT_WIDTH; i++)
108 printf("━");
109 printf("\n");
110
111 // Bind addresses with IP type
112 if (status->ipv4_bound) {
113 char ipv4_only[64];
114 const char *type = "";
115 if (extract_ip_from_address(status->ipv4_address, ipv4_only, sizeof(ipv4_only)) == 0) {
116 type = get_ip_type_string(ipv4_only);
117 }
118 for (int i = 0; i < box_padding; i++)
119 printf(" ");
120 if (type[0] != '\0') {
121 printf("📍 IPv4: %s (%s)\n", status->ipv4_address, type);
122 } else {
123 printf("📍 IPv4: %s\n", status->ipv4_address);
124 }
125 }
126 if (status->ipv6_bound) {
127 char ipv6_only[64];
128 const char *type = "";
129 if (extract_ip_from_address(status->ipv6_address, ipv6_only, sizeof(ipv6_only)) == 0) {
130 type = get_ip_type_string(ipv6_only);
131 }
132 for (int i = 0; i < box_padding; i++)
133 printf(" ");
134 if (type[0] != '\0') {
135 printf("📍 IPv6: %s (%s)\n", status->ipv6_address, type);
136 } else {
137 printf("📍 IPv6: %s\n", status->ipv6_address);
138 }
139 }
140
141 // Connected servers
142 for (int i = 0; i < box_padding; i++)
143 printf(" ");
144 printf("🖥️ Connected Servers: \033[1;33m%zu\033[0m\n", status->connected_servers);
145
146 // Active sessions
147 for (int i = 0; i < box_padding; i++)
148 printf(" ");
149 printf("🔗 Active Sessions: \033[1;33m%zu\033[0m\n", status->active_sessions);
150
151 // Uptime
152 char uptime_str[12];
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++)
155 printf(" ");
156 printf("⏱️ %s\n", uptime_str);
157
158 // Print bottom border (80 chars wide, centered)
159 for (int i = 0; i < box_padding; i++)
160 printf(" ");
161 for (int i = 0; i < CONTENT_WIDTH; i++)
162 printf("━");
163 printf("\n");
164 fflush(stdout);
165}
int extract_ip_from_address(const char *addr_with_port, char *ip_out, size_t ip_out_size)
Definition ip.c:1053
const char * get_ip_type_string(const char *ip)
Definition ip.c:1091
int display_center_horizontal(const char *text, int terminal_width)
int display_center_vertical(int content_height, int terminal_height)
asciichat_error_t terminal_get_size(terminal_size_t *size)
int format_uptime_hms(int hours, int minutes, int seconds, char *buffer, size_t buffer_size)
Definition util/time.c:369

References display_center_horizontal(), display_center_vertical(), extract_ip_from_address(), format_uptime_hms(), get_ip_type_string(), and terminal_get_size().

Referenced by acds_main(), and discovery_status_update().

◆ discovery_status_gather()

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 
)

Definition at line 16 of file discovery_status.c.

18 {
19 if (!server || !db || !out_status) {
20 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid parameters for discovery_status_gather");
21 }
22
23 memset(out_status, 0, sizeof(*out_status));
24
25 // Format IPv4 address
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);
29 }
30
31 // Format IPv6 address
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);
35 }
36
37 out_status->port = port;
38 out_status->start_time = start_time;
39 out_status->connected_servers = tcp_server_get_client_count(server);
40
41 // Count active sessions in database
42 // This would require a query function in discovery/database.h
43 // For now, set to 0 - this will be implemented based on database API
44 out_status->active_sessions = 0;
45
46 return ASCIICHAT_OK;
47}
size_t tcp_server_get_client_count(tcp_server_t *server)

References tcp_server_get_client_count().

Referenced by acds_main(), and discovery_status_update().

◆ discovery_status_update()

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 
)

Definition at line 167 of file discovery_status.c.

168 {
169 if (!server || !db || !last_update) {
170 return;
171 }
172
173 // Only update every 1-2 seconds
174 time_t now = time(NULL);
175 if (now - *last_update < 1) {
176 return;
177 }
178
179 discovery_status_t status;
180 if (discovery_status_gather(server, db, ipv4_address, ipv6_address, port, start_time, &status) == ASCIICHAT_OK) {
182 *last_update = now;
183 }
184}
void discovery_status_display(const discovery_status_t *status)
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)

References discovery_status_display(), and discovery_status_gather().