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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

1683閲覧

discord APIのon_member_updateイベントが2回コールされる

pzkpfw4

総合スコア8

Discord

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

Python 3.x

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

0グッド

0クリップ

投稿2020/04/19 16:40

質問の概要

現在、discord API(discord.py)のon_member_updateイベントを用い、ソースコードを書いています。
自身の書いたソースコードではon_member_updateイベントが一度のログインで2回呼ばれています。
どのようにすれば1度のログインで1回のみon_member_updateイベントが呼ばれるか不明な為、ご教授お願いします。

発生している問題・エラーメッセージ

後に記載するソースコードを実行した際の標準出力を記載します。

bash

1user@user:~/$ python3 discordbot.py 2ログインしました 3on_member_update:2020-04-20 01:12:21.063083 4on_member_update:2020-04-20 01:12:21.063188

該当のソースコード

python

1import discord 2import datetime 3 4TOKEN = 'xxxx' 5TEXT_CHANNEL = xxxx 6 7client = discord.Client() 8channel = None 9 10@client.event 11async def on_ready(): 12 global channel 13 channel = client.get_channel(TEXT_CHANNEL) 14 print('ログインしました') 15 16@client.event 17async def on_member_update(before, after): 18 print("on_member_update:"+str(datetime.datetime.now())) 19 20client.run(TOKEN)

試したこと

上記のソースコードで動作確認をしました。
しかし2回on_member_updateイベントが呼ばれる為質問した次第です。

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

自身のソースコードではon_member_updateイベントを使ったプログラムは去年の12月くらいまでは1度のログインで1回on_member_updateイベントが呼び出されていました。
(discord.pyのバージョンは覚えていませんがrewrite版であったことは覚えております。)

discord.pyのバージョンは1.3.3になります。

bash

1user@user:~/$ python3 2Python 3.6.9 (default, Nov 7 2019, 10:44:02) 3[GCC 8.3.0] on linux 4Type "help", "copyright", "credits" or "license" for more information. 5>>> import discord 6>>> discord.__version__ 7'1.3.3' 8>>>

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

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

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

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

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

guest

回答1

0

ベストアンサー

on_member_update イベントはその名前の通り、discord.Memberに関連して発生するイベントです。
discord.User ではなく discord.Member の変更をきっかけに発生するので、各サーバーごとにそのユーザーに対応する on_member_update が呼び出されていると推測します。

つまり、1度あるサーバーで呼び出されたら他のサーバーでは on_member_update の処理をしないようにすれば良いでしょう。
例えば以下のコードは、Botとそのユーザーの両方が参加している共通のサーバー一覧を抜き出し、イベントが呼び出されたサーバーと、共通サーバー一覧の最初の要素が一致していた場合のみ処理を行うものです。

py

1@client.event 2async def on_member_update(before,after): 3 user = client.get_user(before.id) 4 common_guilds = [guild for guild in client.guilds if user in guild.members] 5 6 if before.guild == common_guilds[0]: 7 print("on_member_update:"+str(datetime.datetime.now()))

投稿2020/04/26 08:17

coolwind0202

総合スコア708

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

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

pzkpfw4

2020/04/29 07:56

回答ありがとうございます。 ご指摘を受け確認したところサーバー2つに対して反応していました。 上記ソースコードを適用したところ修正が確認されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問