Значок преданного и часовые пояса: смягчение требований?

Получено несколько сообщений от пользователей о значке «Посвящённый», который можно получить после 365 дней непрерывного входа в систему. Проблема, похоже, заключается в том, что пользователям из часовых поясов, сильно отличающихся от UTC (например, PST +8), необходимо учитывать, что «день» в системе определяется по времени UTC. Мы видим, что европейские пользователи получают значок, в то время как другие не понимают, почему они его не получают.

Полагаю, что произошло следующее: пользователь из часового пояса, например, PST +8, вошёл в систему рано утром 14 марта, а затем поздно вечером 15 марта (для него это входы в разные дни), но система проверки значка интерпретировала 15 марта как полностью «пропущенный» день, прервав его серию из 365 дней подряд. Это может расстроить пользователя, особенно если он находится близко к завершению годового «забега».

Я понимаю, что часовые пояса и запросы к базе данных часто плохо сочетаются, но хотел бы узнать, можно ли что-то сделать, чтобы «расширить» запрос, возможно, добавив допуск для «дня UTC» в случае более длительных периодов получения значков, например, в течение года. Спасибо.

9 лайков

Таблица, хранящая записи о посещениях, использует обычную дату, а не временную метку, поэтому реализация допуска в несколько часов невозможна.

Всё зависит от того, чего ваша сообщество в итоге хочет. Вы можете отключить эту значок и создать аналогичный пользовательский значок, который срабатывает при меньшем количестве дней, чтобы этого хватило для покрытия этих дней. Или проверьте пользователей, у которых интервалы между посещениями никогда не превышают 1 день.

7 лайков

Спасибо за внимание и ответ.

Они хотят, чтобы их значок работал независимо от часового пояса. Самые преданные пользователи — это те, кто здесь давно. :slight_smile:

У нас есть запрос Data Explorer, похожий на этот, который помог выявить проблему:

-- [params]
-- user_list :users

WITH StartingPoints AS (
  SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  FROM user_visits AS A
  WHERE NOT EXISTS (
     SELECT 1
     FROM user_visits AS B
     WHERE B.visited_at = A.visited_at - INTERVAL '1 day' AND
     B.user_id = A.user_id
  ) AND user_id IN (:users)
),
EndingPoints AS (
  SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  FROM user_visits AS A
  WHERE NOT EXISTS (
     SELECT 1
     FROM user_visits AS B
     WHERE B.visited_at = A.visited_at + INTERVAL '1 day' AND
     B.user_id = A.user_id
  ) AND user_id IN (:users)
)
SELECT u.username, S.visited_at AS start_range, E.visited_at AS end_range, (E.visited_at - S.visited_at + 1) AS Days
FROM StartingPoints AS S
JOIN EndingPoints AS E ON E.rownum = S.rownum
JOIN users u ON u.id=S.user_id AND
u.id IN (:users)
ORDER BY u.id ASC, S.visited_at DESC 

…что выводит список непрерывных отрезков. Из-за части UTC (или, скорее, из-за того, как хранится дата, а не дата и время?), кажется справедливым присвоить значок, даже если существует «разрыв в 1 день», на мой взгляд.

Мы подумаем над созданием ещё одного значка Devotee, основанного на изменении этого запроса, возможно, с интервалом в «2 дня»?

6 лайков

Мы получаем несколько запросов в службу поддержки относительно значка «Преданный» именно по этой причине. Обходное решение — выдать значок через консоль Rails. Инструкции по выполнению этой операции можно найти здесь: Award a non-custom badge through the console.

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

5 лайков