use std::time::Duration;
use anyhow::Error;
use async_trait::async_trait;
use clap::Parser;
use minotari_app_utilities::utilities::UniNodeId;
use tari_comms::peer_manager::NodeId;
use thiserror::Error;
use super::{CommandContext, HandleCommand};
#[derive(Debug, Parser)]
pub struct ArgsBan {
node_id: UniNodeId,
#[clap(default_value_t = std::u64::MAX)]
length: u64,
}
#[async_trait]
impl HandleCommand<ArgsBan> for CommandContext {
async fn handle_command(&mut self, args: ArgsBan) -> Result<(), Error> {
let node_id = args.node_id.into();
let duration = Duration::from_secs(args.length);
self.ban_peer(node_id, duration, true).await
}
}
#[derive(Debug, Parser)]
pub struct ArgsUnban {
node_id: UniNodeId,
#[clap(default_value_t = std::u64::MAX)]
length: u64,
}
#[async_trait]
impl HandleCommand<ArgsUnban> for CommandContext {
async fn handle_command(&mut self, args: ArgsUnban) -> Result<(), Error> {
let node_id = args.node_id.into();
let duration = Duration::from_secs(args.length);
self.ban_peer(node_id, duration, false).await
}
}
#[derive(Error, Debug)]
enum ArgsError {
#[error("Cannot ban our own node")]
BanSelf,
}
impl CommandContext {
pub async fn ban_peer(&mut self, node_id: NodeId, duration: Duration, must_ban: bool) -> Result<(), Error> {
if self.base_node_identity.node_id() == &node_id {
Err(ArgsError::BanSelf.into())
} else if must_ban {
self.comms
.connectivity()
.ban_peer_until(node_id.clone(), duration, "UI manual ban".to_string())
.await?;
println!("Peer was banned in base node.");
Ok(())
} else {
self.comms.peer_manager().unban_peer(&node_id).await?;
println!("Peer ban was removed from base node.");
Ok(())
}
}
}