Значки приглашения за приглашение самого себя

Описание и доказательства

Недавно в версии 2.9.0beta2 пользователи, у которых уже есть аккаунт, могут переходить по ссылкам-приглашениям. Однако я сгенерировал ссылки-приглашения, перешел по ним, и система сообщила, что я пригласил самого себя. Поскольку я имею уровень TL2+ и перешел по 5 разным ссылкам-приглашениям, созданным мной, я получил значок «Чемпион». Ниже приведён скриншот, подтверждающий это. Эти события произошли на форуме Replit EDU, а мой профиль можно посмотреть здесь.

Я также создал ссылку-приглашение на форуме Codecademy, где система также сообщила, что я пригласил самого себя, как показано ниже. Мой профиль можно посмотреть здесь.

Шаги для воспроизведения

Достигните уровня TL2+ (по умолчанию), создайте ссылки-приглашения и перейдите по ним. На вашем профиле появится сообщение о том, что вы пригласили сами себя и приняли своё приглашение, как показано выше. Если вы создадите достаточно ссылок-приглашений, вы получите значки «Кампейнер» и «Чемпион».

4 лайка

У меня тоже работает. Теперь в моем профиле указано, что я пригласил сам себя.

6 лайков

И вы должны получить значок промоутера. (Забыл упомянуть об этом в оригинальном посте, так как он у меня уже был до этого.)

2 лайка

Спасибо, что указали на это! При разработке этой функции я забыл думать как злодей. :supervillain:

@dan, есть ли у вас какие-то идеи, как решить эту проблему?

6 лайков

Лично я никогда не смотрел код Discourse, но что-то подобное могло бы сработать. (это на JS, потому что я знаю его лучше всего)

if (inviter != invitee) {
  inviter_count++
}
3 лайка

Эта ошибка теперь исправлена. Ещё раз спасибо @not-ethan за сообщение о ней! Если вы заметите какие-либо проблемы с системой приглашений, обязательно сообщите нам. Мы активно работаем над этим.

5 лайков

Возобновляю обсуждение, так как получил личное сообщение от @not-ethan, которое я упустил из виду. @dan, если это не слишком хлопотно, не могли бы вы помочь?

Можете дать ссылку на коммит или PR с исправлением? Мне просто интересно, в чём заключалось исправление.

5 лайков

@tobiaseigen @dan, думаю, я нашел PR FIX: Do not increase invite count for current user by udan11 · Pull Request #15952 · discourse/discourse · GitHub

4 лайка

Восстановлено по запросу @not-ethan. Не произошло ли каким-то образом регрессии?

1 лайк

После дополнительных тестов я столкнулся с этим только в Replit Ask:


Здесь же в Meta или на другом форуме такого нет — там просто написано «Ethan принял ваше приглашение», но значки не выдаются.

1 лайк

Ничего страшного, я только что получил значки здесь, в Meta, и на том другом форуме. Это заняло около 12 часов, хотя.

3 лайка

Могу подтвердить.

1 лайк

Всем привет,

есть баг, позволяющий создать код приглашения и активировать его самому. Из-за этого можно получить значки приглашения, что очень раздражает. Об этом упоминал @not-ethan, и был создан pull request, но баг всё ещё активен. Моя идея: если кто-то использует код приглашения через веб, но при этом уже авторизован, код должен не сработать!

2 лайка

Спасибо, что подняли этот вопрос снова, Уриас. В данный момент мы стараемся не вносить изменений в систему приглашений, так как она сложна, и любые правки могут привести к непредвиденным и незапланированным последствиям.

Есть ли способ обойти эту проблему, изменив условия выдачи значка? Например, если человек, использующий приглашение, уже является участником, не выдавать значок кампании тому, кто создал приглашение?

Мне кажется, это проблема, которая, вероятно, существовала давно и оставалась незамеченной. Другой вариант — считать это «работой по замыслу» (do nothing, works by design) и оставить решение вопроса на усмотрение модераторов сообщества, если они обеспокоены тем, что люди злоупотребляют этим методом для получения большего количества значков.

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 лайка

Круто! Я давно не работал с системой значков, но сейчас, глядя на интерфейс администратора в разделе «Значки», я не вижу значков, связанных с приглашениями. Возможно, это системные значки, которые нужно редактировать в ядре Discourse?

2 лайка