2017-10-19 4 views
1

J'essaye de créer une commande qui renvoie le nombre de membres de guilde qui jouent actuellement un jeu spécifié.Discord.NET Utilisateurs jouant le même jeu

Exemple (! Est mon préfixe):! Jouer League of Legends.

S'il y a 5 membres jouent League of Legends, sortie:

There are 5 users currently playing League of Legends.

Je mis en place ce qui suit, de débogage, j'ai pu ramasser que v.Game.toString() retourne la chaîne correcte, mais pour une raison quelconque si l'instruction ne se déclenche pas. Il attrape également une exception qui est levée lorsque les membres ne jouent pas à un jeu (j'ai supposé que c'est nul?), Y a-t-il une solution de contournement pour cela? Pourquoi cela ne compte-t-il pas combien de membres jouent à un certain jeu?

[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 + "."); 
     } 
    } 

C'est l'exception:

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 --- 

Pic où instruction if doit déclencher (nom d'utilisateur bloqué pour des raisons de confidentialité):

enter image description here

+0

pouvez-vous l'exception? – aloisdg

+0

@aloisdg Ajout du message d'exception et d'une image de l'endroit où l'instruction if aurait dû être déclenchée. –

+0

Je sais que la chaîne est nulle, car ils ne jouent pas à un jeu donc il n'est pas initialisé. Ma principale préoccupation est que l'instruction if ne déclenche pas, –

Répondre

1

Il n'y a pas besoin d'avoir params string[] s pour le paramètre du jeu. Utilisez simplement l'attribut Remainder.

J'ai aussi simplifié ce code beaucoup:

[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); 
    } 
+0

Ceci est élégant, en utilisant Linq. Comment pourrais-je créer une liste de ces x noms de membres afin d'afficher une liste de joueurs après la phrase? –

+1

Vous pouvez également obtenir le nombre de 'UserList' au lieu d'avoir une variable totalement différente. – Unknown