#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 должен быть прописным.