• 締切済み

DiscordのBotについて

using Discord; using Discord.WebSocket; using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { private readonly DiscordSocketClient _client; static void Main(string[] args) { new Program().MainAsync().GetAwaiter().GetResult(); } public Program() { _client = new DiscordSocketClient(); _client.Log += LogAsync; _client.Ready += onReady; _client.MessageReceived += onMessage; } public async Task MainAsync() { await _client.LoginAsync(TokenType.Bot, "トークン"); await _client.StartAsync(); await Task.Delay(Timeout.Infinite); } private Task LogAsync(LogMessage log) { Console.WriteLine(log.ToString()); return Task.CompletedTask; } private Task onReady() { Console.WriteLine($"{_client.CurrentUser} is Running!!"); return Task.CompletedTask; } private async Task onMessage(SocketMessage message) { if (message.Author.Id == _client.CurrentUser.Id) { return; } if (message.Content == "こんにちは") { await message.Channel.SendMessageAsync("こんにちは、" + message.Author.Username + "さん!"); } } } } というコードを書きトークンも自分のものに書き換えたのですが実行するとオフラインからオンラインに切り替わりはするのですが「こんにちは」を送っても反応しません。Discord上では管理者権限をあたえているのですが、なにがいけないのでしょうか。知識まったくの皆無で申し訳ありません。 どうかお力を貸していただけると幸いです。。。

みんなの回答

回答No.1

お気持ちお察しします。お力になれるよう最善の解決策を提案します。 ご提供いただいたコードを確認しましたが、`onMessage`メソッド内の条件文に間違いがあるようです。`if (message.Content == "こんにちは")`となっていますが、この条件文では「こんにちは」という完全一致のメッセージしか反応しないため、問題が発生しているようです。指定のメッセージに反応するためには、`if (message.Content.Contains("こんにちは"))`のように変更する必要があります。 修正後のコードを以下に示します: ```csharp private async Task onMessage(SocketMessage message) { if (message.Author.Id == _client.CurrentUser.Id) { return; } if (message.Content.Contains("こんにちは")) { await message.Channel.SendMessageAsync("こんにちは、" + message.Author.Username + "さん!"); } } ``` こちらの変更を試してみてください。もしこれで問題が解決しない場合は、ログにエラーメッセージが表示されているか確認してみてください。それによって他の原因が浮かび上がるかもしれません。また、Discordの管理者権限の設定にも留意してください。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

