【问题标题】:Discord.py: Send long messagesDiscord.py:发送长消息
【发布时间】:2020-05-14 07:51:42
【问题描述】:
@bot.command(name='mlist', help='List of members.')
async def mlist(ctx):
    nl = "\n"
    await ctx.send(f'The member list is:\n{nl.join(memberList())}')

我有上面的这段代码,它将当前成员的列表发送到频道。在我开始有一个超出不和谐消息限制的列表之前,它工作正常。
根据我的发现,我有 2 个选项来处理这个问题:

  1. 将列表分成几部分以避免限制,这会产生大量消息,并且更难清理频道。
  2. 将列表作为文本文件发送,如果不每次创建、保存、打开然后删除一个新文件,我就找不到这样做的方法。

对实现我的目标的最佳方式有什么建议吗?

【问题讨论】:

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


【解决方案1】:

要完成您的选项 2,您需要创建一个类似文件的对象,您可以为此使用 io.BytesIO

import discord
from io import BytesIO
from discord.ext import commands

bot = commands.Bot("!")

@bot.command()
async def ex(ctx):
    member_names = (mem.display_name for mem in ctx.guild.members)
    as_bytes = map(str.encode, member_names)
    content = b"\n".join(as_bytes)
    await ctx.send("Member List", file=discord.File(BytesIO(content), "members.txt"))

bot.run('token')

【讨论】:

    【解决方案2】:

    实现此目的的一种方法是发送一条消息,其中包含一些反应,让您可以翻阅一些成员的“页面”?

    这个想法会使用Client.wait_for():

    示例:

    import asyncio
    import math
    
    @bot.command()
    async def members(ctx):
        members = [str(m) for m in ctx.guild.members]
        per_page = 10 # 10 members per page
        pages = math.ceil(len(members) / per_page)
        cur_page = 1
        chunk = members[:per_page]
        linebreak = "\n"
        message = await ctx.send(f"Page {cur_page}/{pages}:\n{linebreak.join(chunk)}")
        await message.add_reaction("◀️")
        await message.add_reaction("▶️")
        active = True
    
        def check(reaction, user):
            return user == ctx.author and str(reaction.emoji) in ["◀️", "▶️"]
                         # or you can use unicodes, respectively: "\u25c0" or "\u25b6"
    
        while active:
            try:
                reaction, user = await bot.wait_for("reaction_add", timeout=60, check=check)
            
                if str(reaction.emoji) == "▶️" and cur_page != pages:
                    cur_page += 1
                    if cur_page != pages:
                        chunk = members[(cur_page-1)*per_page:cur_page*per_page]
                    else:
                        chunk = members[(cur_page-1)*per_page:]
                    await message.edit(content=f"Page {cur_page}/{pages}:\n{linebreak.join(chunk)}")
                    await message.remove_reaction(reaction, user)
    
                elif str(reaction.emoji) == "◀️" and cur_page > 1:
                    cur_page -= 1
                    chunk = members[(cur_page-1)*per_page:cur_page*per_page]
                    await message.edit(content=f"Page {cur_page}/{pages}:\n{linebreak.join(chunk)}")
                    await message.remove_reaction(reaction, user)
            except asyncio.TimeoutError:
                await message.delete()
                active = False
    

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 2020-11-10
      • 2020-10-31
      • 2017-08-15
      • 2021-05-02
      • 2021-10-15
      • 1970-01-01
      • 2020-10-15
      • 2021-05-06
      相关资源
      最近更新 更多