【问题标题】:discord bot autorole -- in _run_event yield from getattr(self, event)(*args, **kwargs)discord bot autorole -- 在 _run_event 中来自 getattr(self, event)(*args, **kwargs)
【发布时间】:2019-01-23 02:03:10
【问题描述】:

我是 Python 新手,我的 Discord Bot 有一些问题,我没有得到解决。机器人应该自动为首次加入服务器的用户分配角色。我可以成功设置autorole。但是当用户加入服务器时,控制台会出现如下错误信息。

Ignoring exception in on_member_join
Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 307, in _run_event
    yield from getattr(self, event)(*args, **kwargs)
  File "E:/dev/DiscordBot/main.py", line 35, in on_member_join
    await client.add_role(member, role)
  File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 296, in __getattr__
    raise AttributeError(msg.format(self.__class__, name))
AttributeError: '<class 'discord.client.Client'>' object has no attribute 'add_role'
C:\Program Files\Python36\lib\site-packages\discord\client.py:314: RuntimeWarning: coroutine 'get' was never awaited
  pass

main.py

import discord
from discord.ext import commands

import SECRETS
import STATICS
from commands import cmd_autorole

client = discord.Client()

commands = dict(autorole=cmd_autorole)


@client.event
async def on_ready():
    print("Bot is ready!")
    await client.change_presence(game=discord.Game(name="with humans"))


@client.event
async def on_message(message):
    if message.content.startswith(STATICS.PREFIX):
        invoke = message.content[len(STATICS.PREFIX):].split(" ")[0]
        args = message.content.split(" ")[1:]
        if commands.__contains__(invoke):
            await commands.get(invoke).ex(args, message, client, invoke)
        else:
            await client.send_message(message.channel, embed=discord.Embed(color=discord.Color.red(), description=("The command `%s` is not valid!" % invoke)))


@client.event
async def on_member_join(member):
    # await client.send_message(member, "**Hello %s,**\n\nwelcome on Discord-Server __**%s**__!\nPlease look first at the main channel %s .\n\nHave Fun!" % (member.name, member.server.name, discord.utils.get(member.server.channels, id="532425431526277135").mention))
    role = cmd_autorole.get(member.server)
    if not role is None:
        await client.add_role(member, role)


client.run(SECRETS.TOKEN)

cmd_autorole.py

import os
from os import path

import discord


async def error(content, channel, client):
    await client.send_message(channel, embed=discord.Embed(color=discord.Color.red(), description=content))


async def get(server):
    f = "SETTINGS/" + server.id + "/autorole"
    if path.isfile(f):
        with open(f) as f:
            return discord.utils.get(server.roles, id=f.read())
    else:
        return None


async def savefile(id, server):
    if not path.isdir("SETTINGS/" + server.id):
        os.makedirs("SETTINGS/" + server.id)
    with open("SETTINGS/" + server.id + "/autorole", "w") as f:
        f.write(id)
        f.close()


async def ex(args, message, client, invoke):
    print(args)
    if len(args) > 0:
        rolename = args.__str__()[1:-1].replace(",", "").replace("'", "")
        role = discord.utils.get(message.server.roles, name=rolename)
        if role is None:
            await error("Please enter a valid role existing on this server!", message.channel, client)
        else:
            try:
                await savefile(role.id, message.server)
                await client.send_message(message.channel, embed=discord.Embed(color=discord.Color.green(), description=("Autorole has been successfully set up for the Role `% s`." % role.name)))
            except Exception:
                await error("Something went wrong while saving autorole!", message.channel, client)
                raise Exception

【问题讨论】:

  • 这是Client.add_roles 而不是add_role
  • 您好 Patrick Haugh,非常感谢您的快速响应和帮助。我将第 35 行更改为 client.add_roles,但仍然有错误。例如,从未等待过“get”的最后一条错误消息。我找不到我的错误。
  • 忽略 on_member_join Traceback 中的异常(最近一次调用最后一次):文件“C:\Program Files\Python36\lib\site-packages\discord\client.py”,第 307 行,_run_event yield from getattr(self, event)(*args, **kwargs) File "E:/dev/DiscordBot/main.py", line 35, in on_member_join await client.add_roles(member, role) File "C:\Program Files\ Python36\lib\site-packages\discord\client.py",第 2915 行,在 add_roles new_roles = utils._unique(role.id for role in itertools.chain(member.roles, roles))
  • 文件 "C:\Program Files\Python36\lib\site-packages\discord\utils.py",第 232 行,在 _unique 中返回 [x for x in iterable if not (x in seen or adder(x))] 文件“C:\Program Files\Python36\lib\site-packages\discord\utils.py”,第 232 行,在 返回 [x for x in iterable if not (x in seen or adder(x))] AttributeError: 'coroutine' object has no attribute 'id' C:\Program Files\Python36\lib\site-packages\discord\client.py:314: RuntimeWarning: coroutine 'get' was never awaited pass
  • cmd_autorole.get是协程,需要awaited

标签: python python-3.x discord.py


【解决方案1】:

在您的cmd_autorole.py 文件中,get() 函数是异步的,但在您的主文件中您还没有等待它。 你必须写role = await cmd_autorole.get(member.server) 而不是role = cmd_autorole.get(member.server)

【讨论】:

    【解决方案2】:

    不要在第二个事件中使用@client.event,而是尝试使用@client.listen,如下所示:

    @client.listen
    async def on_message(message):
        if message.content.startswith(STATICS.PREFIX):
            invoke = message.content[len(STATICS.PREFIX):].split(" ")[0]
            args = message.content.split(" ")[1:]
            if commands.__contains__(invoke):
                await commands.get(invoke).ex(args, message, client, invoke)
            else:
                await client.send_message(message.channel, embed=discord.Embed(color=discord.Color.red(), description=("The command `%s` is not valid!" % invoke)))
    
    
    @client.listen
    async def on_member_join(member):
        # await client.send_message(member, "**Hello %s,**\n\nwelcome on Discord-Server __**%s**__!\nPlease look first at the main channel %s .\n\nHave Fun!" % (member.name, member.server.name, discord.utils.get(member.server.channels, id="532425431526277135").mention))
        role = cmd_autorole.get(member.server)
        if not role is None:
            await client.add_role(member, role)
    

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 2012-12-06
      • 2013-08-08
      • 2013-08-04
      • 2020-09-16
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多