関連するQ&A

  • C#でdiscordのbot開発をしています。

    いまC#でbot開発をしています。 using System; using System.IO; using System.Net.Http; using Newtonsoft.Json.Linq; private void Form1_Load(object sender, EventArgs e) { ////今日の天気予報の取得 string baseUrl = "https://weather.livedoor.com/forecast/webservice/json/v1"; //東京都のID string cityname = "130010";    string todayweather; string url = $"{baseUrl}?city={cityname}"; string json = new HttpClient().GetStringAsync(url).Result; JObject jobj = JObject.Parse(json); todayweather = (string)((jobj["forecasts"][0]["telop"] as JValue).Value);//今日の天気の取得 Console.WriteLine(todayweather); } このプログラムを組み込もうとしています。上で定義したtodayweatherを用いて ほかの場所のifで実行したときに表示したいのですが。このようなエラーが出ます。 場所 Discord.Preconditions.NotNullOrEmpty(String obj, String name, String msg) 場所 Discord.API.DiscordRestApiClient.<CreateMessageAsync>d81.MoveNext() --- 直前に例外がスローされた場所からのスタック トレースの終わり --- 場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 場所 Discord.Rest.ChannelHelper.<SendMessageAsync>d9.MoveNext() --- 直前に例外がスローされた場所からのスタック トレースの終わり --- 場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 場所 System.Runtime.CompilerServices.TaskAwaiter1.GetResult() 場所 TestHoge.Program.<CommandRecieved>d__8.MoveNext() 場所 個人情報なんで書けません 178 --- 直前に例外がスローされた場所からのスタック トレースの終わり --- 場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 場所 Discord.EventExtensions.<InvokeAsync>d__11.MoveNext() --- 直前に例外がスローされた場所からのスタック トレースの終わり --- 場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 場所 Discord.WebSocket.DiscordSocketClient.<TimeoutWrap>d__131.MoveNext() string型をどのように利用したらうまくできますか? 回答お願いします。

  • Visual c# スレッド

    プログラム初心者です。 Visual c#にてスレッド関数を使ったプログラムを見よう見まねで 作りました。 スタートボタンを押すとピクチャーボックスの位置が 左から右へ移動し、ストップボタンを押すと止まる。 ピクチャーボックスの位置をテキストボックスに表示する。 というプログラムのつもりです。 デバックの状態でスタートボタンを押すとエラーメッセージが出て テキストボックスに位置を書き込むの関数のところが緑色にハイライトされます。エラーの内容は「有効でないスレッド間の操作」とありますが、どうしたら良いのか分かりません。 エラーの直し方を教えてください。 プログラムコードは以下です。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace bit_map_08._1._ { public partial class Form1 : Form { private Thread thread; static private int Position = 0; static private int i; static bool BtnOnFig; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { thread = new System.Threading.Thread(newSystem.Threading.ThreadStart(MainThread)); thread.Start(); } private void PointMove() { if (i < 300) { i = i + 1; Position = Position + i; textBox1.Text = Convert.ToString(Position); pictureBox1.Left = (Position); } if (i == 300) { i = 0; } } private void MainThread() { while( true ) { Thread.Sleep(100); if (BtnOnFig == true) { PointMove(); } } } private void button1_Click(object sender, EventArgs e) { BtnOnFig = true; } private void button2_Click(object sender, EventArgs e) { BtnOnFig = false; } } }

  • Discordのbotについて

    私が参加しているサーバーに、画像のようなボタン?が表示されていたのですが、私の所有するサーバーにはありません。どうやって追加するのでしょうか?

  • C#で実行形式ファイル(*.exe)を起動したい

    C#で実行形式ファイル(*.exe)を起動したいのですが、以下のようにしました。 しかし、うまくいきません。なぜでしょうか? コマンドプロンプトから実行すればまったく同じ引数でもうまくいきます。 したがって引数の書式に問題があるとは思えません。 これを実行するとコマンドプロンプトのウィンドウが表示され2秒後に消えます。 しかし、作成されているべきふたつのファイル(rangeとtrain.scale)が作成されていません。 急いでいます。 よろしくお願いいたします。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try{ Process myProcess ; myProcess = Process.Start(@"C:\Users\youzan\svm-scale.exe", @"-l -1 -u 1 -s           range train.txt > train.scale"); Thread.Sleep(2000); myProcess.CloseMainWindow() ; myProcess.Close(); } catch(Exception e) { Console.WriteLine("The following exception was raised: "); Console.WriteLine(e.Message); } } } }

  • Visual C#のエラーについて

    レジストリを読み込むときにエラーが出ます。(指定されたキャストは有効ではありません) bool b_tbar private void Form1_Load(object sender, EventArgs e) { try { Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\***", false); if (regkey == null) { b_tbar = true; return; } b_tbar = (bool)regkey.GetValue("tbar");  <ーーここでエラー regkey.Close(); } catch (Exception e1) { MessageBox.Show( e1.Message); } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"***"); regkey.SetValue("tbar", b_tbar); regkey.Close(); } どこをどうなおしたら良いのでしょか?教えてくださいお願いいたします。

  • VB.NETのUsingキーワードの使い方

    毎々参考にさせていただいております。 早速ですが質問させていただきます。 あるフォームでボタンが押された時に、下記の3つの処理でログを出力したい場合なのですが。  a) ボタンが押されたイベント処理  b) ボタンが押されたイベント処理の中で呼ばれるTestFunction1の中  c) ボタンが押されたイベント処理の中で呼ばれるTestFunction2の中 複数のメソッドに参照されるということで、StreamWriterのオブジェクトはインスタンスフィールドに宣言しています。 Public Class Test   'StreamWriter型のフィールド宣言   Private _sw As System.IO.StreamWriter   'ボタンクリックイベント処理   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     Me._sw = New System.IO.StreamWriter(filePath)     Using Me._sw       Me._sw.WriteLine("Button1はクリックされました")       Me.TestFunction1()       Me.TestFunction2()     End Using   End Sub   Private Sub TestFunction1()     'TODO:ここに処理     If Me._sw IsNot Nothing Then       Me._sw.WriteLine("TestFunction1は処理されました。")     End If   End Sub   Private Sub TestFunction2()     'TODO:ここに処理     If Me._sw IsNot Nothing Then       Me._sw.WriteLine("TestFunction2は処理されました。")     End If   End Sub End Class 目的とする処理は実現されているのですが、このようなUsingの使い方は問題ないのでしょうか? どなたかに御回答いただければうれしく思います。よろしくお願いいたします。 環境は下記のような感じです。  環境IDE:Visual Studio 2005  言語  :Visual Basic

  • C#でIEの操作ができないページの操作方法

    C#でIEを操作しようとしているのですが、HTMLを取得する際にエラーが出てしまします。なぜでしょうか? yahooなどのサイトのHTMLは取得できるのですが、実際にhtmlを取得したいサイトは「型 'System.Net.WebException' のハンドルされていない例外が System.dll で発生しました 追加情報:接続が切断されました: 送信時に、予期しないエラーが発生しました。」とエラーがでます。 HTMLが取得できないサイトがあるのでしょうか? その時にどうすればHTMLを取得し、操作できるのかその方法を教えてください。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Encoding enc = Encoding.GetEncoding("Shift_JIS"); string url = "https://www.yahoo.co.jp/"; WebRequest req = WebRequest.Create(url); WebResponse res = req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); Console.WriteLine(html); } } }

  • C# 匿名メソッドについて

    http://www.atmarkit.co.jp/fdotnet/csharp20/csharp20_05/csharp20_05_02.html 匿名メソッドを勉強しています。 上記のサイトの最初のソースで using System; delegate void MyAction(); class Program { static MyAction CreateMethod() { string message = "Hello! World!"; return delegate() { Console.WriteLine(message); }; } static void Main(string[] args) { MyAction action = CreateMethod(); action(); // 出力:Hello! World! } } このソースに対して、 >>常識的に考えればこのプログラムは動作しないはずである。 >>なぜなら、変数messageはCreateMethodメソッドからリターンした瞬間に消滅するが、 >>匿名メソッドが呼ばれるのはその後だからである。 と書かれていますが、 私にはその不思議さがわかりません。 まず、インスタンスされたクラスは初めにMainを読みに行き、 MyAction action = CreateMethod();でCreateMethod()を実行する。その実行した中でreturn”message”が結果的にされる。 そして、それがactionに代入されるという流れだと思うのですが、なぜ、これが不思議なのでしょうか?

  • 結局 deleteしないとダメ? ファイナライザー万能主義は理解不足?

    安直に後始末はファイナライザ部に書いておけば、OKと思っていましたが、実行させると実行時エラー?になり正しくファイルに書き込めていません。リソースを解放するタイミングが理解できていないです。 書き込んでcloseすると確実ですが、何度もopenしないといけないので、オブジェクトの有効期間開きっぱなしで処理させて、オブジェクト消滅と共にクローズさせたいです。 以下、無理やり動作させたソースです。 この考え方は正しいでしょうか? /* ファイナライザに後始末処理を入れておけば すべてうまくいくと理解していたのですが そんな単純なものではないのでしょうか? */ #using <system.dll> using namespace System; using namespace System::IO; ref class Test_A { StreamWriter^ sw; // ファイルのオープン void open(void){ try { sw = gcnew StreamWriter( "test.log", true); } catch ( Exception^ ex) { Console::WriteLine("オープンエラー"); } } // ファイルのクローズ void close(){ if (sw){ sw->Close(); } } public: // コンストラク Test_A(){ sw = nullptr; open(); } // デストラクタ ~Test_A(){ this->!Test_A(); // ← これを書き、delete a;とすると、正しく書き込まれて変な例外ダイアログメッセージが表示されなくなる。 } // ファイナライザー !Test_A(){ close(); // ファイナライザで後処理すれば、万事OKではない?? } // ファイルの書き込み void Write(String^ log){ try { sw->Write(log); } catch ( Exception^ ex ) { Console::WriteLine("書き込みでエラー"); } } }; //------------------------------------- // メイン //------------------------------------- int main(void){ Test_A^ a = gcnew Test_A(); a->Write("delete aと、~Test_Aに処理を施さないと、正しく書き込めない。\n"); delete a; // ←これが無いと、変なダイアログメッセージが表示される、しかも正しく書き込めない。 return 0; }

  • C#での時間制限のプログラム

    C#初心者です。Visual studioでプログラムを書いてます。 ラベルに制限時間を表示させ、起動して30秒経つと 「もういちどやりますか?」というメッセージボックスが出て、 「はい」でもう一度開始、「いいえ」でプログラムを終了させるような 処理をさせたいのですが、「はい」を押しても同じメッセージボックスが出てループしてしまい、もう一度開始させることができません…。 解決する方法を教えていただきたいです。よろしくお願いします。 以下、書いたコードです。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace timelimit { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DateTime StartTime; TimeSpan TimeLimit; private void Form1_Load(object sender, EventArgs e) { timer1.Enabled = true; StartTime = DateTime.Now; TimeLimit = new TimeSpan(0,0,30); } private void timer1_Tick(object sender, EventArgs e) { TimeSpan tm = DateTime.Now - StartTime; if(tm > TimeLimit) { TimeLimit = new TimeSpan(0, 0, 30); timer1.Enabled = false; DialogResult result = MessageBox.Show ("時間終了!もういちどやりますか?","終了処理",MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { timer1.Enabled = true; } else if (result == DialogResult.No) { Close(); } }else{ label1.Text = (TimeLimit - tm).ToString(); } }