Discord.net отправляет прямое сообщение (PM) указанному пользователю

Я здесь новичок, поэтому не судите меня, я хочу создать команду! Poke, которая отправляет прямое сообщение (PM) указанному пользователю, но я не могу найти способ передать ему идентификатор пользователя, а документация практически не существует для discord.net.

        commands.CreateCommand("poke")
            .Parameter("target")
            .Do(async (e) =>
            {
                ulong userID = e.User.Id;
                Console.WriteLine("[" + e.Server.Name + "]" + e.User.Name + " just poked " + e.GetArg("target"));
                await e.User.SendMessage("HEY, wake up! ");
            });

person Diceon    schedule 12.05.2017    source источник


Ответы (3)


Есть несколько способов сделать это, во-первых, создать частный канал с помощью команды:

                var c = discord.CreatePrivateChannel(ulong userid);

и отправив из него сообщение вот так:

                await c.SendMessage("blabla");

и другой способ - сохранить пользователя как объект, а затем отправить сообщение от него.

                User u = null;
                string findUser = e.GetArg("target");

                        u = e.Message.MentionedUsers.FirstOrDefault(); //checking mentioned users
                        u = e.Server.FindUsers(findUser).FirstOrDefault(); //looking for specified user in server

                await u.SendMessage("HEY, wake up! ");

Моя команда выглядит так:

        commands.CreateCommand("poke")
            .Parameter("target", ParameterType.Required)
            .Do(async (e) =>
            {
                ulong id;
                User u = null;
                string findUser = e.Args[0];

                if (!string.IsNullOrWhiteSpace(findUser))
                {
                    if (e.Message.MentionedUsers.Count() == 1)
                        u = e.Message.MentionedUsers.FirstOrDefault();
                    else if (e.Server.FindUsers(findUser).Any())
                        u = e.Server.FindUsers(findUser).FirstOrDefault();
                    else if (ulong.TryParse(findUser, out id))
                        u = e.Server.GetUser(id);
                }
                Console.WriteLine("[" + e.Server.Name + "]" + e.User.Name + " just poked " + u);
                await u.SendMessage("HEY, wake up! ");
            });
person Diceon    schedule 31.05.2017

Я думаю, что опаздываю, но надеюсь, что это поможет. Это сработало для моего бота.

[Command("Test")]
            public async Task Test(string message)
            {
                if (message== "Send me a message")
                {

                    await Context.User.SendMessageAsync("Here is your DM message! ;)");
                }else
                {
                    await Context.Channel.SendMessageAsync("I can't send you a message");
                }
            }
person Mikel Miras    schedule 23.06.2019
comment
Обратите внимание на то, что SendMessageAsync() является методом расширения (от Discord.UserExtensions в другом ответе), поэтому вам нужен using Discord; для доступа к ним, как в этом ответе. - person Dan Mangiarelli; 11.12.2020

В качестве альтернативы,

var u = Context.Message.Author;  // Or some other means of getting user_id
string msg = "your message";
await Discord.UserExtensions.SendMessageAsync(u, msg);
person Frosh_VII    schedule 06.01.2018