我目前正在使用Discord机器人来学习如何编写代码。我以为我记不起了,但是当我尝试使用以下命令时,它什么也没做:
[Command("ping")]
public async Task Ping(IUser user)
{
await Context.Channel.SendMessageAsync(user.ToString());
}
它是公共类的一部分,如果我使用其他任何参数类型(例如IChannel,bool,int),它都可以工作。只是这一参数类型。它还不记录任何错误或异常。有什么想法吗?
答案 0 :(得分:1)
[Command("ping")]
public async Task Ping(IUser user)
{
await Context.Channel.SendMessageAsync(user.ToString());
}
您的代码ID完美。但是请考虑一下,用户的类型为IUser
,转换为刺痛会使用户变得模糊。而是尝试以下方法:
[Command("ping")]
public async Task Ping(SocketGuildUser user)
{
await Context.Channel.SendMessageAsync(user.Username);
}
如果要ping用户,请尝试user.Mention
。
当我开始学习时,我也造了一个机器人。 Here是源代码。它非常非常非常基本。肯定会有所帮助。
答案 1 :(得分:0)
您可以尝试将这种变通方法用于您的机器人:
public async Task SampleCommand(string user="", [Remainder]string message="")
{
IUser subject = null;
if (user != "")
{
var guilds = (await Context.Client.GetGuildsAsync(Discord.CacheMode.AllowDownload));
var users = new List<IUser>();
foreach (var g in guilds)
users.AddRange(await g.GetUsersAsync(CacheMode.AllowDownload));
users = users.GroupBy(o => o.Id).Select(o => o.First()).ToList();
var search = users.Where(o => o.Username.ToLower().Contains(user.ToLower()) || Context.Message.MentionedUserIds.Contains(o.Id) || o.ToString().ToLower().Contains(user.ToLower())).ToArray();
if (search.Length == 0)
{
await ReplyAsync("***Error!*** *Couldn't find that user.*");
return;
}
else if (search.Length > 1)
{
await ReplyAsync("***Error!*** *Found more than one matching users.*");
return;
}
subject = search.First();
}
// ...
// execute command
或者您可以将其包装在一种方法中,以方便访问和重用。
基本上,它的作用是查找与给定字符串匹配的可用用户(昵称,用户名或提及。如果需要,您还可以使其检查ID)。
编辑:就我而言,我允许人们提及与该机器人共享服务器的任何人,但就您而言,仅使用Context.Guild
并取消该命令(如果出现这种情况可能更有益)。 DM。
答案 2 :(得分:0)
我最终接受了Reynevan的建议,并编写了一种将提及内容转换为IUser的方法。只需致电CustomUserTypereader.GetUser(mention_parameter, Context.Guild);
using System.Threading.Tasks;
using Discord;
public class CustomUserTypereader
{
public static async Task<IUser> GetUserFromString(string s, IGuild server)
{
if (s.IndexOf('@') == -1 || s.Replace("<", "").Replace(">", "").Length != s.Length - 2)
throw new System.Exception("Not a valid user mention.");
string idStr = s.Replace("<", "").Replace(">", "").Replace("@", "");
try
{
ulong id = ulong.Parse(idStr);
return await server.GetUserAsync(id);
}
catch
{
throw new System.Exception("Could not parse User ID. Are you sure the user is still on the server?");
}
}
}