【问题标题】:Discord py - server list in multiple messagesDiscord py - 多条消息中的服务器列表
【发布时间】:2021-04-15 01:22:42
【问题描述】:

我的 discord 机器人中有一个 $allservers 命令,并且达到了 2.000 个字符的文本限制。所以我在问,是否可以从 MySQL 数据库中获取服务器列表并将它们放入多个消息中?

例子:

FIRST MESSAGE: server1, server2, server3
-- REACHED TEXT LIMIT, NEXT MESSAGE
SECOND MESSAGE: server4, server5, server6

我的$allservers 命令代码:

@bot.command(aliases=["servers"])
async def allservers(ctx):
    mydb = mysql.connector.connect(
        host="**",
        user="**",
        password="**",
        database="**"
    )

    mycursor = mydb.cursor()
    guild56 = bot.get_guild(616655040614236160)
    member = guild56.get_member(ctx.author.id)
    role2 = guild56.get_role(792894127972155393)  # Admin
    role3 = guild56.get_role(792894172829974529)  # Mod

    if role2 in member.roles or role3 in member.roles:
        mycursor.execute(f"SELECT * FROM servers")
        myresult = mycursor.fetchall()
        message = ''
        for x in myresult:
            try:
                x1 = [x]
                guild = bot.get_guild(int(x1[0][0]))
                channel = bot.get_channel(int(x1[0][1]))
                message += f'**{guild}** - `{channel.name}` - `{guild.id}`\n'
            except:
                pass

        await ctx.author.send(f"????** | ALLE SERVERS**\n\n{message}")
        await ctx.message.delete()

我的机器人在许多服务器上,这就是为什么机器人达到了 2.000 个字符的不和谐消息文本限制。

【问题讨论】:

  • 真的每次运行命令都连接数据库吗?还有一个小建议——除非你真的没有其他选择,否则你不应该使用 mysql
  • 你为什么不直接使用message += f'**{guild}** - {channel.name} - {guild.id}\n' 而不是await ctx.author.send(f'**{guild}** - {channel.name} - {guild.id}')?您将在您的 DM 中收到针对 n 不同服务器的 n 不同消息。此外,您实际上并不需要数据库来获取您的机器人所在的所有公会。除此之外,这会回答您的问题:stackoverflow.com/q/62878525/11146632 吗?
  • 不,我需要一个函数来处理数据库。遗憾的是我不知道我应该使用哪个保护程序,所以我使用 MySQL。而且不仅仅是机器人公会,他们必须激活服务器中的某些内容才能进入此列表。
  • 好吧,像我上面说的那样为每个公会发送单独的消息有什么问题?

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


【解决方案1】:

您可以通过将message = '' 作为字符串更改为列表messages = [] 并检查每个循环是否您的消息仍在字符限制内来解决此问题。 (并更新功能的其余部分以使用它)

像这样:

if role2 in member.roles or role3 in member.roles:
        mycursor.execute(f"SELECT * FROM servers")
        myresult = mycursor.fetchall()
        messages = ['']
        counter = 0
        for x in myresult:
            if len(messages[counter]) > 970:
                messages.append('')
                counter += 1
            try:
                x1 = [x]
                guild = bot.get_guild(int(x1[0][0]))
                channel = bot.get_channel(int(x1[0][1]))
                messages[counter] += f'**{guild}** - `{channel.name}` - `{guild.id}`\n'
            except:
                pass
        await ctx.author.send(f"?** | ALLE SERVERS**\n\n{messages[0]}")
        for i in range(1, len(messages)):
                await ctx.author.send(messages[i])
        await ctx.message.delete()

【讨论】:

  • 我收到错误 IndexError: list index out of range for if len(messages[counter]) > 970:
  • 是的,那是因为我完全忘记将第一个值放入列表中(它试图检查空列表的第一个值),现在已经修复了
猜你喜欢
  • 2021-05-18
  • 2020-10-26
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2021-04-09
  • 2021-08-06
相关资源
最近更新 更多