Движущиеся роли меняют их

Я хочу, чтобы мой бот создал пять ролей и определенным образом упорядочил их на определенной должности.

Поэтому я просматриваю список имен и соответственно создаю роли. (Это не мой настоящий код, но идея та же.)

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. Когда вторая роль перемещается на позицию, она перемещает первую роль туда, где она была создана (внизу).

Такое поведение можно увидеть, пока не будут созданы все роли. Последняя роль остается на своем месте (поскольку никакая другая роль не меняет своего положения).

Есть ли в моем коде логическая проблема, мой способ сделать это неправильное решение или это просто проблема разногласий? Как я могу обойти это поведение?

Если вы подозреваете, что это более глубоко укоренилось в моем коде, дайте мне знать, для этого я могу предоставить вам более подробную информацию.


person Danny    schedule 30.05.2020    source источник


Ответы (1)


ModifyRolePosition использует кешированную версию ролей.

Изменение только одной позиции за раз приводит к тому, что одна и та же кешированная версия изменяется каждый раз, что приводит к тому, что изменения не переносятся.

Вот почему можно сделать несколько манипуляций с одним вызовом, просто поставив в очередь несколько .selectPosition(initialPosition).moveTo(newPosition) вместе и зафиксировав их, вызвав .queue() один раз в конце.

person Danny    schedule 30.05.2020