Discord.py Ошибка атрибута: объект «Пользователь» не имеет атрибута «Гильдия»

#python #python-3.x #discord #discord.py-rewrite

#python #python-3.x #Discord #discord.py

Вопрос:

Я работаю над пользовательским ботом discord, в основном для развлечения. Я нашел другого бота discord с другого сервера, с именем Kurisu, который полностью настраиваемый и с открытым исходным кодом. вот github: https://github.com/nh-server/Kurisu . В mod.py (https://github.com/nh-server/Kurisu/blob/port/cogs/mod.py ), в строке 432 есть функция, которая в основном предоставляет пользователю роль «Без помощи» (на сервере это ограничивает доступ к определенным каналам). Я пытаюсь сделать что-то подобное, где наличие роли без голоса ограничивает ваш доступ к голосовым каналам. Я использую часть их кода, а именно в параметрах функции. Я выполняю асинхронное определение takevoice(ctx, member: FetchMember): в качестве функции. полная функция здесь:

 @bot.command(name="takevoice", pass_context=True, description="Removes access to voice channels. Admin only.")
@commands.has_role("Admin") # This must be exactly the name of the appropriate role
async def takevoice(ctx, member: FetchMember):
   role = get(member.guild.roles, name="No-Voice")
   await member.add_roles(role)
  

другие функции в моей программе работают отлично, но всякий раз, когда я пытаюсь запустить эту функцию с другим пользователем в качестве цели, она не работает и выдает ошибку обратной трассировки. в конце концов: AttributeError: объект «user» не имеет атрибута «guild». Я везде искал ответ, но не могу его найти. любая помощь будет высоко оценена.

Спасибо!

полный код моего бота находится здесь: (Я использую пару других файлов, все из которых можно найти в папке utils на Kurisu github. а именно, я использую checks.py , converters.py , database.py , manager.py , и utils.py . Я также использую файл с именем keep_alive.py потому что я запускаю это на repl.it .)

 import asyncio
import aiohttp
import json
import keep_alive
from discord import Game
from discord.ext.commands import Bot
import datetime
import re
import time
from subprocess import call
import discord
from discord.ext import commands
from checks import is_staff, check_staff_id, check_bot_or_staff
from database import DatabaseCog
from converters import SafeMember, FetchMember
import utils
from discord.ext import commands
from discord.utils import get
TOKEN = ""  # Get at discordapp.com/developers/applications/me
bot=commands.Bot(command_prefix=".")
client=discord.Client()

@bot.command(name="hi")
async def hi(ctx):
    await ctx.channel.send("hello")

@bot.command (name="elsewhere", description="Gives acess to the #elsewhere channel")
async def elsewhere(ctx):
    role = discord.utils.get(ctx.guild.roles, name="Elsewhere")
    user = ctx.message.author
    if role in user.roles:
        await user.remove_roles(role)
    if role not in user.roles:
        await user.add_roles(role)

  

Комментарии:

1. Я прочитал источник для Kurisu/utils/converters.py и я действительно не могу переварить это в своей голове. Похоже, что FetchMember стремится перейти к пользователю, а не к члену. Независимо от того, если вы хотите использовать метод члена (для получения гильдии. Пользователи являются членами гильдий), попробуйте установить аргумент вашей функции как member: Member , Discord.py попытается конвертировать автоматически.

2. @Allister когда я это делаю, я получаю ошибку Member is not defined.

3. Попробуйте member: discord.Member тогда. Я только что протестировал, как и должен был сделать в первую очередь, и это абсолютно работает.

4. @Allister это сработало! Спасибо! Я не совсем понимаю, почему, но это так. еще один вопрос, знаете ли вы, как сделать так, чтобы наличие определенной роли означало, что вы не можете получить доступ к определенным каналам? вместо того, чтобы делать это так, наличие определенной роли означает, что вы можете получить доступ к определенным каналам.

5. Я не знаю. Я бы посоветовал вам провести исследование, сделать все возможное, а затем задать еще один вопрос, когда вы упретесь в стену.

Ответ №1:

Это потому, что у объекта User не может быть определенной гильдии — пользователь означает кого-то, кто больше не состоит в гильдии. Измените async def takevoice(ctx, member: FetchMember): на async def takevoice(ctx, member: discordMember): , и проблема будет исправлена. Таким образом, вы получите участника вместо объекта User, и будет определенная гильдия. Однако (я не знаю, имеет ли это значение) вы больше не можете выполнять это действие над кем-то, кто не состоит в гильдии.

Ответ №2:

Изменение member: FetchMember на member: discord.Member решение проблемы. .Member должен быть прописным.