Made /join permission errors more obvious

main
DaXcess 2022-11-14 10:22:55 +01:00
parent b8289aeab9
commit 986f3d46f8
2 changed files with 64 additions and 12 deletions

View File

@ -1,7 +1,7 @@
use log::trace; use log::{error, trace};
use serenity::{ use serenity::{
builder::CreateApplicationCommand, builder::CreateApplicationCommand,
model::prelude::interaction::application_command::ApplicationCommandInteraction, model::prelude::{interaction::application_command::ApplicationCommandInteraction, Channel},
prelude::Context, prelude::Context,
}; };
@ -43,15 +43,34 @@ pub fn run(ctx: Context, command: ApplicationCommandInteraction) -> CommandOutpu
// Check for Voice Channel permissions // Check for Voice Channel permissions
{ {
let channel = match ctx.cache.guild_channel(channel_id) { let channel = match channel_id.to_channel(&ctx).await {
Some(channel) => channel, Ok(channel) => match channel {
None => { Channel::Guild(channel) => channel,
_ => {
respond_message(
&ctx,
&command,
EmbedBuilder::new()
.title("Cannot join voice channel")
.description("The voice channel you are in is not supported")
.status(Status::Error)
.build(),
true,
)
.await;
return;
}
},
Err(why) => {
error!("Failed to get channel: {}", why);
respond_message( respond_message(
&ctx, &ctx,
&command, &command,
EmbedBuilder::new() EmbedBuilder::new()
.title("Cannot join voice channel") .title("Cannot join voice channel")
.description("The voice channel you are in is not available") .description("The voice channel you are in is not available.\nI might not the permission to see this channel.")
.status(Status::Error) .status(Status::Error)
.build(), .build(),
true, true,
@ -85,15 +104,34 @@ pub fn run(ctx: Context, command: ApplicationCommandInteraction) -> CommandOutpu
// Check for Text Channel permissions // Check for Text Channel permissions
{ {
let channel = match ctx.cache.guild_channel(&command.channel_id) { let channel = match command.channel_id.to_channel(&ctx).await {
Some(channel) => channel, Ok(channel) => match channel {
None => { Channel::Guild(channel) => channel,
_ => {
respond_message(
&ctx,
&command,
EmbedBuilder::new()
.title("Cannot join voice channel")
.description("The text channel you are in is not supported")
.status(Status::Error)
.build(),
true,
)
.await;
return;
}
},
Err(why) => {
error!("Failed to get channel: {}", why);
respond_message( respond_message(
&ctx, &ctx,
&command, &command,
EmbedBuilder::new() EmbedBuilder::new()
.title("Cannot join voice channel") .title("Cannot join voice channel")
.description("The text channel you are in is not available") .description("The text channel you are in is not available.\nI might not have the permission to see this channel.")
.status(Status::Error) .status(Status::Error)
.build(), .build(),
true, true,
@ -114,7 +152,9 @@ pub fn run(ctx: Context, command: ApplicationCommandInteraction) -> CommandOutpu
&command, &command,
EmbedBuilder::new() EmbedBuilder::new()
.title("Cannot join voice channel") .title("Cannot join voice channel")
.description("I do not have the permissions to speak in this text channel") .description(
"I do not have the permissions to send messages / links in this text channel",
)
.status(Status::Error) .status(Status::Error)
.build(), .build(),
true, true,

View File

@ -3,7 +3,7 @@
use log::*; use log::*;
use serenity::{ use serenity::{
async_trait, async_trait,
model::prelude::{interaction::Interaction, Activity, Ready}, model::prelude::{interaction::Interaction, Activity, GuildId, Ready},
prelude::{Context, EventHandler}, prelude::{Context, EventHandler},
}; };
@ -36,6 +36,18 @@ impl EventHandler for Handler {
// INTERACTION_CREATE event, emitted when the bot receives an interaction (slash command, button, etc.) // INTERACTION_CREATE event, emitted when the bot receives an interaction (slash command, button, etc.)
async fn interaction_create(&self, ctx: Context, interaction: Interaction) { async fn interaction_create(&self, ctx: Context, interaction: Interaction) {
if let Interaction::ApplicationCommand(command) = interaction { if let Interaction::ApplicationCommand(command) = interaction {
if let Ok(guild_id) = std::env::var("GUILD_ID") {
if let Ok(guild_id) = guild_id.parse::<u64>() {
let guild_id = GuildId(guild_id);
if let Some(interaction_guild_id) = command.guild_id {
if guild_id != interaction_guild_id {
return;
}
}
}
}
// Commands must only be executed inside of guilds // Commands must only be executed inside of guilds
let guild_id = match command.guild_id { let guild_id = match command.guild_id {