9#include <ascii-chat/network/mdns/discovery_tui.h>
10#include <ascii-chat/network/mdns/discovery.h>
11#include <ascii-chat/common.h>
12#include <ascii-chat/log/logging.h>
13#include <ascii-chat/platform/abstraction.h>
29 SET_ERRNO(ERROR_INVALID_PARAM,
"out_count pointer is NULL");
36 int timeout_ms = (config && config->timeout_ms > 0) ? config->timeout_ms : 2000;
37 int max_servers = (config && config->max_servers > 0) ? config->max_servers : 20;
38 bool quiet = (config && config->quiet);
55 if (!servers || count <= 0) {
60 printf(
"\nAvailable ascii-chat servers on LAN:\n");
61 for (
int i = 0; i < count; i++) {
62 const discovery_tui_server_t *srv = &servers[i];
64 printf(
" %d. %s (%s:%u)\n", i + 1, srv->name, addr, srv->port);
68 printf(
"\nSelect server (1-%d) or press Enter to cancel: ", count);
73 if (fgets(input,
sizeof(input), stdin) == NULL) {
79 if (input[0] ==
'\n' || input[0] ==
'\r' || input[0] ==
'\0') {
85 long selection = strtol(input, &endptr, 10);
88 if (selection < 1 || selection > count) {
89 printf(
"ā ļø Invalid selection. Please enter a number between 1 and %d\n", count);
93 return (
int)(selection - 1);
99#define ANSI_CLEAR "\033[2J\033[H"
100#define ANSI_BOLD "\033[1m"
101#define ANSI_RESET "\033[0m"
102#define ANSI_CYAN "\033[36m"
103#define ANSI_GREEN "\033[32m"
104#define ANSI_YELLOW "\033[33m"
105#define ANSI_HIDE_CURSOR "\033[?25l"
106#define ANSI_SHOW_CURSOR "\033[?25h"
107#define ANSI_CLEAR_LINE "\033[K"
123 if (!servers || count <= 0) {
139 log_plain(
"%sā%s Found %d server%s on your local network:%s\n",
ANSI_BOLD,
ANSI_GREEN, count, count == 1 ?
"" :
"s",
144 for (
int i = 0; i < count; i++) {
145 const discovery_tui_server_t *srv = &servers[i];
155 log_plain(
"%sā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāÆ%s\n",
ANSI_BOLD,
ANSI_RESET);
159 log_plain(
"Enter server number (1-%d) or press Enter to cancel: ", count);
167 if (fgets(input,
sizeof(input), stdin) == NULL) {
172 if (input[0] ==
'\n' || input[0] ==
'\r' || input[0] ==
'\0') {
178 long selection = strtol(input, &endptr, 10);
181 if (selection < 1 || selection > count) {
192 log_plain(
"%sš Connecting to %s...%s\n",
ANSI_GREEN, servers[selection - 1].name,
ANSI_RESET);
202 return (
int)(selection - 1);
214 if (server->ipv4[0] !=
'\0') {
217 if (server->name[0] !=
'\0') {
220 if (server->ipv6[0] !=
'\0') {
224 return server->address;
void discovery_mdns_destroy(discovery_tui_server_t *servers)
Free memory from mDNS discovery results.
discovery_tui_server_t * discovery_mdns_query(int timeout_ms, int max_servers, bool quiet, int *out_count)
Public mDNS query function used by both parallel discovery and TUI wrapper.
void discovery_tui_free_results(discovery_tui_server_t *servers)
Free results from mDNS discovery.
discovery_tui_server_t * discovery_tui_query(const discovery_tui_config_t *config, int *out_count)
TUI wrapper around core mDNS discovery.
int discovery_tui_prompt_selection(const discovery_tui_server_t *servers, int count)
Interactive server selection.
#define ANSI_CLEAR
ANSI escape codes for TUI.
int discovery_tui_select(const discovery_tui_server_t *servers, int count)
TUI-based server selection with formatted display.
const char * discovery_tui_get_best_address(const discovery_tui_server_t *server)
Get best address for a server.
bool log_lock_terminal(void)
void log_unlock_terminal(bool previous_state)