我一直在尝试通过C#中的discord bot创建命令,允许人们更改其他用户的昵称,然后向管理员发送PM报告用户的昵称已更改以及谁负责更改名称。除了实际的昵称改变之外,一切正常。我试图用来完成这个的代码是
userBeingChanged.Nickname = newName;
但它说我不能这样做,因为它是只读的。有没有人知道改变用户昵称的另一种方法?
编辑:我只是试图更改昵称而不是用户名,并且有问题的机器人确实具有管理员权限。上面的代码没有编译,我问是否有另一种方法可以做到。
感谢。
答案 0 :(得分:1)
很可能看起来像这样。
await userBeingChanged.Edit(nickname: newName).ConfigureAwait(false);
不确定您正在使用哪个版本,但这是一个示例。
cmd.CreateCommand("setnick")
.Description("Changes, or sets, the nickname of the specified user.")
.Parameter("user")
.Parameter("newname", ParameterType.Unparsed)
.Do(async (e) =>
{
var user = e.Channel.FindUsers(e.GetArg("user")).FirstOrDefault();
string newname = e.GetArg("newname");
await user.Edit(nickname: newname).ConfigureAwait(false);
});
我为你写了这个,但我希望你能理解它是如何工作的,如果你用另一个具有类似功能的命令。
我们正在为命令user
和newname
添加两个参数。 newname
未解析的原因user
不是user
,因为在user
中您可以提及用户,或以纯文本格式编写。但是,newname
不能包含空格,因此最好的选择是提及用户是否包含空格,或者复制粘贴其当前显示名称。 e.GetArg()
未解析,因为可以包含空格。
您不能在一个命令中拥有两个未解析的参数,因为只有第一个参数将被赋予一个值,无论您的消息长度如何,它都将无法访问。
请记住,如果您要更改昵称,用户需要在线。
我将举例说明cmd.CreateCommand("say")
.Parameter("msg", ParameterType.Unparsed)
.Do(async (e) =>
{
string message = e.GetArg("msg");
await e.Channel.SendMessage(message);
});
的工作原理。写一个简单的命令让机器人说出你告诉它的任何内容。
!say Hello, this works.
用法:public Message append(String test) {
astring += test;
return this;
}
,会让机器人说 Hello,这样可行。。当然,参数必须被解析,因为消息包含空格。如果您有任何疑问,请随时提出。
答案 1 :(得分:0)
机器人应该需要“管理昵称”权限或“管理员”权限才能更改服务器上某人的昵称。
请注意,这只允许您更改服务器上此人的昵称,而不是全球不和谐名称。
这个问题可能源于那里,因为机器人试图做一些不允许这样做的事情。
答案 2 :(得分:0)
这应该有效。
[Command("nick")]
[Description("Change a user's nickname")]
public async Task NicknameSet(CommandContext ctx, [Description("Nickname to change")] DiscordMember user, [Description("New name")] string nickname)
{
DiscordMember discordMember = user;
var oldNick = discordMember.Nickname;
await ctx.TriggerTypingAsync();
try
{
await discordMember.ModifyAsync(x => x.Nickname = nickname);
var newNick = discordMember.Nickname;
await ctx.Channel.SendMessageAsync($"{ctx.Member.Username} changed {oldNick}'s nickname to: {newNick}.").ConfigureAwait(false);
newNick = "";
}
catch (Exception e)
{
await ctx.Channel.SendMessageAsync
($"An error occured: {e}").ConfigureAwait(false);
}
}