Странное поведение и проблемы с таблицей лидеров

У нас есть несколько проблем с таблицами лидеров:

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).

Итак, четвертый вопрос: есть ли способ поднять игрока на одну позицию выше в глобальной таблице лидеров?


person Tom Atom    schedule 22.08.2018    source источник


Ответы (1)


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

Мы изучаем способы решения этой проблемы в следующем выпуске SDK.

Отказы от обещаний в пункте (3) странны, и мы выясняем, что их вызывает. Этот API должен быть полностью согласован на разных платформах.

Чтобы получить следующего игрока, вы должны иметь возможность занять текущий ранг и получить следующие X очков, возвращая следующую ненулевую запись в таблице лидеров.

person Chris Hawkins    schedule 22.08.2018
comment
@роим - спасибо. Еще один вывод: в Messenger + Android 4.4 setScoreAsync() тоже не работает. Обещание всегда отвергается. Я пытался отправить только чистую оценку без каких-либо дополнительных данных, но все равно отклонил. - person Tom Atom; 24.08.2018