You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人角色判断:如何识别仅含Admin角色的用户

解决Discord机器人角色判断逻辑错误的问题

嘿,我一眼就揪出你代码里的问题啦——这是逻辑运算符优先级在搞鬼!

先给你拆解下原代码的问题:
你的判断表达式是:

x => x.Name == "Admin" || x.Name == "Head Recruiter" && x.Name != "Founder"

因为C#里&&的优先级比||高,所以这段代码实际会被解析成:

x => x.Name == "Admin" || (x.Name == "Head Recruiter" && x.Name != "Founder")

这就意味着,只要用户拥有Admin角色,不管他有没有Founder角色,这个条件都会返回true——完全不符合你想要的“仅Admin/Head Recruiter,无Founder”的要求。

正确的实现思路

我们需要的逻辑是:

  1. 用户必须没有Founder角色
  2. 用户至少拥有Admin或Head Recruiter中的一个角色

基于这个思路,给你两种高效的写法:

写法1:先提取角色集合(推荐,性能更好)

// 先把用户的所有角色名称提取到HashSet里,后续查询更快
var userRoleNames = fullContextUser.Roles.Select(role => role.Name).ToHashSet();

// 核心判断:无Founder,且有Admin或Head Recruiter
return !userRoleNames.Contains("Founder") && 
       (userRoleNames.Contains("Admin") || userRoleNames.Contains("Head Recruiter"));

写法2:用Any直接判断(更简洁)

// 先判断是否有Admin/Head Recruiter,再判断是否没有Founder
return fullContextUser.Roles.Any(r => r.Name == "Admin" || r.Name == "Head Recruiter") &&
       !fullContextUser.Roles.Any(r => r.Name == "Founder");

这里用Any()代替Count() > 0是更好的习惯,因为Any()找到第一个匹配项就会停止遍历,比Count()遍历所有角色更高效。

为什么这个逻辑能解决问题?

我们把“没有Founder”作为整个判断的前置条件,只要用户有Founder角色,不管他有没有Admin,整个表达式都会直接返回false,完美符合你要的“CheckUserIsAdminOnly”的归类要求。

内容的提问来源于stack exchange,提问作者Danny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:35:51