use anyhow::Error;
use async_trait::async_trait;
use clap::Parser;
use minotari_app_utilities::utilities::UniPublicKey;
use tari_comms::{
multiaddr::Multiaddr,
net_address::{MultiaddressesWithStats, PeerAddressSource},
peer_manager::{NodeId, Peer, PeerFeatures, PeerFlags},
};
use super::{CommandContext, HandleCommand};
#[derive(Debug, Parser)]
pub struct ArgsAddPeer {
public_key: UniPublicKey,
address: Multiaddr,
}
#[async_trait]
impl HandleCommand<ArgsAddPeer> for CommandContext {
async fn handle_command(&mut self, args: ArgsAddPeer) -> Result<(), Error> {
let public_key = args.public_key.into();
if *self.comms.node_identity().public_key() == public_key {
return Err(Error::msg("Cannot add self as peer"));
}
let peer_manager = self.comms.peer_manager();
let node_id = NodeId::from_public_key(&public_key);
let peer = Peer::new(
public_key,
node_id.clone(),
MultiaddressesWithStats::from_addresses_with_source(vec![args.address], &PeerAddressSource::Config),
PeerFlags::empty(),
PeerFeatures::COMMUNICATION_NODE,
vec![],
String::new(),
);
peer_manager.add_or_update_peer(peer).await?;
println!("Peer with node id '{}' was added to the base node.", node_id);
self.dial_peer(node_id).await?;
Ok(())
}
}