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

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

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

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

Python

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

Q&A

1回答

1745閲覧

discordbotで入力を複数回受け取るには

kazulztk

総合スコア14

Discord

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

Python

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

0グッド

0クリップ

投稿2021/08/08 06:00

編集2021/08/09 05:38

python

1from asyncio.tasks import wait_for 2from datetime import MAXYEAR 3import datetime 4from time import sleep 5import discord 6from discord import user 7from discord import message 8from dotenv import load_dotenv 9import os 10import time 11import main 12 13#env読み込み 14load_dotenv() 15TOKEN = os.getenv('token') 16 17# 接続に必要なオブジェクトを生成 18client = discord.Client() 19 20@client.event 21async def on_ready(): 22 print('ログインしました') 23 24 25 26@client.event 27async def on_message(message): 28 if message.author.bot: 29 return 30 31 if message.content.startswith('!join') or message.content.startswith('!j'): 32 await message.channel.send(f'Hello {message.author.mention}. Please choose timer(!timer or !t) or stopwatch(!stopwatch or !sw)') 33 34 35 def select(s): 36 global slt 37 if s.content == '!timer' or s.content == '!t': 38 slt = 'timer' 39 return slt 40 elif s.content == '!stopwatch' or s.content == '!sw': 41 slt = 'stopwatch' 42 return slt 43 return 44 45 msg = await client.wait_for('message', check=select) 46 await message.channel.send(f'{msg.author.mention} selects a {slt}.') 47 48 49 #timer 50 if slt == 'timer': 51 await message.channel.send('Please set the time : 10m(!10m) 20m(!20m) 30m(!30m)') 52 global settime 53 54 def set_time(st): 55 if st.content == '!10m': 56 global settime 57 settime = 600 58 return settime 59 elif st.content == '!20m': 60 settime = 1200 61 return settime 62 elif st.content == '!30m': 63 settime = 1800 64 return settime 65 elif st.content == '!3m': #test 3s 66 settime = 3 67 return settime 68 return 69 70 s_msg = await client.wait_for('message', check=set_time) 71 await message.channel.send(f'{s_msg.author.mention} sets {settime}m.\n Start with !start ot !s') 72 73 74 75 if message.content == '!start' or message.content == '!s': 76 await message.channel.send(f'{s_msg.author.mention} Start timer') 77 78 for i in range(settime): 79 await message.channel.send(f'{s_msg.author.mention} {settime}') 80 sleep(settime) 81 settime -= 1 82 if settime == 0: 83 await message.channel.send(f'{s_msg.author.mention} Thank you for your hard work.') 84 break 85 86 87 88 89 90 91

discordbotでタイマーを作ろうとしています。
if message.content == '!s'のところで!sを入力してもなにも帰ってきません。どのようにしたらタイマーが実装されますか。
ご教授ください

【追記】
!jでbotを読み込みます。その後、タイマー(!t)かストップウォッチ(!sw)の入力を受け取り時間を選択後(/10m)、!sで開始という流れを想定しています。
入力を受け取るとは、discord上で入力したもの(!tや!10mなど)のことで、それをもとに条件分岐を行おうと考えていました。
この場合、複数回入力を受け取ることが不可能ということでしょうか。

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

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

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

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

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

guest

回答1

0

上の方の
if message.content.startswith('!join') or message.content.startswith('!j'):
でTrueの場合のみそこから下を実行するコードなので、message.contentが!sならそこはFalseになるから何もされないのでは?

投稿2021/08/08 06:09

udon-ken

総合スコア657

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

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

kazulztk

2021/08/08 09:02

おっしゃる通りです。見落としていました。 では、入力を受け取ってからタイマーを開始するにはどのようにしたらいいですか。
udon-ken

2021/08/08 12:47 編集

