У нас есть несколько проблем с таблицами лидеров:
1) наша таблица лидеров настроена как глобальная. Когда я перечисляю все записи в игре, я получаю это:
Вот та же таблица, но читаемая лучше:
В таблице 5 записей, но отсутствует ранг 1 и ранг 5. Первая запись - "Jiří" с рангом 2. Но со страниц FB я знаю, что есть человек с рангом 1 (Джейми Пичардо Гарсия):
Итак, первый вопрос: почему этого человека нет в таблице?
2) вызов getEntriesAsync имеет 2 параметра: количество возвращаемых записей и смещение от верхней части таблицы. Вот таблица результатов, которые мы получаем при вызове getEntriesAsync(1, x), где x — числа от 0 до 7:
Вызов со смещением 0 не возвращает никакой записи (должен вернуть "Jiří", так как он первый в таблице?). Также вызов со смещением 4 ничего не возвращает. На самом деле выглядит так, что возвращает запись с рангом = смещение + 1. Если такого ранга в таблице нет, то не возвращает запись (или отклоняет - см. пункт 3))
Итак, второй вопрос: это предполагаемое поведение или ошибка? Для смещения 0 я бы ожидал первую запись в таблице со смещением 1 второй записи...
3) непоследовательное поведение, когда запись не найдена. На моем ПК и на многих устройствах обещание разрешается пустым массивом записей. В Messenger на Android 4.4 тот же промис отклоняется (не говоря уже о других проблемах с промисами). Если мы вызываем getEntriesAsync() с большим числом (например, возвращаем 2 записи), промис также отклоняется, если хотя бы одна из записей не найдена (например, вызов getEntriesAsync(2, 4) для указанной таблицы) - возвращается одна запись на ПК.
Итак, третий вопрос: это ошибка? Должно ли обещание всегда разрешаться с пустым массивом? Он, безусловно, не должен отклоняться, если отсутствует только одна запись...
4) Наконец, чего мы хотели добиться и что не получается. Для игрока мы хотели получить соперника, который на одну позицию лучше в глобальной таблице лидеров. К сожалению, вы можете случайно попасть в пропущенные ряды, и тогда вам не вернут ни одного соперника (или вы даже получите отказ от обещания). Например, если игрок имеет ранг 6 ("Йирка" в таблице), мы запрашивали запись со смещением 4 (4 = 6 - 1 - 1; -1, потому что ранги равны 1...n, а смещение 0...n -1 и -1 за лучшую позицию на одну позицию). При вызове getEntriesAsync(1, 4) ваше обещание либо разрешается с нулевыми записями, либо отклоняется (Messenger + Android 4.4).
Итак, четвертый вопрос: есть ли способ поднять игрока на одну позицию выше в глобальной таблице лидеров?