Distintivo Devotee e fusos horários, requisitos relaxados?

Recebemos alguns relatos de usuários sobre a insígnia Devotee, que exige 365 dias de logins consecutivos para ser obtida. O problema parece ser que pessoas em fusos horários muito distantes do UTC (por exemplo, PST +8) precisam levar em conta que o “dia” subjacente é baseado no horário UTC. Estamos vendo usuários europeus recebendo a insígnia, enquanto outros não entendem por que não estão recebendo.

Acredito que o que aconteceu é o seguinte: alguém no fuso PST +8 faz login no início da manhã do dia 14 de março e, em seguida, no final da noite do dia 15 de março (para essa pessoa, um login em cada dia), mas a consulta do sistema para a insígnia considera o dia 15 de março como completamente “pulado”, quebrando a sequência de 365 dias consecutivos. Isso pode ser frustrante para o usuário final, especialmente se estiver perto do fim do seu “período” de um ano.

Sei que fusos horários e consultas de banco de dados muitas vezes não se misturam bem, mas gostaria de saber se há algo que possa ser feito para “ampliar” a consulta, talvez oferecendo uma tolerância para um “dia UTC” quando se trata de períodos mais longos para insígnias, como um ano — obrigado.

9 curtidas

A tabela que armazena as visitas usa uma data simples, não um carimbo de tempo, então implementar uma tolerância de algumas horas não é viável.

Tudo depende do que sua comunidade deseja no final. Você pode desativar essa medalha e criar uma personalizada equivalente que seja acionada com menos dias, o que seria suficiente para cobrir esse período. Ou verificar usuários cujas lacunas entre visitas nunca ultrapassam 1 dia.

7 curtidas

Obrigado por verificar e responder.

Eles querem que sua insígnia funcione independentemente do fuso horário. Os usuários de longa data são os mais apaixonados. :slight_smile:

Temos uma consulta no Data Explorer como esta, que ajudou a identificar o problema:

-- [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 

…o que fornece os segmentos contínuos listados. Por causa da parte UTC (ou melhor, de como a data subjacente é armazenada, em vez de data e hora?), parece justo que devamos conceder a insígnia, mesmo que exista uma ‘lacuna de 1 dia’, na minha opinião.

Vamos analisar a possibilidade de criar outra insígnia Devotee com base na modificação dessa consulta, talvez com um INTERVAL de ‘2 dias’?

6 curtidas

Recebemos algumas solicitações de suporte sobre a medalha Devoto exatamente por esse motivo. A solução alternativa é conceder a medalha por meio do console do Rails. As instruções para fazer isso estão disponíveis aqui: Award a non-custom badge through the console.

Se houver uma maneira fácil de relaxar os critérios da medalha para permitir alguns dias pulados, acho que seria uma boa ideia.

5 curtidas