用户添加反应后在新行上显示昵称

Posted

技术标签:

【中文标题】用户添加反应后在新行上显示昵称【英文标题】:Show a nickname on new line after a user add reaction 【发布时间】:2021-08-07 05:27:34 【问题描述】:

我正在尝试使用 discord API 在用户点击反应后显示用户 Discord.Tag(或昵称)。

在我的代码中,Discord.tag 只是被最后点击反应的用户覆盖。用户可以是±30。

这就是我想要的:

我的代码:

private async Task OnReactionAdded(Cacheable<IUserMessage, ulong> arg1, ISocketMessageChannel arg2, SocketReaction arg3)

    var User = arg3.User.Value as SocketGuildUser;
    ulong MessageID = 843502656663715860;
    if (arg3.MessageId != MessageID) return;
    if (arg3.Emote.Name != "✅") return;

    var message = (RestUserMessage)await arg2.GetMessageAsync(MessageID);
    await message.ModifyAsync(x =>                                    // Edit message
    
        var exampleField = new EmbedFieldBuilder()
            .WithName("New Users")
            .WithValue($"User: arg3.User.Value \n " +               //overwritting user
                       $"User: arg3.User.Value \n ");               //
        x.Embed = new EmbedBuilder()
            .AddField(exampleField)
            .Build();
    );

【问题讨论】:

您的代码看起来像是在为字段创建内容时创建了一个新的 EmbedFieldBuilder() 实例。您是否能够创建一个构建器,从现场已有的内容开始,然后将新用户的反应附加到它上面? 从消息中获取嵌入并修改它,而不是创建一个新的嵌入。当您检索嵌入时,您可以调用ToEmbedBuilder 将其转换为嵌入构建器,以便对其进行编辑。只需通过附加新用户来编辑字段值。然后你可以在消息上调用 modify 并给它你修改后的嵌入。 @Anu6is 问题是我不知道如何从消息中获取嵌入。我试过var emd = message.Embeds,它返回Length = 1。在调试模式下,我找到了消息值:Debug Embeds 是一个集合。只需获取集合中的第一个项目。 message.Embeds.FirstOrDefault() 【参考方案1】:

我以不同的方式解决了这个问题。这是用户添加反应的代码

private async Task OnReactionAdded(Cacheable<IUserMessage, ulong> arg1, ISocketMessageChannel arg2, SocketReaction arg3)

     var User = arg3.User.Value as SocketGuildUser;
     if (arg3.MessageId != 843502656663715860) return;
     if (arg3.Emote.Name != "✅") return;
     var message = (RestUserMessage)await arg2.GetMessageAsync(843502656663715860);
     var newUser = message.Embeds.FirstOrDefault().Fields.FirstOrDefault().Value;
     if (newUser.Contains((arg3.User.Value).ToString())) return;
     await message.ModifyAsync(x => 
     
          var exampleField = new EmbedFieldBuilder()
                 .WithName("New Users")
                 .WithValue($"newUser\narg3.User.Value");
          x.Embed = new EmbedBuilder()
                  .AddField(exampleField)
                  .Build();
      );

还有奖励,如果用户删除反应

代码

private async Task OnReactionRemoved(Cacheable<IUserMessage, ulong> arg1, ISocketMessageChannel arg2, SocketReaction arg3)

    if (arg3.MessageId != 843502656663715860) return;
    if (arg3.Emote.Name != "✅") return;
    var User = arg3.User.Value.ToString();
    var message = (RestUserMessage)await arg2.GetMessageAsync(843502656663715860);                                                                        
    var newUser = message.Embeds.FirstOrDefault().Fields.FirstOrDefault().Value;
    string newValue = "";
    if (newUser.Contains((arg3.User.Value).ToString()))
    
        newValue = newUser.Replace($"\narg3.User.Value", " ");
    
    await message.ModifyAsync(x => 
    
        var exampleField = new EmbedFieldBuilder()
                .WithName("New Users")
                .WithValue($"newValue");
        x.Embed = new EmbedBuilder()
                .AddField(exampleField)
                .Build();
    );

【讨论】:

以上是关于用户添加反应后在新行上显示昵称的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应中将多个值添加到动态表中?

绑定 C#、ASP.net 后在 gridview 中添加新行

winform开发中,继承UserControl的用户控件,在其中添加文本框,运行后在文本框中输入中文显示为乱码

如何将新行添加到数据表 vb.net

如何在 wpf 中将新行添加到数据网格中?

java如何实现用户在文本框中输入好友昵称,点击查询,根据用户输入匹配好友昵称,结果加载到下拉框中