자기초대로 받는 초대 배지

설명 및 증거

최근 2.9.0beta2 버전에서 이미 계정이 있는 사용자가 초대 링크를 클릭할 수 있습니다. 하지만 제가 생성한 초대 링크를 클릭했을 때 '자기 자신을 초대했습니다’라는 메시지가 표시되었습니다. 저는 TL2+ 등급이므로 제 초대 링크 5개를 클릭한 결과 Champion 배지를 받았습니다. 아래에 해당 내용을 보여주는 스크린샷을 첨부했습니다. 이 문제들은 Replit EDU 포럼에서 확인할 수 있으며, 제 프로필은 여기에서 볼 수 있습니다.

또한 Codecademy 포럼에서도 초대 링크를 생성했는데, 여기에서도 '자기 자신을 초대했습니다’라고 표시됩니다. 아래에서 확인할 수 있습니다. 제 프로필은 여기에서 볼 수 있습니다.

재현 방법

기본 설정으로 TL2+ 등급에 도달한 후, 생성한 초대 링크를 클릭합니다. 프로필에 '자기 자신을 초대했습니다’라고 표시되고, 위와 같이 초대를 수락한 것으로 기록됩니다. 충분한 수의 초대 링크를 클릭하면 Campaigner와 Champion 배지를 받게 됩니다.

4개의 좋아요

저한테도 잘 작동합니다. 이제 제 프로필에는 제가 저를 초대했다는 내용이 표시되네요.

6개의 좋아요

그리고 프로모터 배지를 받게 됩니다. (이전에 이미 가지고 있었기 때문에 원글에서 언급을 깜빡했습니다)

2개의 좋아요

이 문제를 짚어주셔서 감사합니다! 이 기능을 설계할 때 악의적인 사용자의 관점에서 생각하지 못한 실수를 했습니다. :supervillain:

@dan 이 문제를 해결하는 방법에 대해 의견이 있으신가요?

6개의 좋아요

개인적으로는 discourse의 코드를 직접 본 적은 없지만, 이런 방식이 작동할 수 있을 것 같습니다. (제가 가장 잘 아는 언어인 JS로 작성했습니다)

if (invter != invitee) {
  inviter_count++
}
3개의 좋아요

해당 버그는 이제 수정되었습니다. 보고해 주신 @not-ethan 님, 다시 한번 감사드립니다. 초대 시스템에서 이상한 점을 발견하시면 알려 주세요. 현재 적극적으로 수정 작업을 진행 중입니다.

5개의 좋아요

@not-ethan에게서 연락을 놓친 DM을 받아 다시 열었습니다. @dan, 너무 번거롭지 않다면 도움을 주실 수 있을까요?

수정 사항에 대한 커밋이나 PR 링크를 받을 수 있을까요? 수정 내용이 무엇이었는지 궁금해서요.

5개의 좋아요

@tobiaseigen @dan 이 PR을 찾은 것 같아요: FIX: Do not increase invite count for current user - Pull Request #15952 - discourse/discourse - GitHub

4개의 좋아요

@not-ethan의 요청으로 다시 열었습니다. 어딘가에 회귀 문제가 생긴 건가요?

1개의 좋아요

추가 테스트를 해본 결과, 이 문제는 Replit Ask에서만 발생하고 있습니다:


하지만 여기 메타나 다른 포럼에서는 Ethan accepted your invitation라고만 표시되고 배지는 부여되지 않습니다.

1개의 좋아요

아니면 말고, 여기 메타와 다른 포럼에서 배지를 받았습니다. 생각보다 12시간 정도 걸렸네요.

3개의 좋아요

확인했습니다.

1개의 좋아요

여러분 안녕하세요,

초대 코드를 생성한 후 본인이 직접 사용(리딤)할 수 있는 버그가 있습니다. 이렇게 하면 초대 배지를 받을 수 있는데, 꽤 짜증나는 문제입니다. @not-ethan 님이 이 문제를 언급했고 풀 리퀘스트도 제출되었지만, 아직 버그가 활성화되어 있습니다. 제 아이디어는 웹에서 초대 코드를 사용할 때, 해당 사용자가 이미 로그인되어 있다면 코드를 실패 처리하는 것입니다!

2개의 좋아요

다시 이 문제를 언급해 주셔서 감사합니다, Urias. 현재 초대 시스템에 크게 손을 대고 싶지 않은 이유는 시스템이 복잡하고, 변경 사항이 의도치 않았거나 계획되지 않은 결과를 초래할 수 있기 때문입니다.

배지 수여 방식을 변경하여 이 문제를 우회할 수 있는 방법이 있을까요? 예를 들어, 초대를 사용(redeem)하는 사람이 이미 회원이라면, 초대를 생성한 사람에게 캠페이너 배지를 수여하지 않는 방식입니다.

제 생각에는 이 문제가 오랫동안 존재해 왔지만 주목받지 못했을 가능성이 높습니다. 다른 해결책으로는 이를 "아무것도 하지 않는다, 설계대로 작동한다"고 판단하고, 이 방법으로 배지를 더 많이 얻으려는 행위를 우려하는 경우 커뮤니티 관리자에게 대응을 맡기는 것도 방법입니다.

4개의 좋아요

제 SQL이 점검이 필요할 수도 있습니다 :slightly_smiling_face:, 하지만 이 줄을 배지 쿼리에 추가하면 자신 자신을 초대하는 사람들에게 배지가 부여되지 않도록 할 수 있다고 생각합니다 - AND i.invited_by_id <> u2.id

즉, 다음과 같은 형태가 될 것입니다:

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개의 좋아요

좋아요! 배지 시스템을 꽤 오래 만지지 않아서, 지금 확인해보니 관리자 > 배지 UI에서 초대 관련 배지를 찾을 수 없네요. 아마도 코어 디스커스에서 수정해야 하는 시스템 배지인 것 같습니다.

2개의 좋아요