【问题标题】:Discord.py AttributeError: "User" object has no attribute "Guild"Discord.py AttributeError:“用户”对象没有属性“公会”
【发布时间】:2021-01-29 01:56:03
【问题描述】:

我正在开发一个自定义的不和谐机器人,主要是为了好玩。我从另一台服务器上发现了另一个不和谐机器人,名为 Kurisu,它是完全自定义和开源的。这是 github:https://github.com/nh-server/Kurisu。在 mod.py (https://github.com/nh-server/Kurisu/blob/port/cogs/mod.py) 的第 432 行中,有一个功能基本上为用户提供了 No-Help 角色(在服务器中,这限制了对特定频道的访问)。我正在尝试做类似的事情,其中​​拥有无语音角色会限制您对语音频道的访问。我正在使用他们的一些代码,即在函数的参数中。我正在做 async def 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”。我到处寻找答案,但找不到答案。任何帮助将不胜感激。

谢谢!

我的机器人的完整代码在这里:(我正在使用其他几个文件,所有这些文件都可以在 Kurisu github 的 utils 文件夹中找到。即,我正在使用 checks.py、converters.py、数据库.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)

【问题讨论】:

  • 我已经阅读了 Kurisu/utils/converters.py 的源代码,但我无法真正理解它。 FetchMember 似乎渴望回退到用户而不是成员。无论如何,如果您想使用成员方法(获取公会。用户是公会的成员),请尝试将您的函数参数设置为member: Member,Discord.py 将尝试自动转换。
  • @Allister 当我这样做时,我得到一个未定义成员的错误。
  • 然后尝试member: discord.Member。我刚刚进行了测试,正如我一开始就应该做的那样,这绝对有效。
  • @Allister 成功了!谢谢!我不完全明白为什么,但确实如此。还有一个问题,你知道如何让它拥有一个特定的角色意味着你不能访问特定的频道吗?而不是让它具有特定的角色意味着您可以访问特定的频道。
  • 我不知道。我建议您研究一下,尽力而为,然后在遇到困难时再提出一个问题。

标签: python python-3.x discord discord.py-rewrite


【解决方案1】:

这是因为用户对象不能拥有特定的公会 - 用户意味着不再在公会中的人。 async def takevoice(ctx, member: FetchMember): 更改为async def takevoice(ctx, member: discordMember):,问题将得到解决。这样,您将获得一个 Member 而不是 User 对象,并且会有一个特定的公会。但是(我不知道这是否重要)您不能再对不在公会中的人执行此操作。

【讨论】:

    【解决方案2】:

    member: FetchMember 更改为member: discord.Member 解决了它。 .Member 需要大写。

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 2021-05-06
      • 2021-04-13
      • 2021-05-22
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多