Discord.py | Объявление об ошибке
@Bot.command()
@commands.has_permissions(ban_members=True)
async def unban(ctx, id: int):
user = await Bot.fetch_user(id)
await ctx.guild.unban(user)
await ctx.send(user.name + " разбанен!")
Задача кода:
При использовании команды нужно добавить discord ID пользователя для того чтобы бот разбанил пользователя.
• Пример: c:unban ID пользователя | c:unban 6125347980896752431 \
Моя проблема:
Я хочу сделать условие того, что если в списке банов сервера не находится пользователь с определенным ID, то бот выведет сообщение о том что данный ID не был обнаружен.
Вот другой пример разбана с тем чего я хочу, но он выполнен по другому методу:
@Bot.command()
@commands.has_permissions(ban_members=True)
async def unban(ctx, member):
banned_users = await ctx.guild.bans()
member_name, member_disc = member.split('#')
for banned_entry in banned_users:
user = banned_entry.user
if(user.name, user.discriminator)==(member_name, member_disc):
await ctx.guild.unban(user)
await ctx.send(member_name + " has been unbaned!")
return
await ctx.send(member + " не был обнаружен") # <- вот что мне нужно.
Данная команда работает по методу: с:unban ник и дискриминатор | c:unban Nick#9999
Ответы (1 шт):
Для команды unban, принимаем аргумент member как int - здесь будет id:
async def unban(ctx, member: int = None):
Затем получаем список забаненных пользователей и проверяем, есть ли там указанный id:
banlist = await ctx.guild.bans()
for m in banlist:
if m.user.id == member:
member = await Bot.fetch_user(member)
await ctx.guild.unban(member)
await ctx.send(embed = discord.Embed(description = f'{member.name} разабнен!', colour = discord.Color.gold()))
return
Если же условие в цикле не было выполнено, обрабатываем исключение, так как пользователя с указанным id в списке банов не нашлось:
await ctx.send(embed = discord.Embed(description = f'{ctx.author.mention}, пользователь с указанным `ID` на данном сервере не забанен', colour = discord.Color.red()))
Для команды ban вы можете избежать всех этих проверок, просто указывая пользователя через упоминание. Для этого нужно оформить тип аргумента member как discord.Member
async def ban(ctx, member: discord.Member = None):
Теперь есть только 2 исключения - пользователь не указан и указанный пользователь не найден.
При первом, аргумент member примет значение None, соответственно, можем обработать это исключение через if member == None:
Второе исключение проще обработать через событие бота on_command_error():
Если происходит ошибка, то обрабатываем именно исключение "не найден участник сервера" - commands.errors.MemberNotFound
@Bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.errors.MemberNotFound):
msg = await ctx.send(embed = discord.Embed(description = f'{ctx.author.mention}, указанный пользователь не найден', colour = discord.Color.red()))
await sleep(5)
await msg.delete()
try:
await ctx.message.delete()
except:
pass
Результат:
ban
unban
Полный код:
import discord
from discord.ext import commands
from asyncio import sleep
Bot = commands.Bot(command_prefix='!', intents = discord.Intents.all())
@Bot.command()
@commands.has_permissions(ban_members=True)
async def unban(ctx, member: int = None):
if member == None:
msg = await ctx.send(embed = discord.Embed(description = f'{ctx.author.mention}, укажите `ID` пользователя для разбана', colour = discord.Color.red()))
await sleep(5)
await msg.delete()
await ctx.message.delete()
return
banlist = await ctx.guild.bans()
for m in banlist:
if m.user.id == member:
member = await Bot.fetch_user(member)
await ctx.guild.unban(member)
await ctx.send(embed = discord.Embed(description = f'{member.name} разабнен!', colour = discord.Color.gold()))
return
msg = await ctx.send(embed = discord.Embed(description = f'{ctx.author.mention}, пользователь с указанным `ID` на данном сервере не забанен', colour = discord.Color.red()))
await sleep(5)
await msg.delete()
await ctx.message.delete()
@Bot.command()
@commands.has_permissions(ban_members=True)
async def ban(ctx, member: discord.Member = None):
if member == None:
msg = await ctx.send(embed = discord.Embed(description = f'{ctx.author.mention}, укажите пользователя для бана', colour = discord.Color.red()))
await sleep(5)
await msg.delete()
await ctx.message.delete()
return
await ctx.guild.ban(member)
await ctx.send(embed = discord.Embed(description = f'{member.mention} забанен!', colour = discord.Color.gold()))
@Bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.errors.MemberNotFound):
msg = await ctx.send(embed = discord.Embed(description = f'{ctx.author.mention}, указанный пользователь не найден', colour = discord.Color.red()))
await sleep(5)
await msg.delete()
await ctx.message.delete()
else:
print(error)
Bot.run('TOKEN')
Не забудьте указать токен!





