python - Discord.py AttributeError:“用户”对象没有属性“公会”
问题描述
我正在开发一个自定义的不和谐机器人,主要是为了好玩。我从另一台服务器上发现了另一个不和谐机器人,名为 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、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)
解决方案
这是因为 User 对象不能拥有特定的公会 - 用户意味着不再在公会中的人。更改async def takevoice(ctx, member: FetchMember):
为async def takevoice(ctx, member: discordMember):
,问题将得到解决。这样,您将获得一个 Member 而不是 User 对象,并且会有一个特定的公会。但是(我不知道这是否重要)您不能再对不在公会中的人执行此操作。
推荐阅读
- react-native - React Native Navigation 5 - 如何为每个底部选项卡设置颜色
- android - 如何获取当前位置?
- r - 在 R 中的传单包制作的地图中插入集群颜色的通用函数
- couchdb - 可以在 CouchDB 中对视图进行排序吗?
- vue.js - NPM:403 禁止 - PUT http://registry.npmjs.org/[package-name] - 禁止
- c# - 从复杂的 json 对象中删除属性
- c# - wpf 回滚|停止转移焦点并停止其他事件
- sql - 在 MS SQL Server 2012 中加入 3 个表
- c# - Blazor WebAssembly 调用受保护的 WebAPI 方法并中继不记名令牌
- python - Python:在图像中查找黑色背景