2017-03-09 22 views
1

私はDiscrodサーバー用の独自のボットを作成しています。これまでのところ、チャットに「ロール」のようなコマンドを与えて、チャットに「あなたは6つもロールした」というボットキャッチを返すようにしました。Discord:ユーザーからボットへの直接メッセージを取得する方法は?

client.UsingCommands(input => { input.PrefixChar = '!' }); 
command.CreateCommand("roll").Do(async (e) => { 
    await channel.SendMessage(username + " rolls " + rng.Next(1, 7)) }); 

しかし、私は人がチャットにコマンドを入力する方法を嫌うため、いつかは混乱するかもしれません。私は、ユーザからボットへの直接メッセージでコマンドを呼び出す可能性を作りたいと思っています。 DMボットは "ロール"し、チャットに "andrew rolled 1"というチャットを書きます。

しかし、私はそれをどうやって行うのか、それが可能であれば考えていません。何か案は?

+0

あなたはボットがコマンドメッセージを削除することができます。 – Pipe

+0

はい、直接メッセージの回答が見つからない場合は、解決策として考えていました。私は依然として直接メッセージソリューションを好むが、ボットが直接メッセージで応答してチャネルスパムを回避したい場合があるためです。建設的な返信をありがとう! – Andrew

答えて

2

一つの解決策は、ちょうどあなたがコマンドサービスのセットアップ以下このデリゲート/ EventHandlerのコードを配置してください/のEventHandler

var client = new DiscordClient(); 
     client.MessageCreated += (s, e) => 
      { 
       if (!e.Message.IsAuthor && e.Message.ToLower().Contains("roll")){ 
/*Code here*/ 
}  
      } 
      EventHandler<MessageEventArgs> handler = new EventHandler<MessageEventArgs>(HandleMessageCreated); 
      client.MessageCreated += handler; 

デリゲートを使用して、することができボットないダブルポスト誰かが !rollを行います。
また、チャネルObjectで変数 IsPrivateを使用すると、チャネルで送信されたメッセージがDM/PMチャネルであるかどうかを確認できます。

Discord.NET v0.9.6のドキュメントが必要な場合は、hereです。

また、Discord.NET v1.0.0 +を代わりに使用することもできます。

1

私がオンラインで見つけた現在の回答はイライラしていました。これは私がやった方法です(「文脈」の人々が言っ​​ている、または「IsPrivate」への参照が見つかりませんでした)。オブジェクトそのものを調べるだけで、このことを理解しなければならなかった。

ソースに応じて、SocketMessage.ChannelプロパティがSocketTextChannelからSocketDMChannelに変更されているようです。以下は、メッセージがDMであるかどうかを判断する方法です。

private bool IsPrivateMessage(SocketMessage msg) { 
    return (msg.Channel.GetType() == typeof(SocketDMChannel)); 
} 

希望これは、誰かが、これは私を無駄に5時間を節約することができます:)

関連する問題