Pumpkin/pumpkin/src/command/commands/banlist.rs
2026-05-03 21:31:46 +02:00

127 lines
4.3 KiB
Rust

use crate::command::argument_builder::{ArgumentBuilder, command, literal};
use crate::command::context::command_context::CommandContext;
use crate::command::node::dispatcher::CommandDispatcher;
use crate::command::node::{CommandExecutor, CommandExecutorResult};
use pumpkin_data::translation;
use pumpkin_util::PermissionLvl;
use pumpkin_util::permission::{Permission, PermissionDefault, PermissionRegistry};
use pumpkin_util::text::TextComponent;
const DESCRIPTION: &str = "Prints the banlist of players, IPs, or both at once.";
const PERMISSION: &str = "minecraft:command.banlist";
struct BanListEntry {
name: String,
source: String,
reason: String,
}
struct BanListCommandExecutor {
players: bool,
ips: bool,
}
impl CommandExecutor for BanListCommandExecutor {
fn execute<'a>(&'a self, context: &'a CommandContext) -> CommandExecutorResult<'a> {
Box::pin(async move {
let mut entries = Vec::new();
let data = &context.server().data;
if self.players {
let lock = data.banned_player_list.read().await;
for entry in &lock.banned_players {
entries.push(BanListEntry {
name: entry.name.clone(),
source: entry.source.clone(),
reason: entry.reason.clone(),
});
}
}
if self.ips {
let lock = data.banned_ip_list.read().await;
for entry in &lock.banned_ips {
entries.push(BanListEntry {
name: entry.ip.to_string(),
source: entry.source.clone(),
reason: entry.reason.clone(),
});
}
}
let entries_len = entries.len() as i32;
let source = &context.source;
if entries.is_empty() {
source
.send_feedback(
TextComponent::translate_cross(
translation::java::COMMANDS_BANLIST_NONE,
translation::java::COMMANDS_BANLIST_NONE,
[],
),
false,
)
.await;
} else {
source
.send_feedback(
TextComponent::translate_cross(
translation::java::COMMANDS_BANLIST_LIST,
translation::java::COMMANDS_BANLIST_LIST,
[TextComponent::text(entries.len().to_string())],
),
false,
)
.await;
for entry in entries {
source
.send_feedback(
TextComponent::translate_cross(
translation::java::COMMANDS_BANLIST_ENTRY,
translation::java::COMMANDS_BANLIST_ENTRY,
[
TextComponent::text(entry.name),
TextComponent::text(entry.source),
TextComponent::text(entry.reason),
],
),
false,
)
.await;
}
}
Ok(entries_len)
})
}
}
pub fn register(dispatcher: &mut CommandDispatcher, registry: &mut PermissionRegistry) {
registry.register_permission_or_panic(Permission::new(
PERMISSION,
DESCRIPTION,
PermissionDefault::Op(PermissionLvl::Three),
));
dispatcher.register(
command("banlist", DESCRIPTION)
.requires(PERMISSION)
.then(literal("ips").executes(BanListCommandExecutor {
players: false,
ips: true,
}))
.then(literal("players").executes(BanListCommandExecutor {
players: true,
ips: false,
}))
.executes(BanListCommandExecutor {
players: true,
ips: true,
}),
);
}