Convidar emblemas ao convidar a si mesmo

Descrição e Evidências

Recentemente, na versão 2.9.0beta2, usuários que já possuem uma conta podem clicar em links de convite. No entanto, eu gerei links de convite e, ao clicar neles, apareceu que eu me convidei e, como sou TL2+, cliquei em 5 links de convite diferentes meus e recebi o badge Champion. Você pode ver uma captura de tela disso abaixo. Estes são nos fóruns Replit EDU e você pode ver meu perfil aqui.

Também criei um link de convite nos fóruns Codecademy e diz que eu me convidei lá também, o que você pode ver abaixo. Veja meu perfil aqui.

Passos para Reprodução

Alcance TL2+ (por padrão), crie links de convite e clique neles. Dirá que você se convidou em seu perfil e que aceitou seu convite, como mostrado acima. E se você criar links de convite suficientes, receberá os badges Campaigner e Champion.

4 curtidas

Funciona para mim aqui também. Agora meu perfil diz que fui convidado por mim mesmo.

6 curtidas

E você deve receber o distintivo de promotor. (Esqueci de mencionar na postagem original porque eu já o tinha antes disso)

2 curtidas

Obrigado por apontar isso! Ao projetar este recurso, esqueci-me de pensar como uma pessoa má. :supervillain:

@dan, alguma ideia sobre como corrigir este problema?

6 curtidas

Eu pessoalmente nunca olhei o código do discourse, mas algo assim poderia funcionar. (isto está em JS porque é o que eu conheço melhor)

if (invter != invitee) {
  inviter_count++
}
3 curtidas

Este bug agora está corrigido. Obrigado novamente @not-ethan por reportá-lo! Se você notar qualquer problema com o sistema de convites, por favor, nos avise. Estamos trabalhando ativamente nele.

5 curtidas

Reabrindo porque perdi o controle de uma PM de @not-ethan. @dan, se não for muito incômodo, você se importaria de ajudar?

Posso ter um link para o commit ou PR para a correção? Estou apenas curioso sobre qual foi a correção.

5 curtidas

@tobiaseigen @dan acho que encontrei o PR FIX: Do not increase invite count for current user by udan11 · Pull Request #15952 · discourse/discourse · GitHub

4 curtidas

Reaberto a pedido de @not-ethan. Houve alguma regressão?

1 curtida

Após alguns testes adicionais, estou experimentando isso apenas no Replit Ask:


Mas não aqui no meta ou em outro fórum, tudo o que diz é que Ethan aceitou seu convite, mas não concede os emblemas.

1 curtida

Não se preocupe, eu já consegui os emblemas aqui no meta e naquele outro fórum. Levou tipo 12 horas.

3 curtidas

Confirmo.

1 curtida

Olá pessoal,

há um bug em que você pode criar um código de convite e resgatá-lo você mesmo, fazendo isso você pode obter os emblemas de convite, o que é irritante. Isso foi mencionado por @not-ethan e um pull request foi feito, mas o bug ainda está ativo. Minha ideia era se alguém usasse um código de convite para a web, mas essa pessoa estivesse logada, o código falhasse!

2 curtidas

Obrigado por levantar isso novamente, Urias. Estamos tentando não mexer muito no sistema de convites no momento, porque ele é complexo e fazer alterações pode ter consequências não intencionais e não planejadas.

Existe alguma maneira de contornar esse problema mudando a forma como o distintivo é concedido? Por exemplo, se a pessoa que resgata o convite já é membro, não conceder o distintivo de “campaigner” à pessoa que criou o convite?

Isso me parece um problema que provavelmente existe há muito tempo e passou despercebido. Outra resposta seria tratar isso como “não fazer nada, funciona como projetado” e deixar para os moderadores da comunidade resolverem se estiverem preocupados com pessoas abusando desse método para obter mais distintivos.

4 curtidas

Meu SQL provavelmente precisa ser verificado :slightly_smiling_face:, mas acredito que você poderia adicionar esta linha à consulta do distintivo para impedir que ele seja concedido a pessoas que se convidaram - AND i.invited_by_id <> u2.id

Então, algo como isto:

SELECT u.id user_id, current_timestamp granted_at 
FROM users u 
WHERE u.id IN (
  SELECT invited_by_id 
  FROM invites i 
  JOIN invited_users iu ON iu.invite_id = i.id 
  JOIN users u2 ON u2.id = iu.user_id 
  WHERE i.deleted_at IS NULL
  AND i.invited_by_id <> u2.id
  AND u2.active 
  AND u2.trust_level >= 0 
  AND u2.silenced_till IS NULL 
  GROUP BY invited_by_id 
  HAVING COUNT(*) >= 1 
) AND u.active AND u.silenced_till IS NULL AND u.id > 0 AND
(:backfill OR u.id IN (:user_ids) ) 

4 curtidas

Legal! Faz tempo que não mexo no sistema de badges, mas olhando agora, não vejo os badges relacionados a convites na interface de admin de badges. Talvez sejam badges do sistema que precisam ser editados no core do Discourse?

2 curtidas