我的Discord Bot不会接受用户作为命令参数

时间:2018-08-17 19:49:57

标签: c# parameters discord discord.net

我目前正在使用Discord机器人来学习如何编写代码。我以为我记不起了,但是当我尝试使用以下命令时,它什么也没做:

[Command("ping")]
public async Task Ping(IUser user)
{
  await Context.Channel.SendMessageAsync(user.ToString());
}

它是公共类的一部分,如果我使用其他任何参数类型(例如IChannel,bool,int),它都可以工作。只是这一参数类型。它还不记录任何错误或异常。有什么想法吗?

3 个答案:

答案 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?");
        }
    }
}