我一直在尝试使用 Discord.net 为 Discord 制作自己的机器人,但它并没有像我想象的那样工作。输入 .set params 后,机器人应该删除我所有当前的角色并分配我在命令参数中指定的新角色。如果只发送 .set ,bot 应该再次删除我当前的所有角色,并将服务器中除托管角色之外的所有可能角色分配为每个人的角色。问题是,当我从 0 个角色开始时,分配新角色可以正常工作,但是在发送新的 .set params 命令后,分配的角色不会删除 -> 实际上它仅适用于角色在发送这个命令之前我已经分配了。 这是代码
public class SetModule : ModuleBase<SocketCommandContext>
{
[Command("set")]
[Summary("Sets the roles")]
[RequireOwner]
public async Task SetAsync(params string[] roles)
{
await Context.Channel.DeleteMessageAsync(Context.Message.Id);
var user = ((SocketGuildUser)Context.User);
await UnsetRolesAsync(user);
if (roles.Length == 0)
{
await SetRolesAsync(user);
}
else
{
await SetRolesAsync(user, roles);
}
}
private async Task UnsetRolesAsync(SocketGuildUser user)
{
var roles = user.Roles;
foreach (var role in roles)
{
await ReplyAsync(role.Name); //check the collection for roles
if (!role.IsEveryone)
{
await user.RemoveRoleAsync(role);
}
}
}
private async Task SetRolesAsync(IGuildUser user)
{
var guildRoles = Context.Guild.Roles;
foreach (var role in guildRoles)
{
if (!role.IsEveryone && !role.IsManaged)
{
await user.AddRoleAsync(role);
}
}
}
private async Task SetRolesAsync(IGuildUser user, string[] roles)
{
var guildRoles = Context.Guild.Roles;
foreach (var guildRole in guildRoles)
{
foreach (var role in roles)
{
if (guildRole.Name == role)
{
await user.AddRoleAsync(guildRole);
}
}
}
}
}
}
问题似乎是 UnsetRolesAsync()
方法中的用户角色集合不会自行更新。如果我使用 Context.Guild.Roles,一切正常,但我想通过迭代较小的集合来节省一些时间(如果用户只有 1 个角色,则无需迭代包含 20 个项目的槽集合)。你知道我怎样才能让它在收集用户角色的情况下运行良好?