#include "client.h" #include #include #include // helper to print a hash in hex format void print_hash(const hash h) { for (int i = 0; i < 32; ++i) { printf("%02x", h[ i ]); } } // helper to print an IP address void print_ip(const struct relay_neighbor *n) { if (n->has_ipv4) { printf("%d.%d.%d.%d", n->v4_addr[ 0 ], n->v4_addr[ 1 ], n->v4_addr[ 2 ], n->v4_addr[ 3 ]); } else if (n->has_ipv6) { char ip_string[ 46 ]; int offset = 0; for (int j = 0; j < 8; ++j) { uint16_t word = (n->v6_addr[ j * 2 ] << 8) | n->v6_addr[ j * 2 + 1 ]; offset += snprintf( ip_string + offset, sizeof(ip_string) - offset, "%x%s", word, (j < 7) ? ":" : ""); } printf("%s", ip_string); } else { printf("N/A"); } } int main() { printf("moonpaste client library test!\n\n"); const char *server_ip = "127.0.0.1"; const int server_port = 2000; mp_client_error_t err; // 1. audit the server printf("Auditing server at %s:%d...\n", server_ip, server_port); struct relay_info info; err = mp_get_server_info(server_ip, server_port, &info); if (err != MP_CLIENT_SUCCESS) { fprintf(stderr, "Failed to audit server. Error code: %d\n", err); return 1; } printf(" Server Audit Complete:\n"); printf(" - Version: v%d.%d\n", info.major_version, info.minor_version); printf(" - MOTD: %s\n", info.motd); printf(" - PoW Zeros: %d\n", info.capabilities.leading_zeros); printf(" - Held Packets: %lu\n\n", info.statistics.held_packets); // 2. create and push a new packet printf("Generating keypair and creating a packet...\n"); keypair author = mp_generate_keypair(); const char message[] = "This is a test message from the moonpaste client library."; struct data_packet new_packet = mp_create_packet_from_bytes((const byte *) message, strlen(message), 0, NULL, author); printf("Running Proof-of-Work with %d leading zeros...\n", info.capabilities.leading_zeros); new_packet = mp_run_pow(new_packet, info.capabilities.leading_zeros); printf(" PoW complete. Nonce: %u, Hash: ", new_packet.nonce); print_hash(new_packet.hash); printf("\n"); printf("Pushing packet to server...\n"); bool success; err = mp_push_packet(server_ip, server_port, new_packet, &success); if (err != MP_CLIENT_SUCCESS || !success) { fprintf(stderr, "Failed to push packet. Error: %d, Success: %d\n", err, success); } else { printf(" Packet pushed successfully!\n\n"); } // 3. retrieve the packet we just pushed printf("Retrieving the packet by hash...\n"); struct data_packet retrieved_packet; err = mp_get_packet(server_ip, server_port, new_packet.hash, &retrieved_packet); if (err != MP_CLIENT_SUCCESS) { fprintf(stderr, "Failed to retrieve packet. Error: %d\n", err); } else { printf(" Packet retrieved successfully!\n"); printf(" Contents: '%.*s'\n\n", (int) strlen(message), retrieved_packet.contents.data); } // 4. get a list of neighbors printf("Requesting 5 neighbors...\n"); struct relay_neighbor *neighbors = NULL; byte neighbor_count = 0; err = mp_get_server_neighbors(server_ip, server_port, 5, &neighbors, &neighbor_count); if (err != MP_CLIENT_SUCCESS) { fprintf(stderr, "Failed to get neighbors. Error: %d\n", err); } else { printf(" Received %d neighbors:\n", neighbor_count); for (byte i = 0; i < neighbor_count; ++i) { printf(" - Neighbor %d: ", i + 1); print_ip(&neighbors[ i ]); printf("\n"); } free(neighbors); // free me } return 0; }