Trim PR scope for review feedback
This commit is contained in:
parent
43ba5b50ae
commit
245f91a029
@ -1,9 +1,8 @@
|
|||||||
use crate::{java::setup_java, protobufs::setup_protobufs, pumpkin::setup_pumpkin_build_info};
|
use crate::{java::setup_java, protobufs::setup_protobufs};
|
||||||
use std::{error::Error, path::PathBuf};
|
use std::{error::Error, path::PathBuf};
|
||||||
|
|
||||||
pub mod java;
|
pub mod java;
|
||||||
pub mod protobufs;
|
pub mod protobufs;
|
||||||
pub mod pumpkin;
|
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
println!("cargo::rerun-if-changed=rust/src/build.rs");
|
println!("cargo::rerun-if-changed=rust/src/build.rs");
|
||||||
@ -12,7 +11,6 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
|
|
||||||
let base = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
|
let base = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
|
||||||
|
|
||||||
setup_pumpkin_build_info(&base);
|
|
||||||
setup_protobufs(base.clone());
|
setup_protobufs(base.clone());
|
||||||
setup_java(base);
|
setup_java(base);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@ -1,64 +0,0 @@
|
|||||||
use std::{fs, path::Path};
|
|
||||||
|
|
||||||
fn extract_git_revision(source: &str) -> Option<String> {
|
|
||||||
source.rsplit('#').next().and_then(|revision| {
|
|
||||||
let trimmed = revision.trim();
|
|
||||||
if trimmed.is_empty() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(trimmed.to_string())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn setup_pumpkin_build_info(base: &Path) {
|
|
||||||
let lock_path = base.join("Cargo.lock");
|
|
||||||
let lock_contents =
|
|
||||||
fs::read_to_string(&lock_path).expect("Failed to read Cargo.lock for Pumpkin build info");
|
|
||||||
|
|
||||||
let mut in_pumpkin_package = false;
|
|
||||||
let mut pumpkin_version: Option<String> = None;
|
|
||||||
let mut pumpkin_revision: Option<String> = None;
|
|
||||||
|
|
||||||
for line in lock_contents.lines() {
|
|
||||||
let trimmed = line.trim();
|
|
||||||
|
|
||||||
if trimmed == "[[package]]" {
|
|
||||||
if in_pumpkin_package {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
in_pumpkin_package = false;
|
|
||||||
pumpkin_version = None;
|
|
||||||
pumpkin_revision = None;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if trimmed == r#"name = "pumpkin""# {
|
|
||||||
in_pumpkin_package = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if !in_pumpkin_package {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(version) = trimmed.strip_prefix(r#"version = ""#) {
|
|
||||||
pumpkin_version = Some(version.trim_end_matches('"').to_string());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(source) = trimmed.strip_prefix(r#"source = ""#) {
|
|
||||||
let source = source.trim_end_matches('"');
|
|
||||||
pumpkin_revision = extract_git_revision(source);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let pumpkin_version = pumpkin_version.unwrap_or_else(|| "unknown".to_string());
|
|
||||||
let pumpkin_revision = pumpkin_revision.unwrap_or_else(|| "unknown".to_string());
|
|
||||||
let pumpkin_revision_short = pumpkin_revision.chars().take(7).collect::<String>();
|
|
||||||
|
|
||||||
println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_VERSION={pumpkin_version}");
|
|
||||||
println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_REVISION={pumpkin_revision}");
|
|
||||||
println!("cargo::rustc-env=PATCHBUKKIT_PUMPKIN_REVISION_SHORT={pumpkin_revision_short}");
|
|
||||||
println!("cargo::rerun-if-changed={}", lock_path.display());
|
|
||||||
}
|
|
||||||
@ -4,7 +4,10 @@ use anyhow::Result;
|
|||||||
use j4rs::{Instance, InvocationArg, Jvm};
|
use j4rs::{Instance, InvocationArg, Jvm};
|
||||||
use pumpkin::{command::dispatcher::CommandError, plugin::Context};
|
use pumpkin::{command::dispatcher::CommandError, plugin::Context};
|
||||||
use pumpkin_protocol::java::client::play::CommandSuggestion;
|
use pumpkin_protocol::java::client::play::CommandSuggestion;
|
||||||
use pumpkin_util::permission::{Permission, PermissionDefault};
|
use pumpkin_util::{
|
||||||
|
PermissionLvl,
|
||||||
|
permission::{Permission, PermissionDefault},
|
||||||
|
};
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@ -187,7 +190,7 @@ impl CommandManager {
|
|||||||
cmd_data.description.clone().unwrap_or_default(),
|
cmd_data.description.clone().unwrap_or_default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let permission = build_permission_node(&plugin.name, &cmd_name);
|
let (permission, permission_default) = build_permission_node(&cmd_name, cmd_data);
|
||||||
|
|
||||||
let registry = {
|
let registry = {
|
||||||
let permission_manager = context.permission_manager.read().await;
|
let permission_manager = context.permission_manager.read().await;
|
||||||
@ -200,7 +203,7 @@ impl CommandManager {
|
|||||||
"Allows running the Bukkit command `{cmd_name}` from `{}`",
|
"Allows running the Bukkit command `{cmd_name}` from `{}`",
|
||||||
plugin.name
|
plugin.name
|
||||||
),
|
),
|
||||||
PermissionDefault::Allow,
|
permission_default,
|
||||||
)) {
|
)) {
|
||||||
if e.contains("already registered") {
|
if e.contains("already registered") {
|
||||||
tracing::debug!(
|
tracing::debug!(
|
||||||
@ -318,48 +321,66 @@ impl CommandManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_permission_node(plugin_name: &str, cmd_name: &str) -> String {
|
fn build_permission_node(
|
||||||
let plugin_segment = sanitize_permission_segment(plugin_name);
|
cmd_name: &str,
|
||||||
let command_segment = sanitize_permission_segment(cmd_name);
|
cmd_data: &config::spigot::Command,
|
||||||
format!("{PATCHBUKKIT_PERMISSION_NAMESPACE}:command.{plugin_segment}.{command_segment}")
|
) -> (String, PermissionDefault) {
|
||||||
}
|
if let Some(permission) = &cmd_data.permission {
|
||||||
|
(
|
||||||
fn sanitize_permission_segment(value: &str) -> String {
|
permission.clone(),
|
||||||
let sanitized: String = value
|
PermissionDefault::Op(PermissionLvl::Two),
|
||||||
.chars()
|
)
|
||||||
.map(|ch| {
|
|
||||||
if ch.is_ascii_alphanumeric() || matches!(ch, '.' | '_' | '-') {
|
|
||||||
ch.to_ascii_lowercase()
|
|
||||||
} else {
|
|
||||||
'_'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
if sanitized.is_empty() {
|
|
||||||
"unknown".to_string()
|
|
||||||
} else {
|
} else {
|
||||||
sanitized
|
(
|
||||||
|
format!("{PATCHBUKKIT_PERMISSION_NAMESPACE}:command.{cmd_name}"),
|
||||||
|
PermissionDefault::Allow,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use pumpkin_util::{PermissionLvl, permission::PermissionDefault};
|
||||||
|
|
||||||
|
use crate::config::spigot::Command;
|
||||||
|
|
||||||
use super::build_permission_node;
|
use super::build_permission_node;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn permission_node_is_namespaced_and_stable() {
|
fn permission_node_uses_explicit_plugin_permission() {
|
||||||
|
let command = Command {
|
||||||
|
description: None,
|
||||||
|
usage: None,
|
||||||
|
aliases: None,
|
||||||
|
permission: Some("simplespawn.spawn".to_string()),
|
||||||
|
permission_message: None,
|
||||||
|
};
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
build_permission_node("SimpleSpawn", "spawn"),
|
build_permission_node("spawn", &command),
|
||||||
"patchbukkit:command.simplespawn.spawn"
|
(
|
||||||
|
"simplespawn.spawn".to_string(),
|
||||||
|
PermissionDefault::Op(PermissionLvl::Two)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn permission_node_sanitizes_unfriendly_characters() {
|
fn permission_node_falls_back_to_patchbukkit_namespace() {
|
||||||
|
let command = Command {
|
||||||
|
description: None,
|
||||||
|
usage: None,
|
||||||
|
aliases: None,
|
||||||
|
permission: None,
|
||||||
|
permission_message: None,
|
||||||
|
};
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
build_permission_node("Fancy Plugin", "Spawn-All"),
|
build_permission_node("spawn", &command),
|
||||||
"patchbukkit:command.fancy_plugin.spawn-all"
|
(
|
||||||
|
"patchbukkit:command.spawn".to_string(),
|
||||||
|
PermissionDefault::Allow
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,17 +30,9 @@ use crate::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const PATCHBUKKIT_PUMPKIN_VERSION: &str = env!("PATCHBUKKIT_PUMPKIN_VERSION");
|
|
||||||
const PATCHBUKKIT_PUMPKIN_REVISION: &str = env!("PATCHBUKKIT_PUMPKIN_REVISION");
|
|
||||||
const PATCHBUKKIT_PUMPKIN_REVISION_SHORT: &str = env!("PATCHBUKKIT_PUMPKIN_REVISION_SHORT");
|
|
||||||
|
|
||||||
async fn on_load_inner(plugin: &PatchBukkitPlugin, server: Arc<Context>) -> Result<(), String> {
|
async fn on_load_inner(plugin: &PatchBukkitPlugin, server: Arc<Context>) -> Result<(), String> {
|
||||||
server.init_log();
|
server.init_log();
|
||||||
tracing::info!("Starting PatchBukkit");
|
tracing::info!("Starting PatchBukkit");
|
||||||
tracing::info!(
|
|
||||||
"Built against Pumpkin {PATCHBUKKIT_PUMPKIN_VERSION} ({PATCHBUKKIT_PUMPKIN_REVISION_SHORT})"
|
|
||||||
);
|
|
||||||
tracing::debug!("Full Pumpkin dependency revision: {PATCHBUKKIT_PUMPKIN_REVISION}");
|
|
||||||
|
|
||||||
// Setup directories
|
// Setup directories
|
||||||
let dirs = setup_directories(&server)?;
|
let dirs = setup_directories(&server)?;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user