최근 2.9.0beta2 버전에서 이미 계정이 있는 사용자가 초대 링크를 클릭할 수 있습니다. 하지만 제가 생성한 초대 링크를 클릭했을 때 '자기 자신을 초대했습니다’라는 메시지가 표시되었습니다. 저는 TL2+ 등급이므로 제 초대 링크 5개를 클릭한 결과 Champion 배지를 받았습니다. 아래에 해당 내용을 보여주는 스크린샷을 첨부했습니다. 이 문제들은 Replit EDU 포럼에서 확인할 수 있으며, 제 프로필은 여기에서 볼 수 있습니다.
초대 코드를 생성한 후 본인이 직접 사용(리딤)할 수 있는 버그가 있습니다. 이렇게 하면 초대 배지를 받을 수 있는데, 꽤 짜증나는 문제입니다. @not-ethan 님이 이 문제를 언급했고 풀 리퀘스트도 제출되었지만, 아직 버그가 활성화되어 있습니다. 제 아이디어는 웹에서 초대 코드를 사용할 때, 해당 사용자가 이미 로그인되어 있다면 코드를 실패 처리하는 것입니다!
다시 이 문제를 언급해 주셔서 감사합니다, Urias. 현재 초대 시스템에 크게 손을 대고 싶지 않은 이유는 시스템이 복잡하고, 변경 사항이 의도치 않았거나 계획되지 않은 결과를 초래할 수 있기 때문입니다.
배지 수여 방식을 변경하여 이 문제를 우회할 수 있는 방법이 있을까요? 예를 들어, 초대를 사용(redeem)하는 사람이 이미 회원이라면, 초대를 생성한 사람에게 캠페이너 배지를 수여하지 않는 방식입니다.
제 생각에는 이 문제가 오랫동안 존재해 왔지만 주목받지 못했을 가능성이 높습니다. 다른 해결책으로는 이를 "아무것도 하지 않는다, 설계대로 작동한다"고 판단하고, 이 방법으로 배지를 더 많이 얻으려는 행위를 우려하는 경우 커뮤니티 관리자에게 대응을 맡기는 것도 방법입니다.
제 SQL이 점검이 필요할 수도 있습니다 , 하지만 이 줄을 배지 쿼리에 추가하면 자신 자신을 초대하는 사람들에게 배지가 부여되지 않도록 할 수 있다고 생각합니다 - 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) )