【问题标题】:How to determine if user doesn't contain a role如何确定用户是否不包含角色
【发布时间】:2019-12-17 01:44:20
【问题描述】:

我正在我的 Discord BOT 中处理一些新命令,并试图确定具有管理员角色的用户与具有创始人和管理员角色的用户之间的区别。

如果用户角色仅包含 Admin 而不是 Founder,则它们被归类为“CheckUserIsAdminOnly”。我使用下面的代码当前检查命令的用户是否是管理员,所以我现在尝试调整它以说明用户是否具有“管理员”角色但不包含“创始人”角色。

我觉得我在这里遗漏了一些简单的东西,但我无法弄清楚我的错误

return (fullContextUser.Roles.Where(x => 
x.Name == "Admin" || 
x.Name == "Head Recruiter" && 
x.Name != "Founder").Count() > 0);

当用户具有名为“Admin”和“Founder”的角色时,此代码仍会返回 true

【问题讨论】:

  • 嗨,感谢您的快速响应,这也不起作用,即使我有创始人角色,它仍然返回 true 和类作为管理员
  • 只是一个提示,使用 Any 而不是 Where + Count > 0

标签: c# discord


【解决方案1】:

你缺少括号:

return (fullContextUser.Roles.Where(x => 
(x.Name == "Admin" || 
x.Name == "Head Recruiter") && 
x.Name != "Founder").Count() > 0);

【讨论】:

  • 这样做的目的是什么? x.Name == "Head Recruiter"。如果用户是 Head Recruiter,方法也将返回 true。
  • 这不是问题所在。只要Roles 包含角色Admin,计数将大于0,无论如何-因为单个角色不能同时是AdminFounder。请参阅@NineBerry 的答案。
  • 只有在用户不是创始人的情况下才会大于0。这就是 and 运算符的目的。
  • 不,它不能这样工作,因为您一次只查看一个单独的角色条目。
  • 当然会。假设他是AdminFounder 这两个角色。首先它会检查("Admin" == "Admin" || "Admin" == "Head Recruiter") && "Admin" != "Founder")。结果将是(True || False) && True。这是True。对Founder 的检查将返回False。所以至少有一个角色的检查是True。这在 NineBerry 的回答中也有说明。
【解决方案2】:

Roles 是角色列表。您不能像您一样仅通过查看各个角色及其名称来对列表做出陈述。

Where 中的表达式将应用于列表中的每个单独角色。

检查角色是否存在,然后组合该信息。

bool hasAdminRole = fullContextUser.Roles.Any(x => x.Name == "Admin");
bool hasFounderRole = fullContextUser.Roles.Any(x => x.Name == "Founder");

bool isAdminButNotFounder = hasAdminRole && !hasFounderRole;

【讨论】:

  • 谢谢!,现在您已经指出了这一点,这完全有道理。意味着我可以修复其他不起作用的东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2015-04-24
  • 2014-11-15
相关资源
最近更新 更多