移动角色会改变他们

Moving roles switches them

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

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

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 and/or .queueAfter())时,我目睹了以下情况:

  1. 第一个角色创建在底部。一切都很好。
  2. 第一个角色移动到指定位置。有效。
  3. 第二个角色像往常一样在底部创建。
  4. 当第二个角色向上移动到该位置时,它会将第一个角色向下移动到创建它的位置(底部)。

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

我的代码中是否存在逻辑问题,我这样做的方法是错误的解决方案还是这只是一个不和谐的问题?我怎样才能解决这个问题?

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

ModifyRolePosition 使用角色的缓存版本。

一次只更改一个位置会导致每次都修改相同的缓存版本,从而导致更改不会被继承。

这就是为什么可以在一次调用中进行多次操作,只需将多个 .selectPosition(initialPosition).moveTo(newPosition) 排队并在最后调用一次 .queue() 来提交它们。