feat: implement system proxy commands

This commit is contained in:
dusk 2025-04-04 05:24:09 +09:00
parent 047bdd870d
commit cb0a9eaf9f
No known key found for this signature in database
11 changed files with 93 additions and 29 deletions

View file

@ -200,6 +200,16 @@ pub fn edit() -> impl Iterator<Item = Command> {
.help("Deletes the system"),
);
let system_proxy = tokens!(system, "proxy");
let system_proxy_cmd = [
command!(system_proxy => "system_show_proxy_current").help("Shows your system's proxy setting for the guild you are in"),
command!(system_proxy, Toggle => "system_toggle_proxy_current")
.help("Toggle your system's proxy for the guild you are in"),
command!(system_proxy, GuildRef => "system_show_proxy").help("Shows your system's proxy setting for a guild"),
command!(system_proxy, GuildRef, Toggle => "system_toggle_proxy")
.help("Toggle your system's proxy for a guild"),
].into_iter();
system_new_cmd
.chain(system_name_self_cmd)
.chain(system_server_name_self_cmd)
@ -212,6 +222,7 @@ pub fn edit() -> impl Iterator<Item = Command> {
.chain(system_server_avatar_self_cmd)
.chain(system_banner_self_cmd)
.chain(system_delete)
.chain(system_proxy_cmd)
.chain(system_name_cmd)
.chain(system_server_name_cmd)
.chain(system_description_cmd)

View file

@ -12,6 +12,7 @@ pub enum ParameterValue {
OpaqueString(String),
MemberRef(String),
SystemRef(String),
GuildRef(String),
MemberPrivacyTarget(String),
PrivacyLevel(String),
Toggle(bool),
@ -42,6 +43,7 @@ impl Display for Parameter {
}
ParameterKind::MemberRef => write!(f, "<target member>"),
ParameterKind::SystemRef => write!(f, "<target system>"),
ParameterKind::GuildRef => write!(f, "<target guild>"),
ParameterKind::MemberPrivacyTarget => write!(f, "<privacy target>"),
ParameterKind::PrivacyLevel => write!(f, "[privacy level]"),
ParameterKind::Toggle => write!(f, "on/off"),
@ -74,6 +76,7 @@ pub enum ParameterKind {
OpaqueStringRemainder,
MemberRef,
SystemRef,
GuildRef,
MemberPrivacyTarget,
PrivacyLevel,
Toggle,
@ -87,6 +90,7 @@ impl ParameterKind {
ParameterKind::OpaqueStringRemainder => "string",
ParameterKind::MemberRef => "target",
ParameterKind::SystemRef => "target",
ParameterKind::GuildRef => "target",
ParameterKind::MemberPrivacyTarget => "member_privacy_target",
ParameterKind::PrivacyLevel => "privacy_level",
ParameterKind::Toggle => "toggle",
@ -114,8 +118,13 @@ 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())),
}
}
pub(crate) fn skip_if_cant_match(&self) -> bool {
matches!(self, ParameterKind::Toggle)
}
}
pub enum MemberPrivacyTargetKind {

View file

@ -67,9 +67,15 @@ impl Token {
name: param.name().into(),
value: matched,
},
Err(err) => TokenMatchResult::ParameterMatchError {
input: input.into(),
msg: err,
Err(err) => {
if param.kind().skip_if_cant_match() {
return None;
} else {
TokenMatchResult::ParameterMatchError {
input: input.into(),
msg: err,
}
}
},
}),
// don't add a _ match here!

View file

@ -1,7 +1,8 @@
use std::{env, fmt::Write, fs, path::PathBuf, str::FromStr};
use command_parser::{
command, parameter::{Parameter, ParameterKind}, token::Token
parameter::{Parameter, ParameterKind},
token::Token,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
@ -16,6 +17,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
writeln!(&mut glue, "#nullable enable\n")?;
writeln!(&mut glue, "using PluralKit.Core;\n")?;
writeln!(&mut glue, "using Myriad.Types;")?;
writeln!(&mut glue, "namespace PluralKit.Bot;\n")?;
let mut record_fields = String::new();
@ -114,7 +116,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
}
}
let mut command_reply_format = String::new();
if command.flags.iter().any(|flag| flag.get_name() == "plaintext") {
if command
.flags
.iter()
.any(|flag| flag.get_name() == "plaintext")
{
writeln!(
&mut command_reply_format,
r#"if (plaintext) return ReplyFormat.Plaintext;"#,
@ -166,6 +172,7 @@ fn get_param_ty(kind: ParameterKind) -> &'static str {
ParameterKind::PrivacyLevel => "string",
ParameterKind::Toggle => "bool",
ParameterKind::Avatar => "ParsedImage",
ParameterKind::GuildRef => "Guild",
}
}
@ -178,6 +185,7 @@ fn get_param_param_ty(kind: ParameterKind) -> &'static str {
ParameterKind::PrivacyLevel => "PrivacyLevel",
ParameterKind::Toggle => "Toggle",
ParameterKind::Avatar => "Avatar",
ParameterKind::GuildRef => "Guild",
}
}

View file

@ -10,6 +10,7 @@ interface CommandResult {
interface Parameter {
MemberRef(string member);
SystemRef(string system);
GuildRef(string guild);
MemberPrivacyTarget(string target);
PrivacyLevel(string level);
OpaqueString(string raw);

View file

@ -24,6 +24,7 @@ pub enum CommandResult {
pub enum Parameter {
MemberRef { member: String },
SystemRef { system: String },
GuildRef { guild: String },
MemberPrivacyTarget { target: String },
PrivacyLevel { level: String },
OpaqueString { raw: String },
@ -41,6 +42,7 @@ 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 },
}
}
}