2017-10-19 10 views
1

現在、指定したゲームをプレイしているギルドメンバーの数を返すコマンドを作成しようとしています。Discord.NET同じゲームをプレイしているユーザー

例(!は私のプレフィックスです):!playing 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 --- 

の画像(プリ画像)ステートメントは、(ユーザ名は、プライバシー上の理由でブロックされた)トリガする場合:

enter image description here

+0

あなたは例外を共有することができます。

また、私はこのコードたくさん簡素化していますか? – aloisdg

+0

@aloisdg例外メッセージと、if文がトリガされるべき場所のピクチャを追加しました。 –

+0

文字列がnullであることはわかっています。ゲームをプレイしていないので、初期化されていません。私の主な関心事は、if文がトリガされていないということです。 –

答えて

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

これはLinqを使ってエレガントです。文章の後に選手のリストを表示するために、xメンバー名のリストを作成するにはどうすればいいですか? –

+1

全く異なる変数を持つ代わりに、 'UserList'からカウントを得ることもできます。 – Unknown

関連する問題