void print_node_info(const DhtRunner& dht, const dht_params& params) { std::cout << "OpenDht node " << dht.getNodeId() << " running on port " << dht.getBoundPort() << std::endl; if (params.is_bootstrap_node) std::cout << "Running in bootstrap mode (discouraged)." << std::endl; if (params.generate_identity) std::cout << "Public key ID " << dht.getId() << std::endl; }
int main(int argc, char **argv) { auto params = parseArgs(argc, argv); // TODO: remove with GnuTLS >= 3.3 if (int rc = gnutls_global_init()) throw std::runtime_error(std::string("Error initializing GnuTLS: ")+gnutls_strerror(rc)); DhtRunner dht; dht.run(params.port, dht::crypto::generateIdentity("DHT Chat Node"), true); if (not params.bootstrap.first.empty()) dht.bootstrap(params.bootstrap.first.c_str(), params.bootstrap.second.c_str()); print_node_info(dht, params); std::cout << " type 'c {hash}' to join a channel" << std::endl << std::endl; bool connected {false}; InfoHash room; const InfoHash myid = dht.getId(); // using the GNU History API using_history(); while (true) { // using the GNU Readline API std::string line = readLine(connected ? PROMPT : "> "); if (!line.empty() && line[0] == '\0') break; if (line.empty()) continue; static constexpr dht::InfoHash INVALID_ID {}; std::istringstream iss(line); std::string op, idstr; iss >> op; if (not connected) { if (op == "x" || op == "q" || op == "exit" || op == "quit") break; else if (op == "c") { iss >> idstr; room = InfoHash(idstr); if (room == INVALID_ID) { room = InfoHash::get(idstr); std::cout << "Joining h(" << idstr << ") = " << room << std::endl; } dht.listen<dht::ImMessage>(room, [&](dht::ImMessage&& msg) { if (msg.from != myid) std::cout << msg.from.toString() << " at " << printTime(msg.date) << " (took " << print_dt(std::chrono::system_clock::now() - std::chrono::system_clock::from_time_t(msg.date)) << "s) " << (msg.to == myid ? "ENCRYPTED ":"") << ": " << msg.id << " - " << msg.msg << std::endl; return true; }); connected = true; } else { std::cout << "Unknown command. Type 'c {hash}' to join a channel" << std::endl << std::endl; } } else {
void print_node_info(const DhtRunner& dht, const dht_params& params) { std::cout << "OpenDht node " << dht.getNodeId() << " running on port " << dht.getBoundPort() << std::endl; std::cout << "Public key ID " << dht.getId() << std::endl; }