角色转换会切换角色

时间:2020-05-30 15:15:03

标签: discord discord-jda

我希望我的机器人创建五个角色,并在特定位置以特定方式对它们进行排序。

因此,我要遍历名称列表并相应地创建角色。 (这不是我的实际代码,但是背后的想法是相同的。)

for (String name : roleNames) {
    event.getGuild().createRole().setColor(color).setName(name).queue(role -> {
    role.getGuild().modifyRolePositions().selectPosition(role.getPosition()).moveTo(role.getGuild().getRoles().size()-8).queue()});
}

为解决问题,我尝试通过选择角色的初始位置role.getPosition()并将其移至特定位置role.getGuild().getRoles().size()-8来移动角色。

由于列表中最高角色的位置等于角色数,因此应将创建的每个角色移到完全相同的位置,从而将其下方的每个角色都降低一个位置。

但这不是正在发生的事情。

执行这些代码行并减慢处理速度(通过使用Thread.sleep和/或.queueAfter())时,我看到了以下内容:

  1. 第一个角色在底部创建。一切都很好。
  2. 第一个角色移至了指定位置。有效。
  3. 第二个角色照常在底部创建。
  4. 第二个角色上移时,将第一个角色下移到创建位置(在底部)。

在创建每个角色之前都可以看到此行为。 最后一个角色停留在它所属的位置(因为没有其他角色切换其位置)。

我的代码中是否存在逻辑上的问题,我的处理方式是否错误,还是仅仅是不和谐的问题?我怎么可能解决此问题?

如果您怀疑这已深入我的代码中,请告诉我,因为我可以为您提供更多详细信息。

1 个答案:

答案 0 :(得分:0)

ModifyRolePosition使用角色的缓存版本。

一次仅更改一个位置会导致每次都修改相同的缓存版本,从而导致所做的更改不会被保留。

这就是为什么可以通过简单地将多个.selectPosition(initialPosition).moveTo(newPosition)一起排队并在最后一次调用.queue()来提交它们的情况下,对一个呼叫进行多种操作的原因。