我正在为宠物小精灵服务器制作一个机器人,我正在尝试创建一个将“ Gym Leader”角色赋予其他用户的命令。我尝试使用该命令并使用test命令,但是服务器或外壳中都没有响应。
import os
import discord
from dotenv import load_dotenv
from discord.ext import commands
from discord.utils import get
bot = commands.Bot(command_prefix='b!', case_insensitive=True)
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
client = discord.Client()
@client.event #works
async def on_ready():
print(f'{client.user.name} has connected to Discord!')
channel = client.get_channel(697500755766018098)
@client.event #works
async def on_member_join(member):
await member.create_dm()
await member.dm_channel.send(
f'Hi {member.name}, welcome to Pokémon Beast Ball!\n\nThis server utilizes Pokecord and Mewbot.\n\nSay \'pkhelp\' in the server to learn about Pokecord commands.\nSay \';help\' in the server to learn about Mewbot commands.'
)
@bot.command() #doesn't work
async def test(ctx):
print("test recieved")
await ctx.send(ctx)
@bot.command(pass_context=True) #this is the command that really needs help
async def newleader(ctx: discord.User=None):
print("command recieved")
if not user:
await ctx.send("Invalid")
print("1")
else:
role = discord.utils.get(ctx.guild.roles, name="Gym Leader")
role2 = discord.utils.get(ctx.guild.roles, name="Purple UniTurtle Man")
if role in ctx.author.roles or role2 in ctx.author.roles:
print("2")
await ctx.send(f'A new Gym Leader has been appointed')
await user.add_roles(role)
await bot.remove_roles(ctx.author, role)
else:
print("3")
await ctx.send("You do not have permission to use this command")
client.run(TOKEN)
答案 0 :(得分:0)
您检查了吗:
答案 1 :(得分:0)
您正在混合使用bot
和client
,而您的client = discord.Client()
正在踩bot = commands.Bot(...)
语句。由于要执行命令和事件,因此仅使用commands.Bot(...)
语句。
删除client = discord.Client()
语句,并将@client.event
装饰符更改为@bot.event
。
如果要在测试命令中引用命令上下文,请使用ctx参数async def test(ctx):
更新它。
这将使您开始使用命令,现在可以输入b1test
。
请注意,命令声明上的case_insensitive=True
是指命令名称,而不是前缀。
答案 2 :(得分:0)
问题实际上并非所选答案所暗示的。可能没有理由同时使用commands.Bot
和discord.Client
,但同时使用不会导致该问题。
问题是因为您仅运行client
,而不是bot
。如果您希望它运行,还需要运行bot
实例。
如果您不尝试做特定的事情,则无论如何,只要使用bot
或client
就足够了,因此所选答案的一部分至少有助于避免该问题。