邀请自己获得邀请徽章

描述和证据

最近在 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 个赞

此 bug 现已修复。再次感谢 @not-ethan 报告此问题!如果您发现邀请系统有任何问题,请告知我们。我们正在积极处理。

5 个赞

由于我错过了 @not-ethan 发送的私信,因此重新打开此问题。@dan 如果不麻烦的话,您能帮忙吗?

我可以获取修复的 commit 或 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 个赞

嘿各位,

有一个 bug,可以让你创建邀请码并自己兑换,这样你就可以获得邀请徽章,这很烦人。@not-ethan 提到了这一点,并且提交了一个拉取请求,但该 bug 仍然存在。我的想法是,如果有人在登录状态下使用邀请码访问网页,那么让该邀请码失效!

2 个赞

感谢您再次提出这个问题,Urias。我们目前正试图尽量不触碰邀请系统,因为它很复杂,进行更改可能会产生意想不到的后果。

我们能否通过更改徽章的授予方式来绕过这个问题?例如,如果兑换邀请的人已经是会员,则不将活动家徽章授予创建邀请的人?

在我看来,这个问题可能长期存在但未被注意到。另一种方法是将其视为“不做任何事,按设计工作”,并由社区版主处理,如果他们担心有人滥用此方法来获得更多徽章。

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 个赞