【问题标题】:discord.py how to check if user react with special emoji on message如果对反应做出反应
【发布时间】:2021-02-18 12:32:49
【问题描述】:

所以我正在制作一个不和谐的机器人,并有一个自定义命令,即?plugins,当我编写该命令时,我希望它发送一个带有 4 个反应的消息。如果您对反应 1 做出反应,它将删除该嵌入,然后发送一个新嵌入。我想要所有 4 种反应。如果不告诉我,我希望你能理解。

但是我知道如何做到这一点,我已经尝试了一些方法并查看了堆栈溢出的其他人,但我无法让它工作

我对编程很陌生,不太了解 xD 但这是我试图做的......

@bot.command(name='plugins')
async def plugins(context):
    my_embed = discord.Embed(title='Welcometo to SteinerCraft plugin page!', color=0xFFC71C)
    my_embed.set_author(name='SC.B#4073', icon_url='https://cdn.discordapp.com/attachments/765665083082407976'
                                                   '/767456901398921246/SC.B_remix_profile.png')
    my_embed.add_field(name='Select what type of help you need.', value='.', inline=False)
    my_embed.add_field(name='Home => :one:', value='Friend => :two:', inline=True)
    my_embed.add_field(name='Community => :three:', value='Other => :four:', inline=True)
    await context.message.channel.send(embed=my_embed)
    await bot.add_reaction(':one:' and ':two:' and ':three:' and ':four:')

if reaction.emoji ==':one:':
    my_embed = discord.Embed(title="Home",
color=0xFFC71C)

elif reaction.emoji == ':two:':
    my_embed = discord.Embed(title="Friend", color=0xFFC71C)

【问题讨论】:

  • 显示你到目前为止所尝试的。
  • @MrMetacom 我改变了我的文字,所以看看那里,就像我说我是新手,不太了解 =/

标签: python bots discord.py


【解决方案1】:

使用不和谐表情符号时要记住的一些事项:您不能使用 :one: 来表示反应,您必须使用 unicode 符号。 1️⃣2️⃣3️⃣4️⃣

一般来说,对于表情符号,您一次只能添加一个作为反应,但您可以创建一个 for 循环来从列表中添加表情符号

我看到您希望机器人删除嵌入,然后发送一个新的。如何编辑发送的嵌入?看看答案here

只是为了向您展示如何使用嵌入,我在这里添加了代码的编辑版本。

将嵌入更改为您需要的样式。

import asyncio

@bot.command(name='plugins')
async def plugins(ctx):
    message = ctx.message
    embed_1 = discord.Embed(title='Welcometo to SteinerCraft plugin page!', color=0xFFC71C)
    embed_1.set_author(name='SC.B#4073', icon_url='https://cdn.discordapp.com/attachments/765665083082407976/767456901398921246/SC.B_remix_profile.png')
    embed_1.add_field(name='Select what type of help you need.', value='.', inline=False)
    embed_1.add_field(name='Home => :one:', value='Friend => :two:', inline=True)
    embed_1.add_field(name='Community => :three:', value='Other => :four:', inline=True)

    embed_2 = discord.Embed(title='A second embed page', color=0xFFC71C)
    embed_2.set_author(name='SC.B#4073', icon_url='https://cdn.discordapp.com/attachments/765665083082407976/767456901398921246/SC.B_remix_profile.png')
    embed_2.add_field(name='Select what type of help you need.', value='.', inline=False)
    embed_2.add_field(name='Home => :one:', value='Friend => :two:', inline=True)
    embed_2.add_field(name='Community => :three:', value='Other => :four:', inline=True) 

    embed_3 = discord.Embed(title='A third embed page', color=0xFFC71C)
    embed_3.set_author(name='SC.B#4073', icon_url='https://cdn.discordapp.com/attachments/765665083082407976/767456901398921246/SC.B_remix_profile.png')
    embed_3.add_field(name='Select what type of help you need.', value='.', inline=False)
    embed_3.add_field(name='Home => :one:', value='Friend => :two:', inline=True)
    embed_3.add_field(name='Community => :three:', value='Other => :four:', inline=True)

    embed_4 = discord.Embed(title='A fourth embed page', color=0xFFC71C)
    embed_4.set_author(name='SC.B#4073', icon_url='https://cdn.discordapp.com/attachments/765665083082407976/767456901398921246/SC.B_remix_profile.png')
    embed_4.add_field(name='Select what type of help you need.', value='.', inline=False)
    embed_4.add_field(name='Home => :one:', value='Friend => :two:', inline=True)
    embed_4.add_field(name='Community => :three:', value='Other => :four:', inline=True)

    emb_message = await ctx.message.channel.send(embed=embed_1)
    emoji_list = ['1️⃣','2️⃣','3️⃣','4️⃣']
    for i in emoji_list:
        await emb_message.add_reaction(i)

    def check(reaction, user):
        return user == ctx.author and str(reaction.emoji) in emoji_list
        # This makes sure nobody except the command sender can interact

    while True:
        try:
            reaction, user = await bot.wait_for("reaction_add", timeout=60, check=check)

            if str(reaction.emoji) == "1️⃣":
                await emb_message.edit(embed = embed_1)
                await emb_message.remove_reaction(reaction, user)

            elif str(reaction.emoji) == "2️⃣":
                await emb_message.edit(embed = embed_2)
                await emb_message.remove_reaction(reaction, user)
            
            elif str(reaction.emoji) == "3️⃣":
                await emb_message.edit(embed = embed_3)
                await emb_message.remove_reaction(reaction, user)

            elif str(reaction.emoji) == "4️⃣":
                # await emb_message.edit(embed = embed_4)
                await emb_message.remove_reaction(reaction, user)
                
            else:
                await message.remove_reaction(reaction, user)
        except asyncio.TimeoutError:
            break
            # ending the loop if user doesn't react after x seconds

在终端中打印您的表情符号以便您可以复制它们:

@bot.command()
async def emojiprint(ctx, *, emojis):
    print(emojis)

添加任意数量的表情符号,自定义的,不和谐的......它将在终端中打印所有的表情符号。自定义显示为 <:emoji_name:emoji_id> (或 如果动画)

【讨论】:

  • 哇,非常感谢!但是代码并没有真正起作用,我遇到了一些问题……比如 34 个问题。例如`` Unexpected indent Unresolved reference 'reaction' Unresolved reference 'emb_message' Unresolved reference 'embed_1' Unresolved reference 'user' 还有更多...问题从python while True: try: reaction, user = await bot.wait_for("reaction_add", timeout=60, check=check) # timeout is how long this will work. after x it will no longer delete/change embed 开始,然后它一直保持下去,有更多问题= /
  • 对不起,文本看起来如何,我真的不知道堆栈溢出是如何工作的。是的,我对这一切都很陌生 xD 几周前就开始了
  • 你知道我添加的块评论。删除它。还要检查线条的缩进。每次添加: 时,代码都希望看到缩进的行。
  • 哦,是的,我忘了删除那个块评论,但是当它说 Shadows name 'user' from outer scope 时是什么意思?
  • @Sally shadow name 'user' from outer scope 当您还有一个名为“用户”的全局变量时会发生。这不是错误,更多的是防止出现错误的警告。仍然值得仔细研究。在您的代码中查找 user 的任何早期参考。我尝试将代码复制到与我首先测试的不同的机器人上,它似乎对我有用。您是否按原样复制粘贴对其进行了测试?
猜你喜欢
  • 2017-11-08
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
  • 2020-12-07
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多