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

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

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

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

Q&A

2回答

1813閲覧

discord.py asyncが既に定義されてるというエラー

Quarry

総合スコア15

Python

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

0グッド

2クリップ

投稿2019/04/18 19:13

こんにちは
discord.pyで2つbotを喋らせる?(コード見れば何やりたいかわかるはず)ようにしたいんですけど
cmdのほうだとログインが成功した時のメッセージが出るのに反応せずテキストエディタでエラーが出てるので見たらasyncが既に定義されていると出て困ってます
1つめの@client.eventは反応するのに2つめ3つめは反応しません

python

1import discord 2 3import time 4from time import sleep 5import threading 6 7import urllib.request 8import json 9import re 10 11 12client = discord.Client() 13 14channel = client.get_channel('568482185032630284') 15 16citycodes = { 17 "土浦": '080020', 18 "水戸": '080010', 19 "札幌": '016010', 20 "仙台": '040010', 21 "東京": '130010', 22 "横浜": '140010', 23 "名古屋": '230010', 24 "大阪": '270000', 25 "広島": '340010', 26 "福岡": '400010', 27 "鹿児島": '460010', 28 "那覇": '471010' 29} 30 31 32@client.event 33async def on_ready(): 34 print('ok') 35 36 37 38@client.event 39async def on_message(message): 40 if message.content.startswith('!join'): 41 role = discord.utils.get(message.author.server.roles, name="仲間") 42 await client.add_roles(message.author, role) 43 await client.send_message(message.channel, f'{message.author.mention} 君も仲間だよ!!') 44 45@client.event 46async def on_message(message): 47 if message.content.startswith('!text'): 48 channel_name = message.content.split()[1] 49 await client.create_channel(message.server, channel_name, type=discord.ChannelType.text) 50 await client.send_message(message.channel, f'{channel_name} チャンネルを作成しました') 51 52@client.event 53async def on_message(message): 54 if message.content.startswith('!voice'): 55 channel_name = message.content.split()[1] 56 await client.create_channel(message.server, channel_name, type=discord.ChannelType.voice) 57 await client.send_message(message.channel, f'{channel_name} チャンネルを作成しました') 58 59@client.event 60async def on_message(message): 61 if message.content.startswith('!delch'): 62 compatible_channel = [c for c in message.server.channels if message.channel.name == c.name and c.type == discord.ChannelType.voice][0] 63 await client.delete_channel(message.channel) 64 await client.delete_channel(compatible_channel) 65 66@client.event 67async def on_message(message): # 発言を受信したら処理をする関数 68 if message.author != client.user: 69 70 reg_res = re.compile(u"Bot君、(.+)の天気は?").search(message.content) 71 if reg_res: 72 73 if reg_res.group(1) in citycodes.keys(): 74 75 citycode = citycodes[reg_res.group(1)] 76 resp = urllib.request.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read() 77 resp = json.loads(resp.decode('utf-8')) 78 79 msg = resp['location']['city'] 80 msg += "の天気は、\n" 81 for f in resp['forecasts']: 82 msg += f['dateLabel'] + "が" + f['telop'] + "\n" 83 msg += "です。" 84 85 await client.send_message(message.channel, message.author.mention + msg) 86 87 else: 88 await client.send_message(message.channel, "そこの天気はわかりません...")

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

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

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

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

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

tachikoma

2019/04/18 22:28 編集

エラーメッセージを見ないとなんともですが、とりあえずPython3.6でやってみてください。
Lhankor_Mhy

2019/04/19 04:50

def on_message がたくさんあるのが気になりました。 discord.py をよく知らないのですが、@client.event デコレータをつけてると、同じスコープ内で同名の関数を定義することができるのですか?
Lhankor_Mhy

2019/04/19 04:57

あ、私の勘違いですね、すみません。
退会済みユーザー

退会済みユーザー

2019/07/01 06:35

質問をするということは相手の時間を取るということです エラーメッセージも貼らずに自己解釈されるのならば質問する必要はないのでは? また、ソースコードが全てむちゃくちゃです
guest

回答2

0

on_message()は、一つでいいと思いますね。
あなたのコードで言えば、一番上の「!join」の上だけでよく、その下にまた

python

1@client.event 2async def on_message(message):

は入りません。僕の環境では正常に動作しました。

コード例

python

1@client.event 2async def on_message(message): 3 if message.content.startswith('!join'): 4 role = discord.utils.get(message.author.server.roles, name="仲間") 5 await client.add_roles(message.author, role) 6 await client.send_message(message.channel, f'{message.author.mention} 君も仲間だよ!!') 7 8 if message.content.startswith('!text'): 9 channel_name = message.content.split()[1] 10 await client.create_channel(message.server, channel_name, type=discord.ChannelType.text) 11 await client.send_message(message.channel, f'{channel_name} チャンネルを作成しました') 12 13 if message.content.startswith('!voice'): 14 channel_name = message.content.split()[1] 15 await client.create_channel(message.server, channel_name, type=discord.ChannelType.voice) 16 await client.send_message(message.channel, f'{channel_name} チャンネルを作成しました') 17 18 if message.content.startswith('!delch'): 19 compatible_channel = [c for c in message.server.channels if message.channel.name == c.name and c.type == discord.ChannelType.voice][0] 20 await client.delete_channel(message.channel) 21 await client.delete_channel(compatible_channel) 22 23 if message.author != client.user: 24 25 reg_res = re.compile(u"Bot君、(.+)の天気は?").search(message.content) 26 if reg_res: 27 28 if reg_res.group(1) in citycodes.keys(): 29 30 citycode = citycodes[reg_res.group(1)] 31 resp = urllib.request.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read() 32 resp = json.loads(resp.decode('utf-8')) 33 34 msg = resp['location']['city'] 35 msg += "の天気は、\n" 36 for f in resp['forecasts']: 37 msg += f['dateLabel'] + "が" + f['telop'] + "\n" 38 msg += "です。" 39 40 await client.send_message(message.channel, message.author.mention + msg) 41 42 else: 43 await client.send_message(message.channel, "そこの天気はわかりません...")

投稿2020/01/05 07:01

Seiwell

総合スコア54

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

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

0

上の方と同じですが、1つのコードに複数のon_message()を使うことはできません。
それは異なる動作で全く同じ関数名を複数使うようなものです。
プログラムは上から順に実行されていくので一番上のon_message()しか実行されません。

1つのon_message()内にif message.content.startswith()をたくさん使いましょう。

投稿2021/10/16 04:35

pecop

総合スコア409

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問