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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

2514閲覧

【Discord.py】指定時間後に処理をする

koucha0

総合スコア72

Discord

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

1グッド

1クリップ

投稿2021/06/19 03:50

前提・実現したいこと

Discord.pyにて、指定時間後に処理をする機能を作ろうと考えています。
下記にある、該当するコードの場合だと
もう一度!timeerと実行されたら上書きされて、タイマーが始まってしまいます。

なので、!timer が実行されたときに
今実行中にタイマーがあるかを確認するようにするにはどうすればいいですか?

該当のソースコード

python

1@bot.event 2async def on_message(message): 3 if message.content == "!timer": 4 await message.channel.send("タイマー開始\n10秒後にお知らせします。") 5 await asyncio.sleep(10) 6 await message.channel.send("10秒が経過しました。") 7 8 await bot.process_commands(message)

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

Python 3.9.5
DIscord.py 1.7.1

Nissy-teratail👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

タイマーを管理するクラス TimerManager を作成し、 timer_start メソッドでタイマースタート、 is_active メソッドでタイマー動作中かを確認する例:

py

1from discord.ext import commands 2import asyncio 3from typing import Optional 4 5class TimerIsActive(Exception): 6 pass # タイマーが動いているときの例外 7 8class TimerManager: 9 _timer: Optional[asyncio.Task] = None # 現在動いているタイマー ( None ならば動いていない) 10 11 @staticmethod 12 def _timer_reset(task): 13 TimerManager._timer = None # タイマーを消去 14 15 @staticmethod 16 async def timer_start(second: int): 17 if TimerManager.is_active(): 18 raise TimerIsActive("タイマーがすでに動いています。") 19 TimerManager._timer = asyncio.create_task(asyncio.sleep(second)) # タイマーの Task を保持 20 TimerManager._timer.add_done_callback(TimerManager._timer_reset) # タイマーが終わったら消去する 21 await TimerManager._timer # タイマーが終わるのを待つ 22 23 @staticmethod 24 def is_active(): 25 return TimerManager._timer is not None 26 27bot = commands.Bot(command_prefix="?") 28 29@bot.event 30async def on_message(message): 31 if message.content == "!timer": 32 if TimerManager.is_active(): 33 return # タイマーがすでに動いているので 34 35 await message.channel.send("タイマー開始\n10秒後にお知らせします。") 36 await TimerManager.timer_start(10) 37 await message.channel.send("10秒が経過しました。") 38 39 await bot.process_commands(message)

投稿2021/06/19 06:14

coolwind0202

総合スコア708

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

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

coolwind0202

2021/06/19 06:16

ただ、この要件ならタイマー実行中かを示す bool 値のグローバル変数だけあれば事足りますね。冗長すぎました。
koucha0

2021/06/19 06:49

ありがとうございます。 無事、実現することが出来ました!
guest

0

グローバル変数を使ってタイマー実行中かどうか管理すればいいと思います。

投稿2021/06/19 05:40

fukatani

総合スコア626

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

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

koucha0

2021/06/19 06:06

ご回答ありがとうございます。 グローバル変数については理解出来るのですが、具体的にどのように管理するかご教授頂けたら幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問