我正在为服务器制作机器人,我想添加一个命令,例如!info,它显示服务器名称,成员数等。
@client.command(pass_context=True)
@asyncio.coroutine
def info(ctx):
server = ctx.message.author.server
server_name = server.name
server_id = server.id
server_owner = server.owner.name
print("server name: {}"
"server id: {}"
"server owner: {}"
.format(server_name, server_id, server_owner))
这是我遇到的错误
Ignoring exception in command info:
Traceback (most recent call last):
File "C:\Users\cogan\AppData\Local\Programs\Python\Python37\lib\site-packages\discord\ext\commands\core.py", line 83, in wrapped
ret = await coro(*args, **kwargs)
File "C:\Users\cogan\AppData\Local\Programs\Python\Python37\lib\asyncio\coroutines.py", line 120, in coro
res = func(*args, **kw)
File "c:/Users/cogan/105.py", line 34, in info
server = ctx.message.author.server
AttributeError: 'Member' object has no attribute 'server'
有人可以帮忙吗?
答案 0 :(得分:0)
您似乎正在使用一些旧教程或参考旧文档。我建议查看更多最新教程并使用新文档(v1.x-重写)。
不建议使用异步(v0.16.x),此后开始有major changes。 renaming of server to guild是其中之一。因此,您要寻找的是Member.guild
而不是Member.server
。
上下文的另一个变化是自动传递给命令-您不需要pass_context=True
。
参考:
答案 1 :(得分:0)
因此,您发布的帖子是一些过时的过时的discord.py代码,它看起来太复杂且太过时了。首先,在discord.py中,重写List<Person> persons = new ArrayList<>();
personAndNameMap.entrySet().stream()
// collect the list of persons group by age (it collect list of persons with same age)
.collect(Collectors.groupingBy(e -> e.getKey().getAge()))
// iterate the persons of same age
.forEach((key, value) -> {
// set the best score to 0 among them
double bestScore = 0;
// create a map to store name and their line score
Map<String, Double> nameAndScoreMap = new HashMap<>();
for (Map.Entry<Person, String> map : value) {
// check and update best score
bestScore = Math.max(bestScore, map.getKey().getLineScoreMax());
// add person name and his line score in map
nameAndScoreMap.put(map.getValue(), map.getKey().getLineScoreMax());
}
// add the person in list
persons.add(new Person(key, bestScore, nameAndScoreMap));
});
已替换为public Person(int age, double lineScoreMax, Map<String, Double> nameAndScoreMap) {
this.age = age;
this.lineScoreMax = lineScoreMax;
this.nameAndScoreMap = nameAndScoreMap;
}
。以下示例显示了获取公会/服务器的名称,id和所有者的功能方法,所有这些代码都可以从https://discordpy.readthedocs.io/en/latest/api.html#guild获得。就我而言,我将其设置为嵌入消息,但您可以轻松地将其重新转换为ctx.send消息,其格式为fmt格式或在控制台中使用print()命令。
我的代码:
server
注意::使用discord.Guild
进行discord.py重写功能,这意味着,每次定义内容时,在创建新命令时都必须将该字符串放在@client.command()
async def information(ctx):
embed = discord.Embed( timestamp=ctx.message.created_at)
embed.set_author(name=f"Information for the {ctx.guild.name}")
embed.add_field(name="Guild id:", value= f"{ctx.guild.id}")
embed.add_field(name="The guilds owner is:", value = f" {ctx.guild.owner}")
await ctx.send(embed=embed)
前面或事件。
我强烈建议您至少花一个小时来慢慢阅读文档,以了解您使用的代码字符串及其描述。 ?
答案 2 :(得分:0)
因此,基本上,您尚未定义服务器 *。您可以这样做:
@asyncio.coroutine
def info(ctx):
server = ctx.guild
server = ctx.message.author.server
server_name = server.name
server_id = server.id
server_owner = server.owner.name
print("server name: {}"
"server id: {}"
"server owner: {}"
.format(server_name, server_id, server_owner))```