ちょっと意味が分からないです。 > discordbotでタイマーを作ろうとしています。 これだけでは実際のところどういう仕様のものを作ろうとしているのかさっぱりわかりません。 「discordでタイマーと言えばおおよそこんなもの」みたいな共通認識があるようなものでしたらこれだけでもおおまかに推測がつくのでしょうけど・・・ 例でいうと、「リアクションロール」と言えばボット制作界隈ではほぼどういうものか共通認識があると思いますのである程度通じますが「タイマー」では無理です。 > 入力を受け取ってからタイマーを開始するにはどのようにしたらいいですか。 仕様がわかりませんので、そもそも「入力を受け取って」の意味すら分かりません。
kazulztk

2021/08/09 03:26

!jでbotを読み込みます。その後、タイマー(!t)かストップウォッチ(!sw)の入力を受け取り時間を選択後(/10m)、!sで開始という流れを想定しています。 入力を受け取るとは、discord上で入力したもの(!tや!10mなど)のことで、それをもとに条件分岐を行おうと考えていました。 この場合、複数回入力を受け取ることが不可能ということでしょうか。
udon-ken

2021/08/09 11:30

うーんと・・・多分ですが、初歩的な部分ができていないのにあれもこれもと欲張りすぎてる感じがします。 あと、質問するなら必要最低限のコードかつ他人が見た時に分かりやすいコードにしないと、読むほうは訳がわかりません。 大量のimportとかログインメッセージとか、時間の入力が択一式(?)であろうが自由入力であろうが動作に関係ないのだから質問段階では自由入力でよくないですかね? まあ、それはいいとして、なぜ初歩的な部分が~となるかというと「!jでbotを読み込みます。」この時点で既に意味不明だからです。 読み込みが起動という意味なら既に起動していますし、もし起動していないなら!jのメッセージが受け取れません。 その辺、ボット作成者ならユーザーにどう説明するかは悩んでも仕様について表す場合にそういう表現は起こりえません。 で、一応、なんとなく読み取りましたが、なんとなく仕様がおかしい。 以下のような仕様が普通に思いつくものです。 1.!j でボットが反応し「ボットが起動した。ついてはタイマーかストップウォッチか指定しろ」とのメッセージを送信する。 ※※ ここの「起動した」はユーザーに理解しやすいよう伝えるだけの方便で、実際は全くの嘘であり最初からボットは起動している ※※ 2.ユーザーがタイマーかストップウォッチか指定したなら、「時間を送信しろ」とのメッセージを送信する。 3.ユーザーが時間を入力したなら、「スタートしたい時に!sと送信しろ」とのメッセージを送信する。 4.ユーザーから!sの送信があったならタイマーの処理を開始する。 これの1と2、2と3、3と4の間にwait_forで入力を待つというのが常道と思います。 条件分岐の件もよくわかりませんが、普通に可能と思います。 wait_forで受け取った値を元に分岐するだけでは? いずれにしても、あれやこれや最初から盛り込もうとせず、シンプルなものを作って(ただし、拡張する事は考慮しながら)それを拡張いくほうがいいと思います。 自分なら user:!timer bot:何秒?(好きな数字を入れろ) user:30 bot:開始しました から始めて、次はuserが秒数を答えたらboが「開始する時はsを入力しろ」と返答して任意タイミングにスタートできるようにして… のようにして拡張していきます。 あと、仕様を考える時、使うのは「ユーザーである」というのを強く意識ましょう。 また、今回はどうか分かりませんが、大半が日本人であるというのも重要です。 ・何回も何回も入力させる(プログラム的に必要かもしれないが、ユーザーは最小限を望む) ・意味の分からないコマンド(また、文字種が入り混じった入力の強制) ・意味の分からないメッセージ が最低限になるよう考える必要があります。 今回でいうと、!j(join)とか・・・ ネイティブなら理解するのかも知れませんが、日本人ならjoinってなに?または、jointって参加だよね?となり、とても動作開始のコマンドと思わない(=覚えられない)と思います。 途中で!を含む文字列を送信させる事についても、まずはめんどくさいです。「何秒?」って問われているのなんで!なんか付けないといけない?めんどくさい。となります。 そして、一般的には!で始めるのはコマンドですので、確実に混乱の元です。
kazulztk

2021/08/10 00:01

最初から難解なことをしようとしていたかもしれません。シンプルなものから作ってみたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問