【问题标题】:Writing a Discord Bot using Discord.py Rewrite使用 Discord.py Rewrite 编写 Discord Bot
【发布时间】:2020-02-23 07:04:27
【问题描述】:

所以目前我有一个 discord Bot,我想让它欢迎 #joining 中的任何新用户,并给他们昵称“[0] Member Name”。我没有收到任何错误,但这些功能都不起作用!

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

编辑 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'

我的新编辑代码

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())

【问题讨论】:

  • client.send_message() - 第一个参数应该是目的地(在这种情况下是您的频道实例)。使用client.send_message(channel, f"Welcome to CB:NL {member.mention}!")。此外,当您将频道与 id 进行比较时,您应该使用channel.id,这是一个字符串属性。
  • @eyllanesc 我做了一些编辑并重写了一些东西,但仍然停留在一些错误消息上!
  • 抱歉,'@'发错人了! @Ko 修改了我的代码

标签: python discord


【解决方案1】:

我会回复,因为您的代码中有多个错误并且很难放入评论中。如果您遇到其他错误,可以在此帖子下发表评论。


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

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


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

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


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

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

AttributeError: 'User' 对象没有属性 'top_role'

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

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

【讨论】:

  • 自动昵称部分仍然不起作用,因为我仍然不明白如何使用 member.edit
  • @GardenGnome164 像这样使用它:await member.edit(nick="new nick") 查看我的编辑。
  • 谢谢!它现在正在工作!不过最后一部分还是有一些问题。 ;-;
  • 具体是哪一部分?尝试通过编辑您的问题更详细地描述问题。
  • 最后检查以确保 top_role > staff_role 在成员离开时给了我一些错误。
猜你喜欢
  • 2019-02-26
  • 2018-12-02
  • 2019-05-28
  • 2021-01-26
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2021-01-02
  • 2021-11-07
相关资源
最近更新 更多