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

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

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

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

Python

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

Q&A

解決済

1回答

1866閲覧

関数の連続実行を防ぎたい

Lansmann

総合スコア1

Discord

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

Python

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

0グッド

0クリップ

投稿2020/10/24 23:10

編集2020/10/25 00:17

前提・実現したいこと

Discordでチャットを検出したら自動で返信するbot
なお、連投された場合、連続で返してしまうのを防ぎたい
まだ初心者なのでお手柔らかにお願いします。

ここに質問の内容を詳しく書いてください。
今現在、私がいるdiscordサーバーで脈絡なくちんぽにゃ!とチャットに叫ぶのが流行っています。そこで、ちんぽにゃ!に関係したurlを貼るbotを作ったのはいいのですが、10人が連投すると10回そのurlを貼ってしまい正直うっとおしいです。
ですので、15秒ほ関数を停止してまた自動的にその関数を実行する方法を模索しています。

イメージとしては、10人が投稿した”ちんぽにゃ!”を1つの”ちんぽにゃ!”と処理して、urlを1度だけそのちんぽにゃ!コールの中に貼る感じです。

該当のソースコード

Python

1 2import discord 3import time 4 5 6TOKEN = "MyToken" 7 8client = discord.Client() 9 10 11@client.event 12async def on_ready(): 13 print("ログインしました") 14 15@client.event 16async def pause(): 17 time.sleep(10) 18 19@client.event 20async def restart(): 21 on_message() 22 23 24@client.event 25async def on_message(message): 26 if message.author.bot: 27 return 28 29 if message.content == "ちんぽにゃ": 30 await message.channel.send( 31 "https://www.nicovideo.jp/watch/sm37351730") 32 33 if message.content == "ちんぽにゃ!": 34 await message.channel.send( 35 "https://www.nicovideo.jp/watch/sm37351730") 36 37 if message.content == "おちんぽにゃ": 38 await message.channel.send( 39 "https://www.nicovideo.jp/watch/sm37351730") 40 41 if message.content == "おちんぽにゃ!": 42 await message.channel.send( 43 "https://www.nicovideo.jp/watch/sm37351730") 44 45 if message.content == "落ちます": 46 await message.channel.send( 47 "https://www.nicovideo.jp/watch/sm37351730") 48 49 50client.run(TOKEN) 51

試したこと

Pause関数を作りtime.sleep()を用いて関数の処理を10秒止めるのを試しましたが、再始動後に停止中に投稿された〇〇〇分またurlを貼ってしまい、意味がありませんでした。

exit()はもう使ってしまうと再実行できませんでした

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

yutarou12

2020/10/25 00:03

質問をするときにはBOTのTOKENは映らないようにしましょう。 このままだとBOTが乗っ取られる可能性が非常に高いので、今すぐTOKENを再生成してください。
Lansmann

2020/10/25 00:15

すいません、ありがとうございます。すでにTOKENは変更させていただきました
guest

回答1

0

ベストアンサー

グローバル変数last_message_timeを定義して最後のon_message処理時間を記録しておき、on_messageの冒頭でlast_message_timeから15秒経過しているかどうかを判断することで、質問者様のやりたいことはできると思います。

グローバル変数を増やしたり、判定ロジックの位置を関数内で移動させることで、毎回したい処理や、15秒は同じことをしない処理などを、組み合わせることも可能です。

Python

1last_message_time = 0 2 3@client.event 4async def on_message(message): 5 global last_message_time 6 if time.time() - last_message_time < 15: 7 return 8 else: 9 last_message_time = time.time() 10 11 # 以下は既存のコード 12 if message.author.bot: 13 return

投稿2020/10/25 00:58

編集2020/10/25 02:08
toast-uz

総合スコア3266

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

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

Lansmann

2020/10/25 01:56

last_message_time がmoduleになっていたので、 last_message_time =time.time() にして、あとはトーストさんのコードで解決しました! グローバル変数の知識はまだまだ浅いですが、非常に勉強になりました!
toast-uz

2020/10/25 02:09 編集

なぜか化けていました。= 0 にするとよいでしょう。time.time()だと起動してから15秒以内に来たメッセージを無視してしまいますので。
Lansmann

2020/10/25 02:19

あ、なるほど!わざわざありがとうございます...!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問