67088


Discord.Netにてプログラミングをしている者です。  
スペースがあってもすべて検索に回せるようなコードがわからず、質問させていただきます。  
語彙力が足らず、どの様な意味かわからない方もいらっしゃるかと思いますため、例としてMusic
BotのRythmの様なものを思い浮かべていただければと思います。

`Ex: !p いきものがかり ありがとう` -> これは"いきものがかり ありがとう"で検索され、その候補が再生されるようになっています。  
ですが↓で採用しているコードでは矢印の通り1つ目の引数にしか対応しないため、too meny parametersでエラーを吐いて終わってしまいます。

これは引数指定を2つにすれば解決する話なのですが、これが3,4,5...と増えていくとコードとして書くのはとても面倒くさいことになってしまうと考えています。  
ですのでどうにかして一つの引数にスペースを含めてすべて変数に代入してしまいたいと考えているのです。

方法をご教授ください。

採用しているコード

[code]

                public async Task Taskname(string search) 
                //                                ↑ここのみにしか対応しないため、スペースを含めるとtoo many parametersとなります
                {
    
                }
    
[/code]

説明が足りておりませんが、よろしくお願いします。


CC BY-SA 4.0
2020-05-28T10:37:50.613
67080
2020-05-28T14:16:14.507
2020-05-28T12:54:31.637
40371
40371
question
c# discord
Discord.netで複数の引数を自由自在に使う方法


コメントで提案していただいた[Remainder]を用いて解決致しました。  
後のためになるかはわかりませんがコードを残しておきます。

[code]

    public async Task Taskname([Remainder]string search) 
                //               ↑これをつけることで入力されたものにスペースがあろうがなかろうが変数に代入してくれる                 
                {
                      await ReplyAsync(search);
                }
    
[/code]

入力が"aiueo kakikukeko" -> "aiueo kakikukeko"とリピートする


CC BY-SA 4.0
2020-05-28T13:09:15.817
67085
2020-05-28T13:09:15.817
40371
67080
answer


もう少し詳しい説明とすれば、以下の記事に3つの方法が書かれています。  
その中の3つ目がパラメータに`[Remainder]`属性を指定しておく、というものです。

[Parameters with
Spaces](https://docs.stillu.cc/guides/commands/intro.html#parameters-with-
spaces)

> To accept a space-separated list, set the parameter to `params Type[]`.
>
> Should a parameter include spaces, the parameter **must** be wrapped in
> quotes. For example, for a command with a parameter `string food`, you would
> execute it with `!favoritefood "Key Lime Pie"`.
>
> If you would like a parameter to parse until the end of a command, flag the
> parameter with the
> [RemainderAttribute](https://docs.stillu.cc/api/Discord.Commands.RemainderAttribute.html).
> This will allow a user to invoke a command without wrapping a parameter in
> quotes.
>
> **スペースのあるパラメータ**  
>  スペースで区切られたリストを受け入れるには、パラメータを`params Type[]`に設定します。
>
> パラメータにスペースが含まれる場合は、パラメータを引用符で囲む **必要があります** 。例えば、パラメータに`string
> food`を指定したコマンドの場合、`!favoritefood "Key Lime Pie"`と実行します。
>
> コマンドの最後まであなたがパラメーターを解析したい場合は、`Remainder
> Attribute`を使用してパラメーターにフラグを立てます。これにより、ユーザーはパラメーターを引用符で囲むことなくコマンドを呼び出すことができます。

1つ目と3つ目がBot側の対処方法ですね。2つ目はBotを呼び出す側の対処となります。

どの方法を選ぶかは作成者の好みでしょうか。  
Bot側で空白を意識していったん区切る処理とかが必要ならば、1つ目の方法にしておくのが良さそうです。  
単にエコーバックやリレー通知するだけなら3つ目でしょうね。

あとこの記事によれば、パラメータの途中に指定すれば、それまでは解析してそれぞれのパラメータに格納し、それ以後は解析せずにひと続きの文字列として扱うということのようです。  
[What does [Remainder] do in the command
signature?](https://gist.github.com/Still34/edf0db32dede055329cebaffdc7a77a3#what-
does-remainder-do-in-the-command-signature)

> The `RemainderAttribute` leaves the string unparsed, meaning you don't have
> to add quotes around the text for the text to be recognized as a single
> object. Please note that if your method has multiple parameters, the
> remainder attribute can only be applied to the last parameter.
>
>
> `RemainderAttribute`は文字列を解析せずに残します。つまり、テキストを単一のオブジェクトとして認識するためにテキストを引用符で囲む必要はありません。
> メソッドに複数のパラメーターがある場合、残りの属性は最後のパラメーターにのみ適用できることに注意してください。


CC BY-SA 4.0
2020-05-28T14:16:14.507
67088
2020-05-28T14:16:14.507
2020-06-17T08:14:45.997
-1
26370
67080
answer