mirror of
https://github.com/PluralKit/PluralKit.git
synced 2026-02-11 16:20:13 +00:00
implement proxied message and permcheck commands
This commit is contained in:
parent
2b304457cc
commit
e4f38c76a9
19 changed files with 233 additions and 155 deletions
|
|
@ -1 +0,0 @@
|
|||
|
||||
|
|
@ -1 +1,16 @@
|
|||
use super::*;
|
||||
|
||||
pub fn debug() -> (&'static str, [&'static str; 1]) {
|
||||
("debug", ["dbg"])
|
||||
}
|
||||
|
||||
pub fn cmds() -> impl Iterator<Item = Command> {
|
||||
let debug = debug();
|
||||
let perms = ("permissions", ["perms", "permcheck"]);
|
||||
[
|
||||
command!(debug, perms, ("channel", ["ch"]), ChannelRef => "permcheck_channel"),
|
||||
command!(debug, perms, ("guild", ["g"]), GuildRef => "permcheck_guild"),
|
||||
command!(debug, ("proxy", ["proxying", "proxycheck"]), MessageRef => "message_proxy_check"),
|
||||
]
|
||||
.into_iter()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ use super::*;
|
|||
pub fn cmds() -> impl Iterator<Item = Command> {
|
||||
let help = ("help", ["h"]);
|
||||
[
|
||||
command!("explain" => "explain"),
|
||||
command!(help => "help")
|
||||
.flag(("foo", OpaqueString)) // todo: just for testing
|
||||
.help("Shows the help command"),
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
pub mod admin;
|
||||
pub mod api;
|
||||
pub mod autoproxy;
|
||||
pub mod checks;
|
||||
pub mod commands;
|
||||
pub mod config;
|
||||
pub mod dashboard;
|
||||
|
|
@ -33,6 +32,8 @@ pub fn all() -> impl Iterator<Item = Command> {
|
|||
.chain(random::cmds())
|
||||
.chain(api::cmds())
|
||||
.chain(autoproxy::cmds())
|
||||
.chain(debug::cmds())
|
||||
.chain(message::cmds())
|
||||
.map(|cmd| {
|
||||
cmd.hidden_flag(("plaintext", ["pt"]))
|
||||
.hidden_flag(("raw", ["r"]))
|
||||
|
|
|
|||
|
|
@ -1 +1,32 @@
|
|||
use super::*;
|
||||
|
||||
pub fn cmds() -> impl Iterator<Item = Command> {
|
||||
let message = tokens!(("message", ["msg", "messageinfo"]), MessageRef);
|
||||
|
||||
let edit = tokens!(("edit", ["e"]), ("new_content", OpaqueStringRemainder));
|
||||
let apply_edit = |cmd: Command| {
|
||||
cmd.flag(("append", ["a"]))
|
||||
.flag(("prepend", ["p"]))
|
||||
.flag(("regex", ["r"]))
|
||||
.flag(("mutate-space", ["ms"]))
|
||||
.flag(("clear-embeds", ["ce"]))
|
||||
.flag(("clear-attachments", ["ca"]))
|
||||
.help("Edits a proxied message")
|
||||
};
|
||||
|
||||
[
|
||||
command!(message => "message_info")
|
||||
.flag(("delete", ["d"]))
|
||||
.flag(("author", ["a"]))
|
||||
.help("Shows information about a proxied message"),
|
||||
command!(message, ("author", ["sender"]) => "message_author")
|
||||
.help("Shows the author of a proxied message"),
|
||||
command!(message, ("delete", ["del"]) => "message_delete")
|
||||
.help("Deletes a proxied message"),
|
||||
apply_edit(command!(message, edit => "message_edit")),
|
||||
apply_edit(command!(edit => "message_edit")),
|
||||
command!(("reproxy", ["rp", "crimes", "crime"]), MessageRef => "message_reproxy")
|
||||
.help("Reproxies a message with a different member"),
|
||||
]
|
||||
.into_iter()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,3 +7,4 @@ edition = "2024"
|
|||
lazy_static = { workspace = true }
|
||||
smol_str = "0.3.2"
|
||||
ordermap = "0.5"
|
||||
regex = "1"
|
||||
|
|
@ -15,7 +15,9 @@ pub enum ParameterValue {
|
|||
GroupRef(String),
|
||||
GroupRefs(Vec<String>),
|
||||
SystemRef(String),
|
||||
GuildRef(String),
|
||||
MessageRef(Option<u64>, Option<u64>, u64),
|
||||
ChannelRef(u64),
|
||||
GuildRef(u64),
|
||||
MemberPrivacyTarget(String),
|
||||
GroupPrivacyTarget(String),
|
||||
SystemPrivacyTarget(String),
|
||||
|
|
@ -54,6 +56,8 @@ impl Display for Parameter {
|
|||
ParameterKind::GroupRef => write!(f, "<target group>"),
|
||||
ParameterKind::GroupRefs => write!(f, "<group 1> <group 2> <group 3>..."),
|
||||
ParameterKind::SystemRef => write!(f, "<target system>"),
|
||||
ParameterKind::MessageRef => write!(f, "<target message>"),
|
||||
ParameterKind::ChannelRef => write!(f, "<target channel>"),
|
||||
ParameterKind::GuildRef => write!(f, "<target guild>"),
|
||||
ParameterKind::MemberPrivacyTarget => write!(f, "<privacy target>"),
|
||||
ParameterKind::GroupPrivacyTarget => write!(f, "<privacy target>"),
|
||||
|
|
@ -92,6 +96,8 @@ pub enum ParameterKind {
|
|||
GroupRef,
|
||||
GroupRefs,
|
||||
SystemRef,
|
||||
MessageRef,
|
||||
ChannelRef,
|
||||
GuildRef,
|
||||
MemberPrivacyTarget,
|
||||
GroupPrivacyTarget,
|
||||
|
|
@ -111,6 +117,8 @@ impl ParameterKind {
|
|||
ParameterKind::GroupRef => "target",
|
||||
ParameterKind::GroupRefs => "targets",
|
||||
ParameterKind::SystemRef => "target",
|
||||
ParameterKind::MessageRef => "target",
|
||||
ParameterKind::ChannelRef => "target",
|
||||
ParameterKind::GuildRef => "target",
|
||||
ParameterKind::MemberPrivacyTarget => "member_privacy_target",
|
||||
ParameterKind::GroupPrivacyTarget => "group_privacy_target",
|
||||
|
|
@ -157,7 +165,56 @@ impl ParameterKind {
|
|||
Toggle::from_str(input).map(|t| ParameterValue::Toggle(t.into()))
|
||||
}
|
||||
ParameterKind::Avatar => Ok(ParameterValue::Avatar(input.into())),
|
||||
ParameterKind::GuildRef => Ok(ParameterValue::GuildRef(input.into())),
|
||||
ParameterKind::MessageRef => {
|
||||
if let Ok(message_id) = input.parse::<u64>() {
|
||||
return Ok(ParameterValue::MessageRef(None, None, message_id));
|
||||
}
|
||||
|
||||
static RE: std::sync::LazyLock<regex::Regex> = std::sync::LazyLock::new(|| {
|
||||
regex::Regex::new(
|
||||
r"https://(?:\w+\.)?discord(?:app)?\.com/channels/(\d+)/(\d+)/(\d+)",
|
||||
)
|
||||
.unwrap()
|
||||
});
|
||||
|
||||
if let Some(captures) = RE.captures(input) {
|
||||
let guild_id = captures
|
||||
.get(1)
|
||||
.and_then(|m| m.as_str().parse::<u64>().ok())
|
||||
.ok_or_else(|| SmolStr::new("invalid guild ID in message link"))?;
|
||||
let channel_id = captures
|
||||
.get(2)
|
||||
.and_then(|m| m.as_str().parse::<u64>().ok())
|
||||
.ok_or_else(|| SmolStr::new("invalid channel ID in message link"))?;
|
||||
let message_id = captures
|
||||
.get(3)
|
||||
.and_then(|m| m.as_str().parse::<u64>().ok())
|
||||
.ok_or_else(|| SmolStr::new("invalid message ID in message link"))?;
|
||||
|
||||
Ok(ParameterValue::MessageRef(
|
||||
Some(guild_id),
|
||||
Some(channel_id),
|
||||
message_id,
|
||||
))
|
||||
} else {
|
||||
Err(SmolStr::new("invalid message reference"))
|
||||
}
|
||||
}
|
||||
ParameterKind::ChannelRef => {
|
||||
let mut text = input;
|
||||
|
||||
if text.len() > 3 && text.starts_with("<#") && text.ends_with('>') {
|
||||
text = &text[2..text.len() - 1];
|
||||
}
|
||||
|
||||
text.parse::<u64>()
|
||||
.map(ParameterValue::ChannelRef)
|
||||
.map_err(|_| SmolStr::new("invalid channel ID"))
|
||||
}
|
||||
ParameterKind::GuildRef => input
|
||||
.parse::<u64>()
|
||||
.map(ParameterValue::GuildRef)
|
||||
.map_err(|_| SmolStr::new("invalid guild ID")),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -266,6 +266,8 @@ fn get_param_ty(kind: ParameterKind) -> &'static str {
|
|||
ParameterKind::PrivacyLevel => "PrivacyLevel",
|
||||
ParameterKind::Toggle => "bool",
|
||||
ParameterKind::Avatar => "ParsedImage",
|
||||
ParameterKind::MessageRef => "Message.Reference",
|
||||
ParameterKind::ChannelRef => "Channel",
|
||||
ParameterKind::GuildRef => "Guild",
|
||||
}
|
||||
}
|
||||
|
|
@ -284,6 +286,8 @@ fn get_param_param_ty(kind: ParameterKind) -> &'static str {
|
|||
ParameterKind::PrivacyLevel => "PrivacyLevel",
|
||||
ParameterKind::Toggle => "Toggle",
|
||||
ParameterKind::Avatar => "Avatar",
|
||||
ParameterKind::MessageRef => "Message",
|
||||
ParameterKind::ChannelRef => "Channel",
|
||||
ParameterKind::GuildRef => "Guild",
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,9 @@ interface Parameter {
|
|||
GroupRef(string group);
|
||||
GroupRefs(sequence<string> groups);
|
||||
SystemRef(string system);
|
||||
GuildRef(string guild);
|
||||
MessageRef(u64? guild_id, u64? channel_id, u64 message_id);
|
||||
ChannelRef(u64 channel_id);
|
||||
GuildRef(u64 guild_id);
|
||||
MemberPrivacyTarget(string target);
|
||||
GroupPrivacyTarget(string target);
|
||||
SystemPrivacyTarget(string target);
|
||||
|
|
|
|||
|
|
@ -22,19 +22,53 @@ pub enum CommandResult {
|
|||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Parameter {
|
||||
MemberRef { member: String },
|
||||
MemberRefs { members: Vec<String> },
|
||||
GroupRef { group: String },
|
||||
GroupRefs { groups: Vec<String> },
|
||||
SystemRef { system: String },
|
||||
GuildRef { guild: String },
|
||||
MemberPrivacyTarget { target: String },
|
||||
GroupPrivacyTarget { target: String },
|
||||
SystemPrivacyTarget { target: String },
|
||||
PrivacyLevel { level: String },
|
||||
OpaqueString { raw: String },
|
||||
Toggle { toggle: bool },
|
||||
Avatar { avatar: String },
|
||||
MemberRef {
|
||||
member: String,
|
||||
},
|
||||
MemberRefs {
|
||||
members: Vec<String>,
|
||||
},
|
||||
GroupRef {
|
||||
group: String,
|
||||
},
|
||||
GroupRefs {
|
||||
groups: Vec<String>,
|
||||
},
|
||||
SystemRef {
|
||||
system: String,
|
||||
},
|
||||
MessageRef {
|
||||
guild_id: Option<u64>,
|
||||
channel_id: Option<u64>,
|
||||
message_id: u64,
|
||||
},
|
||||
ChannelRef {
|
||||
channel_id: u64,
|
||||
},
|
||||
GuildRef {
|
||||
guild_id: u64,
|
||||
},
|
||||
MemberPrivacyTarget {
|
||||
target: String,
|
||||
},
|
||||
GroupPrivacyTarget {
|
||||
target: String,
|
||||
},
|
||||
SystemPrivacyTarget {
|
||||
target: String,
|
||||
},
|
||||
PrivacyLevel {
|
||||
level: String,
|
||||
},
|
||||
OpaqueString {
|
||||
raw: String,
|
||||
},
|
||||
Toggle {
|
||||
toggle: bool,
|
||||
},
|
||||
Avatar {
|
||||
avatar: String,
|
||||
},
|
||||
}
|
||||
|
||||
impl From<ParameterValue> for Parameter {
|
||||
|
|
@ -52,7 +86,13 @@ impl From<ParameterValue> for Parameter {
|
|||
ParameterValue::OpaqueString(raw) => Self::OpaqueString { raw },
|
||||
ParameterValue::Toggle(toggle) => Self::Toggle { toggle },
|
||||
ParameterValue::Avatar(avatar) => Self::Avatar { avatar },
|
||||
ParameterValue::GuildRef(guild) => Self::GuildRef { guild },
|
||||
ParameterValue::MessageRef(guild_id, channel_id, message_id) => Self::MessageRef {
|
||||
guild_id,
|
||||
channel_id,
|
||||
message_id,
|
||||
},
|
||||
ParameterValue::ChannelRef(channel_id) => Self::ChannelRef { channel_id },
|
||||
ParameterValue::GuildRef(guild_id) => Self::GuildRef { guild_id },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue