message: netinfo: add i2p network
  the i2p peer counts column is displayed iff the node is connected
  to at least one i2p peer, so this doesn't add clutter for users
  who are not running an i2p service
diff: @@ -300,8 +300,9 @@ class NetinfoRequestHandler : public BaseRequestHandler
  {
  private:
  static constexpr int8_t UNKNOWN_NETWORK{-1};
  - static constexpr uint8_t m_networks_size{3};
  - const std::array<std::string, m_networks_size> m_networks{{"ipv4", "ipv6", "onion"}};
  + static constexpr int8_t NET_I2P{3}; // pos of "i2p" in m_networks
  + static constexpr uint8_t m_networks_size{4};
  + const std::array<std::string, m_networks_size> m_networks{{"ipv4", "ipv6", "onion", "i2p"}};
  std::array<std::array<uint16_t, m_networks_size + 2>, 3> m_counts{{{}}}; //!< Peer counts by (in/out/total, networks/total/block-relay)
  uint8_t m_manual_peers_count{0};
  int8_t NetworkStringToId(const std::string& str) const
  @@ -317,6 +318,7 @@ private:
  bool IsAddressSelected() const { return m_details_level == 2 || m_details_level == 4; }
  bool IsVersionSelected() const { return m_details_level == 3 || m_details_level == 4; }
  bool m_is_asmap_on{false};
  + bool m_is_i2p_on{false};
  size_t m_max_addr_length{0};
  size_t m_max_age_length{3};
  size_t m_max_id_length{2};
  @@ -468,6 +470,7 @@ public:
  const std::string network{peer["network"].get_str()};
  const int8_t network_id{NetworkStringToId(network)};
  if (network_id == UNKNOWN_NETWORK) continue;
  + m_is_i2p_on |= (network_id == NET_I2P);
  const bool is_outbound{!peer["inbound"].get_bool()};
  const bool is_block_relay{!peer["relaytxes"].get_bool()};
  const std::string conn_type{peer["connection_type"].get_str()};
  @@ -542,11 +545,15 @@ public:
  }
  // Report peer connection totals by type.
  - result += " ipv4 ipv6 onion total block";
  + result += " ipv4 ipv6 onion";
  + if (m_is_i2p_on) result += " i2p";
  + result += " total block";
  if (m_manual_peers_count) result += " manual";
  const std::array<std::string, 3> rows{{"in", "out", "total"}};
  - for (uint8_t i = 0; i < m_networks_size; ++i) {
  - result += strprintf("\n%-5s %5i %5i %5i %5i %5i", rows.at(i), m_counts.at(i).at(0), m_counts.at(i).at(1), m_counts.at(i).at(2), m_counts.at(i).at(m_networks_size), m_counts.at(i).at(m_networks_size + 1));
  + for (uint8_t i = 0; i < 3; ++i) {
  + result += strprintf("\n%-5s %5i %5i %5i", rows.at(i), m_counts.at(i).at(0), m_counts.at(i).at(1), m_counts.at(i).at(2)); // ipv4/ipv6/onion peers counts
  + if (m_is_i2p_on) result += strprintf(" %5i", m_counts.at(i).at(3)); // i2p peers count
  + result += strprintf(" %5i %5i", m_counts.at(i).at(m_networks_size), m_counts.at(i).at(m_networks_size + 1));
  if (i == 1 && m_manual_peers_count) result += strprintf(" %5i", m_manual_peers_count);
  }
  