【发布时间】: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