制作服务器信息机器人

时间:2020-06-13 12:55:41

标签: python discord discord.py discord.py-rewrite

我正在为服务器制作机器人,我想添加一个命令,例如!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'

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

您似乎正在使用一些旧教程或参考旧文档。我建议查看更多最新教程并使用新文档(v1.x-重写)。

不建议使用异步(v0.16.x),此后开始有major changesrenaming 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))```