【问题标题】:getting error code message is not defined未定义获取错误代码消息
【发布时间】:2021-07-31 17:32:03
【问题描述】:

我一直在研究这个机器人,当你输入“/court @user time”时,它会给他们角色 jail 并且在给定的时间后它将删除它但是当我运行它时它不起作用并且它说: “discord.ext.commands.errors.CommandInvokeError:命令引发异常:NameError:未定义名称'消息'”

import discord
from discord.ext import commands
import ctx
import re
import time
from time import sleep

PREFIX = "$"
bot = commands.Bot(command_prefix=PREFIX, description="Hi")

@bot.event
async def on_ready():
    print('Logged on as', bot.user)
    channel = bot.get_channel(717005397655027805)
    #await channel.send("I am now online")
    activity = discord.Game(name="eb!help", type=3)
    await bot.change_presence(status=discord.Status.online, activity=activity)

@bot.command(name='court')
@commands.has_role('Server Developer')
async def court(ctx, user_mentioned, time):
    messageContent = message.content
    if len(messageContent) > 0:
        if re.search("^send.*court$", messageContent):

            user_id = message.mentions[0].id
            user = message.mentions[0]

            await message.channel.send(
                f"sending <@{user_id}> to court!"
            )

            role = discord.utils.get(message.guild.roles, name="Jail")
            await user.add_roles(role)

            sleep(time)

            await bot.remove_roles(user, role)

bot.run('TOKEN_GOES_HERE')

【问题讨论】:

  • 错误很明显,您尝试访问message,但您没有名为message的变量。

标签: python discord discord.py


【解决方案1】:

@ceres 这是法庭命令代码:

bot.command(name='court')
@commands.has_role('Server Developer') 
async def court(ctx, user_mentioned: discord.Member, time: int):
    print("test")
    user_id = message.mentions[0].id
    user = message.mentions[0]
    role = discord.utils.get(message.guild.roles, name="Jail")
    await user_mentioned.add_roles(role)
    await ctx.send(
        f"sending <@{user_id}> to court!"
    )
    await asyncio.sleep(time)
    await user_mentioned.remove_roles(role)

【讨论】:

    【解决方案2】:

    您可以通过键入ctx.message.content 来获取消息的内容,但您不需要它。如果您将参数描述为discord.Member,它将返回一个成员对象,如果它找到了,则机器人将引发commands.BadArgument。此外,您应该使用 asyncio.sleep 进行异步睡眠。这不会阻止您的机器人的其他命令。

    import asyncio
    
    @bot.command(name='court')
    @commands.has_role('Server Developer')
    async def court(ctx, user: discord.Member, time: int):
        role = discord.utils.get(message.guild.roles, name="Jail")
        if role is not None:
            await ctx.send(
                f"sending {user.mention} to court!"
            )
         
            await user.add_roles(role)
    
            await asyncio.sleep(time)
    
            await user.remove_roles(role)
    
        else:
            await ctx.send("Role `Jail` is not exist.")
    
    
    bot.run('TOKEN')
    

    【讨论】:

    • 机器人运行一秒钟然后关闭
    【解决方案3】:

    错误信息很清楚, messageContent = message.content.
    message 未在此处定义。 我们可以通过ctx.message得到消息

    @bot.command(name='court')
    @commands.has_role('Server Developer')
    async def court(ctx, user_mentioned, time):
        message = ctx.message
        messageContent = message.content
    

    这样做会很好,但你在这里完全滥用了ext.commands

    你可以的

    @bot.command(name='court')
    @commands.has_role('Server Developer')
    async def court(ctx, user_mentioned: discord.Member, time: int):
        role = discord.utils.get(message.guild.roles, name="Jail")
        await user_mentioned.add_roles(role)
        await asyncio.sleep(time)
        await user_mentioned.remove_roles(role)
    
    

    time.sleep 处于阻塞状态且bot 没有remove_roles 属性,请参阅docs 获取信息。

    【讨论】:

    • 我没有收到任何错误,但机器人没有响应或做任何事情
    • 以上代码中没有任何响应,请尝试在函数中的某处执行ctx.send 以获得响应
    • 我确实这样做了,但仍然没有反应,它并没有添加角色
    • 您可能没有权限,上面的代码有效。我在我的机器人上进行了测试。
    • 它有管理员前提
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多