我正在使用discord.py制作机器人,而我的自定义帮助命令的页面上容纳的命令超出了所能容纳的范围。我希望机器人添加2个反应(来回),然后发送帮助消息的用户可以选择一个,然后转到help命令的不同页面。我希望该机器人能够编辑该消息以显示第二页,如果返回,则再编辑回原始的第一页。有人可以帮忙吗?这类似于owobot定义,您可以在这些定义之间来回滚动。
答案 0 :(得分:11)
此方法将使用Client.wait_For()
,如果您有其他想法,可以轻松地采用。
@bot.command()
async def pages(ctx):
contents = ["This is page 1!", "This is page 2!", "This is page 3!", "This is page 4!"]
pages = 4
cur_page = 1
message = await ctx.send(f"Page {cur_page}/{pages}:\n{contents[cur_page-1]}")
# getting the message object for editing and reacting
await message.add_reaction("◀️")
await message.add_reaction("▶️")
def check(reaction, user):
return user == ctx.author and str(reaction.emoji) in ["◀️", "▶️"]
# This makes sure nobody except the command sender can interact with the "menu"
while True:
try:
reaction, user = await bot.wait_for("reaction_add", timeout=60, check=check)
# waiting for a reaction to be added - times out after x seconds, 60 in this
# example
if str(reaction.emoji) == "▶️" and cur_page != pages:
cur_page += 1
await message.edit(content=f"Page {cur_page}/{pages}:\n{contents[cur_page-1]}")
await message.remove_reaction(reaction, user)
elif str(reaction.emoji) == "◀️" and cur_page > 1:
cur_page -= 1
await message.edit(content=f"Page {cur_page}/{pages}:\n{contents[cur_page-1]}")
await message.remove_reaction(reaction, user)
else:
await message.remove_reaction(reaction, user)
# removes reactions if the user tries to go forward on the last page or
# backwards on the first page
except asyncio.TimeoutError:
await message.delete()
break
# ending the loop if user doesn't react after x seconds
如果您的编辑器不直接支持粘贴表情符号,则可以使用this one之类的网站来查找表情符号的unicode。在这种情况下,向前箭头为\u25c0
,向后箭头为\u25b6
。
除此之外,您应该一切顺利!闲置60秒后,该邮件将自动删除(即没有人对箭头做出反应),但是如果您希望在删除之前需要更长的时间,则只需更改该号码即可。
或者,您可以添加第三个表情符号(例如十字架),以按需删除消息。
参考:
答案 1 :(得分:-2)
如果您使用 client.command()
而不是 bot.command()
,请将两个变量 bot
替换为 client
。