質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2622閲覧

discord.pyでカスタムコマンド機能を作りたい

Nemu627

総合スコア12

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/05 11:46

編集2021/04/06 06:22

実現したいこと

discordのチャット上でそのコマンドを入力して新たに自分でコマンドを作成するという機能を作りたいです。例えば「tera!ori today 今日もかわいいね」と送信したとしましょう。2単語目がコマンド名で3単語目がそのコマンドに反応して送信するメッセージ内容です。要はdiscord上でコマンドを作成する機能です。

カスタムコマンド機能について

discord上のメッセージで自分で新たにコマンドを作れる機能を作りたいです。コマンド名と返信メッセージをカスタマイズできるようにしたいので以下のコードを書きました。

@bot.command() async def ori(ctx, command = "コマンド名", message = "メッセージ"): def command(ctx): await ctx.reply(message)

こちらを実行してみましたが微動だにしませんでした。

試してみた

2通り試してみました。

@bot.command() async def ori(ctx, command = "コマンド名", message = "メッセージ"): command = command message = message def command(ctx): await ctx.reply(message)
@bot.command() async def ori(ctx, command = "コマンド名", message = "メッセージ"): async def command(ctx): await ctx.reply(message)

どちらも失敗に終わりました。

某BOTを見て試行錯誤しているのですが仕組みがわからなかったのでこちらに質問させていただきました。口頭での仕組みの説明や指摘でも構わないので回答いただけると幸いです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coolwind0202

2021/04/05 14:27

何をされたいのかが伝わってきません。 command関数とは何をする関数なのですか? どのコードでもcommand関数を呼び出していないので、微動だにしないのはそれが原因だと思いますが…
udon-ken

2021/04/05 15:59

1. discord.pyを使用しての話しですよね?(念の為確認) 2. コマンドとはどういう意味でしょうか?一般に思われているコマンドではなく、「自動返信メッセージのバリエーションを任意に追加したい」という事でしょうか? 一般的なコマンドは「prefix + コマンド名 + 引数(任意)」つまり、「!ori こんにちは」のように実行するものです。 対して、自動返信メッセージは、投稿文にあらかじめボット側で決めていた文字列が含まれていたら、あらかじめ決めていた(または、生成式をあらかじめ決めていて、それを使って生成した)返信をするものです。
udon-ken

2021/04/05 16:10

ああ・・・ちょっと読み違いかも。。 ボットに対して、何らかのコマンドを送ったら、新しいコマンドまたは自動返信メッセージが作成される機能という事でしょうかね? 現状のコードを見るに、かなりの初心者と見受けられるので、ここでできる範囲で説明するのは難しい感じがします。 何かを作成する=当然作成したものを保存しておかないと後で使えない、なのですがそのあたりの考慮が全くされていないので、おそらく根本的な仕組みを理解されていなさそうなのです。
Nemu627

2021/04/06 06:40

目的について修正させていただきました。わかりづらくて申し訳ないです。 1,discord.pyです 2,回答者さんのおっしゃる通り、「何らかのコマンドを送ったら、新しいコマンドまたは自動返信メッセージが作成される機能」です。 初心者の者ですが説明していただけると大変幸いです。なるほど、確かに保存する機構が必要ですね。それを踏まえて自分でも勉強してみます。ありがとうございます、
guest

回答1

0

ベストアンサー

んーと、まず・・・おそらく自動返信メッセージのキーワードと出力内容を追加したいのですよね??
そうだとすると、少なくとも2つの関数が必要になります。
1つは、キーワードと出力内容を登録(保存)する部分
もう一つは、登録したキーワードに反応して自動返信する部分

保存については本来はデータベースなりjsonファイルなりに保存するものですが、便宜上、辞書型変数にするとしましょう(辞書に保存できるなら、その後はどうにでも応用できるので)。
で、2つの関数は別のスコープを持ちますから、片方の関数で定義してももう片方の関数で参照する事ができません。
ですので、両方から見える変数を定義します。

説明が大変なので、あまりいい事ではないですが、コードを示します。

python

1reply_data = {} 2@bot.command() 3async def ori(ctx, word, reply): 4 reply_data[word] = reply 5 await ctx.send(f"{word} -> {reply}を登録しました") 6 7@bot.event 8async def on_message(message): 9 reply = reply_data.get(message.content) 10 if reply: 11 await message.channel.send(reply)

だいたいこのような感じで、登録と反応を作ったらいいのではないでしょうか?
(コードは実行していない上に、ずっとcogを使った書き方しかしていないので正しい保証はありません。またあくまでサンプルの為の最小限なので実用上は多数の問題があります。)

投稿2021/04/06 13:03

udon-ken

総合スコア657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問