Недавно в версии 2.9.0beta2 пользователи, у которых уже есть аккаунт, могут переходить по ссылкам-приглашениям. Однако я сгенерировал ссылки-приглашения, перешел по ним, и система сообщила, что я пригласил самого себя. Поскольку я имею уровень TL2+ и перешел по 5 разным ссылкам-приглашениям, созданным мной, я получил значок «Чемпион». Ниже приведён скриншот, подтверждающий это. Эти события произошли на форуме Replit EDU, а мой профиль можно посмотреть здесь.
Я также создал ссылку-приглашение на форуме Codecademy, где система также сообщила, что я пригласил самого себя, как показано ниже. Мой профиль можно посмотреть здесь.
Достигните уровня TL2+ (по умолчанию), создайте ссылки-приглашения и перейдите по ним. На вашем профиле появится сообщение о том, что вы пригласили сами себя и приняли своё приглашение, как показано выше. Если вы создадите достаточно ссылок-приглашений, вы получите значки «Кампейнер» и «Чемпион».
Эта ошибка теперь исправлена. Ещё раз спасибо @not-ethan за сообщение о ней! Если вы заметите какие-либо проблемы с системой приглашений, обязательно сообщите нам. Мы активно работаем над этим.
Возобновляю обсуждение, так как получил личное сообщение от @not-ethan, которое я упустил из виду. @dan, если это не слишком хлопотно, не могли бы вы помочь?
Можете дать ссылку на коммит или PR с исправлением? Мне просто интересно, в чём заключалось исправление.
есть баг, позволяющий создать код приглашения и активировать его самому. Из-за этого можно получить значки приглашения, что очень раздражает. Об этом упоминал @not-ethan, и был создан pull request, но баг всё ещё активен. Моя идея: если кто-то использует код приглашения через веб, но при этом уже авторизован, код должен не сработать!
Спасибо, что подняли этот вопрос снова, Уриас. В данный момент мы стараемся не вносить изменений в систему приглашений, так как она сложна, и любые правки могут привести к непредвиденным и незапланированным последствиям.
Есть ли способ обойти эту проблему, изменив условия выдачи значка? Например, если человек, использующий приглашение, уже является участником, не выдавать значок кампании тому, кто создал приглашение?
Мне кажется, это проблема, которая, вероятно, существовала давно и оставалась незамеченной. Другой вариант — считать это «работой по замыслу» (do nothing, works by design) и оставить решение вопроса на усмотрение модераторов сообщества, если они обеспокоены тем, что люди злоупотребляют этим методом для получения большего количества значков.
Мой 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) )
Круто! Я давно не работал с системой значков, но сейчас, глядя на интерфейс администратора в разделе «Значки», я не вижу значков, связанных с приглашениями. Возможно, это системные значки, которые нужно редактировать в ядре Discourse?