Пользователи Discord.NET, играющие в одну и ту же игру

Я пытаюсь создать команду, которая возвращает количество членов гильдии, которые в данный момент играют в указанную игру.

Пример (! — мой префикс): !играть в League of Legends.

Если в League of Legends играют 5 участников, выведите:

There are 5 users currently playing League of Legends.

Я установил следующее: из отладки я смог понять, что v.Game.toString() возвращает правильную строку, но по какой-то причине оператор if не срабатывает. Он также перехватывает исключение, которое выдается всякий раз, когда участники не играют в игру (я предположил, что оно равно нулю?). Есть ли обходной путь для этого? Почему не учитывается количество участников, играющих в определенную игру?

[Command("playing")]
    public async Task playingGame(params string[] s)
    {
        string gameName = "";
        int count = 0;

        for (int i = 0; i < s.Length; i++)
        {
            gameName += s[i] + " ";
        }

        await Context.Channel.SendMessageAsync("Looking for: " + gameName);

        var u = Context.Guild.Users;
         foreach (var v in u)
         {
            await Context.Channel.SendMessageAsync("v = " + v.ToString());
            try
            {
                await Context.Channel.SendMessageAsync(v.Game.ToString());
                if (v.Game.ToString().ToLower().Equals(gameName.ToLower()))
                {
                    count++;
                    await Context.Channel.SendMessageAsync("Found match, count = " + count);
                }
            }
            catch (Exception x)
            {
                await Context.Channel.SendMessageAsync("Exception throw caught");
            }
         }

        if (count > 1) {
            await Context.Channel.SendMessageAsync("There are " + count + " users currently playing " + gameName + ".");
        }
        else if (count == 1)
        {
            await Context.Channel.SendMessageAsync("There is " + count + " user currently playing " + gameName + ".");
        }
        else if (count == 0)
        {
            await Context.Channel.SendMessageAsync("No one is currently playing " + gameName + ".");
        }
    }

Это исключение:

System.ArgumentException: Argument cannot be blank
Parameter name: Content
at Discord.Preconditions.NotNullOrEmpty(String obj, String name, String msg)
at Discord.API.DiscordRestApiClient.<CreateMessageAsync>d__77.MoveNext()
--- End of stack trace from previous location where exception was thrown ---

Изображение того, где должен срабатывать оператор if (имя пользователя заблокировано по соображениям конфиденциальности):

введите здесь описание изображения


person Alex Diamond    schedule 19.10.2017    source источник
comment
Вы можете поделиться исключением?   -  person aloisdg    schedule 20.10.2017
comment
@aloisdg Добавлено сообщение об исключении и изображение того, где должен был срабатывать оператор if.   -  person Alex Diamond    schedule 20.10.2017
comment
Я знаю, что строка равна нулю, потому что они не играют в игру, поэтому она не инициализирована. Меня больше всего беспокоит то, что оператор if не срабатывает,   -  person Alex Diamond    schedule 20.10.2017


Ответы (1)


Нет необходимости иметь params string[] s для игрового параметра. Просто используйте атрибут Remainder.

Я также упростил этот код намного:

    [Command("playing")]
    public async Task GetUsersPlaying([Remainder]string game)
    {
        await Context.Message.DeleteAsync();

        var users = Context.Guild.Users.Where(x => x.Game.ToString() == game).Distinct().Select(x => x.Username);
        var count = users.Count();

        var SeparatedList = string.Join(", ", users);

        string message;
        if (count > 1)
            message = $"There are {count} users playing {game}. [{SeparatedList}]";
        else if (count == 1)
           message = $"There is {count} user playing {game}. [{SeparatedList}]";
        else
            message = $"There is no one playing {game}.";

        await  Context.Channel.SendMessageAsync(message);
    }
person Unknown    schedule 20.10.2017
comment
Это элегантно, используя Linq. Как мне создать список этих x имен участников, чтобы отобразить список игроков после предложения? - person Alex Diamond; 20.10.2017
comment
Вы также можете получить счет из UserList вместо того, чтобы иметь совершенно другую переменную. - person Unknown; 20.10.2017