提问者:小点点

使用Discord.py重写编写不和谐机器人


所以目前我有一个不和谐的机器人,我想让它欢迎#加入的任何新用户,并给他们昵称“[0]成员名称”。我没有收到任何错误,但这两个功能都不起作用!

编辑:重新编写了一些代码,我现在收到这个错误:

编辑2:仍然无法编辑昵称,但是当用户离开服务器时,我从功能中得到这些错误,以检查用户是否是工作人员。我没有从message.author得到错误,但是当消息作者离开时,我开始得到这个错误。我尝试在有人离开服务器时重置message.author,但这没有帮助!我对如何阻止这些错误没有任何想法!

Ignoring exception in on_message
Traceback (most recent call last):
  File "C:\Users\Evan\Anaconda3\envs\testing\lib\site-packages\discord\client.py", line 270, in _run_event
    await coro(*args, **kwargs)
  File "C:/Users/Evan/PycharmProjects/Bot/bot.py", line 107, in on_message
    top_role = message.author.top_role
AttributeError: 'User' object has no attribute 'top_role'

My New Edited Code vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

import discord
import asyncio
import time

# id = 630529690792230923
messages = joined = 0

client = discord.Client()


@client.event
async def on_ready():
    print(f'Logged in as: {client.user.name}')
    print(f"User ID: {client.user.id}")
    print('-----')


async def update_stats():
    await client.wait_until_ready()
    global messages, joined

    while not client.is_closed():
        try:
            with open("stats.txt", "a") as f:
                f.write(f"Time: {int(time.time())}, Messages: {messages}, Members Joined: {joined}\n"),
            messages = 0
            joined - 0

            await asyncio.sleep(3600)
        except Exception as e:
            print(e)
            await asyncio.sleep(3600)


@client.event
async def on_raw_reaction_add(payload):
    message_id = payload.message_id
    if message_id == 638155786559684608:
        guild_id = payload.guild_id
        guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds)

        if payload.emoji.name == 'Test':
            role = discord.utils.get(guild.roles, name='new role')
        else:
            role = discord.utils.get(guild.roles, name=payload.emoji.name)

        if role is not None:
            member = discord.utils.find(lambda m: m.id == payload.user_id, guild.members)
            if member is not None:
                await member.add_roles(role)
                print("done")
            else:
                print("Member Not Found")


@client.event
async def on_raw_reaction_remove(payload):
    message_id = payload.message_id
    if message_id == 638155786559684608:
        guild_id = payload.guild_id
        guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds)

        if payload.emoji.name == 'Test':
            role = discord.utils.get(guild.roles, name='new role')
        else:
            role = discord.utils.get(guild.roles, name=payload.emoji.name)

        if role is not None:
            member = discord.utils.find(lambda m: m.id == payload.user_id, guild.members)
            if member is not None:
                await member.remove_roles(role)
                print("done")


@client.event
async def on_member_join(member):
    global joined
    joined += 1
    rule_channel = member.guild.get_channel(channel_id=630530486858547223)
    newusermessage = f"""Welcome to CB:NL {member.mention}! Have a Great Time And Make Sure to Look At {rule_channel}"""
    channel = member.guild.get_channel(channel_id=630563931412496434)

    role = member.guild.get_role(role_id=630533613947060244)
    if member is not None:
        await member.add_roles(role)
        print("done")

    await member.edit(str([f"[0] {member.display_name}"]))

    await channel.send(newusermessage)


@client.event
async def on_member_remove(member):
    discord.message.author = member


@client.event
async def on_message(message):
    global messages
    messages += 1
    id = client.get_guild(630529690792230923)
    bad_words = ["test"]
    channels = ["bot-commands", "staff-general"]
    pn = 1
    author = message.author
    top_role = message.author.top_role
    staff_role = message.author.guild.get_role(role_id=630532857655328768)

    if top_role > staff_role:

        if message.content.startswith == "-clean":
            pass

        if str(message.channel) in channels:
            if message.content.find("-hello") != -1:
                await message.channel.send("Hi")

            elif message.content == "-status":
                await message.channel.send(f"""# of Members: {id.member_count}""")

    else:
        if message.author.bot is not 1:
            print(f"""{message.author} tried to do command {message.content}""")
            await message.channel.send(f"Error, {message.author.mention}. You Cannot Do That!")


client.loop.create_task(update_stats())

共1个答案

匿名用户

我会回答的,因为你的代码中有多个错误,很难放入评论中。如果你遇到另一个错误,你可以在这篇文章下评论。

role = discord.utils.get(discord.Guild.roles, name="Member")

错误是您按名称成员检索角色的位置。最好通过ID获取角色,您可以使用成员。公会。get_role(630533613947060244)。错误是discord. Guild.角色不是可迭代属性。

nick = discord.utils.get(str(member.nick))

不确定您的意图是什么,您可以使用nick=成员. nick获取带有成员昵称的字符串。

要编辑您应该使用的昵称:

await member.edit(nick=f"[0] {member.display_name}")

用户对象没有属性top_role

出现此错误是因为您想访问discord. User实例上的top_role属性,但只有discord.会员定义了此属性。当有人离开服务器时,您会得到User实例而不是会员实例。

if isinstance(message.author, discord.Member):
  top_role = message.author.top_role
else:
  top_role = None   # top role not available, user has no roles