fix: remove manual permission check in /watch and validate via Discord API
Some checks are pending
CI / Test & Lint (push) Waiting to run
Some checks are pending
CI / Test & Lint (push) Waiting to run
This commit is contained in:
parent
acd3f948f2
commit
f4a4f35d52
1 changed files with 53 additions and 39 deletions
80
src/main.rs
80
src/main.rs
|
|
@ -478,28 +478,6 @@ async fn watch(
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
let bot_id = ctx.serenity_context().cache.current_user().id;
|
|
||||||
let member = guild.member(ctx.serenity_context(), bot_id).await?;
|
|
||||||
#[allow(deprecated)]
|
|
||||||
let permissions = if let Some(guild_cache) = ctx.guild() {
|
|
||||||
guild_cache.user_permissions_in(&channel, &member)
|
|
||||||
} else {
|
|
||||||
channel
|
|
||||||
.permissions_for_user(ctx.serenity_context(), bot_id)
|
|
||||||
.unwrap_or_else(|_| serenity::Permissions::all())
|
|
||||||
};
|
|
||||||
if !permissions.contains(
|
|
||||||
serenity::Permissions::VIEW_CHANNEL
|
|
||||||
| serenity::Permissions::SEND_MESSAGES
|
|
||||||
| serenity::Permissions::EMBED_LINKS,
|
|
||||||
) {
|
|
||||||
return reply(
|
|
||||||
ctx,
|
|
||||||
embed("Missing bot permissions")
|
|
||||||
.description("Allow View Channel, Send Messages, and Embed Links here first."),
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
}
|
|
||||||
let roles = guild.roles(ctx.serenity_context()).await?;
|
let roles = guild.roles(ctx.serenity_context()).await?;
|
||||||
let mut guard = ctx.data().store.lock().await;
|
let mut guard = ctx.data().store.lock().await;
|
||||||
let mut sub = match patch_subscription(
|
let mut sub = match patch_subscription(
|
||||||
|
|
@ -517,14 +495,29 @@ async fn watch(
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if sub.ping_enabled
|
if sub.ping_enabled {
|
||||||
&& !sub
|
let role_is_valid = sub
|
||||||
.role_id
|
.role_id
|
||||||
.and_then(|id| roles.get(&serenity::RoleId::new(id)))
|
.map(|id| {
|
||||||
|
if id == guild.get() {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
roles
|
||||||
|
.get(&serenity::RoleId::new(id))
|
||||||
.is_some_and(|role| valid_role(role, guild))
|
.is_some_and(|role| valid_role(role, guild))
|
||||||
{
|
}
|
||||||
|
})
|
||||||
|
.unwrap_or(false);
|
||||||
|
if !role_is_valid {
|
||||||
drop(guard);
|
drop(guard);
|
||||||
return reply(ctx, embed("Invalid role").description("The configured role is missing. Set ping_role to a valid role or @everyone, or use ping_enabled:false or clear_role:true.")).await;
|
return reply(
|
||||||
|
ctx,
|
||||||
|
embed("Invalid role").description(
|
||||||
|
"The configured role is missing. Set ping_role to a valid role or @everyone, or use ping_enabled:false or clear_role:true.",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Post or update the public live dashboard in the channel
|
// Post or update the public live dashboard in the channel
|
||||||
|
|
@ -543,8 +536,8 @@ async fn watch(
|
||||||
{
|
{
|
||||||
updated_msg_id = Some(existing_msg_id);
|
updated_msg_id = Some(existing_msg_id);
|
||||||
}
|
}
|
||||||
if updated_msg_id.is_none()
|
if updated_msg_id.is_none() {
|
||||||
&& let Ok(sent) = channel
|
match channel
|
||||||
.id
|
.id
|
||||||
.send_message(
|
.send_message(
|
||||||
ctx.serenity_context(),
|
ctx.serenity_context(),
|
||||||
|
|
@ -554,8 +547,22 @@ async fn watch(
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
|
Ok(sent) => {
|
||||||
updated_msg_id = Some(sent.id.get());
|
updated_msg_id = Some(sent.id.get());
|
||||||
}
|
}
|
||||||
|
Err(e) => {
|
||||||
|
drop(guard);
|
||||||
|
return reply(
|
||||||
|
ctx,
|
||||||
|
embed("Missing channel permissions").description(format!(
|
||||||
|
"The bot could not post the live dashboard in <#{}>: {e}.\nMake sure the bot has **View Channel**, **Send Messages**, and **Embed Links** in that channel.",
|
||||||
|
channel.id
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
sub.message_id = updated_msg_id;
|
sub.message_id = updated_msg_id;
|
||||||
|
|
||||||
let result = embed("Live Radar Dashboard & Alerts Configured")
|
let result = embed("Live Radar Dashboard & Alerts Configured")
|
||||||
|
|
@ -743,12 +750,19 @@ async fn testping(ctx: Context<'_>) -> Result<(), Error> {
|
||||||
.await;
|
.await;
|
||||||
};
|
};
|
||||||
let roles = guild.roles(ctx.serenity_context()).await?;
|
let roles = guild.roles(ctx.serenity_context()).await?;
|
||||||
if !sub.ping_enabled
|
let role_is_valid = sub
|
||||||
|| !sub
|
|
||||||
.role_id
|
.role_id
|
||||||
.and_then(|id| roles.get(&serenity::RoleId::new(id)))
|
.map(|id| {
|
||||||
|
if id == guild.get() {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
roles
|
||||||
|
.get(&serenity::RoleId::new(id))
|
||||||
.is_some_and(|role| valid_role(role, guild))
|
.is_some_and(|role| valid_role(role, guild))
|
||||||
{
|
}
|
||||||
|
})
|
||||||
|
.unwrap_or(false);
|
||||||
|
if !sub.ping_enabled || !role_is_valid {
|
||||||
return reply(
|
return reply(
|
||||||
ctx,
|
ctx,
|
||||||
embed("Pings unavailable").description(
|
embed("Pings unavailable").description(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue