ディスコードで呼び出しコマンドを入力したチャンネルidを取得、そのチャンネルのみで動作するようにしたい
読み上げbot作成サイト通りにbotを作ったのですが、サーバーに追加した読み上げbotがすべてのテキストチャンネルの書き込みを読み上げてしまいます。
呼び出しコマンドを入力したチャンネルのみ読み上げるにはどうすればいいでしょうか?
任意のチャンネルのみを指定する方法だと聞き専チャンネルが複数あるサーバーでは、指定したチャンネルでしか動作しなくなるので、理想としては呼び出しコマンドを入力したチャンネルのみ読み上げるというのが理想です。
また接続や切断時のメッセージを読み上げさせることは可能でしょうか?
該当するソースコード
import discord
from discord.ext import commands
import asyncio
import os
import subprocess
import ffmpeg
from voice_generator import creat_WAV
client = commands.Bot(command_prefix='?')
voice_client = None
@client.event
async def on_ready():
print('Logged in as')
print(client.user.name)
print(client.user.id)
print('------')
@client.command()
async def join(ctx):
print('#join')
print('#voicechannelを取得')
vc = ctx.author.voice.channel
print('#voicechannelに接続')
await ctx.send('召喚成功!')
await vc.connect()
@client.command()
async def bye(ctx):
print('#bye')
print('#切断')
await ctx.voice_client.disconnect()
await ctx.send('ばいばい')
@client.command()
async def ad(ctx, arg1, arg2):
with open('C:\open2\bin\dic.txt', mode='a') as f:
f.write('\n'+ arg1 + ',' + arg2)
print('dic.txtに書き込み:''\n'+ arg1 + ',' + arg2)
await ctx.send('`' + arg1+'` を `'+arg2+'` として登録しました')
@client.event
async def on_voice_state_update(member, before, after):
server_id_test = "サーバーID"
text_id_test = "通知させたいテキストチャンネルID"
if member.guild.id == server_id_test: # サーバーid
text_ch = client.get_channel(text_id_test) # 通知させたいTEXTチャンネルid
if before.channel is None:
msg = f'【VC参加ログ】{member.name} が {after.channel.name} に参加しました。'
await text_ch.send(msg)
@client.event
async def on_message(message):
# 「/neko」と発言したら「にゃーん」が返る処理
if message.content == 'トリガー集め':
await message.channel.send('今頑張って集めてる!目標は3500個!')
print('---on_message_start---')
msgclient = message.guild.voice_client
print(msgclient)
if message.content.startswith('.'):
pass
else:
if message.guild.voice_client:
print('#message.content:'+ message.content)
creat_WAV(message.content)
source = discord.FFmpegPCMAudio("output.wav")
message.guild.voice_client.play(source)
else:
pass
await client.process_commands(message)
print('---on_message_end---')
client.run("トークン")
import subprocess
import re
# ************************************************
# remove_custom_emoji
# 絵文字IDは読み上げない
# ************************************************
def remove_custom_emoji(text):
#pattern = r'<:[a-zA-Z0-9_]+:[0-9]+>' # カスタム絵文字のパターン
pattern = r'<:' # カスタム絵文字のパターン
text = re.sub(pattern,'',text) # 置換処理
pattern = r':[0-9]+>' # カスタム絵文字のパターン
return re.sub(pattern,'',text) # 置換処理
# ************************************************
# url_shouryaku
# URLなら省略
# ************************************************
def url_shouryaku(text):
pattern = "https?://[\w/:%#\$&\?\(\)~\.=\+\-]+"
return re.sub(pattern,'URLは省略!',text) # 置換処理
# ************************************************
# remove_picture
# 画像ファイルなら読み上げない
# ************************************************
def remove_picture(text):
pattern = r'.*(\.jpg|\.jpeg|\.gif|\.png|\.bmp)'
return re.sub(pattern,'画像が貼られたよ',text) # 置換処理
# ************************************************
# remove_command
# コマンドは読み上げない
# ************************************************
def remove_command(text):
pattern = r'^\!.*'
return re.sub(pattern,'',text) # 置換処理
# ************************************************
# remove_log
# 参加ログは読み上げない
# ************************************************
def remove_log(text):
pattern = r'(\【VC参加ログ\】.*)'
return re.sub(pattern,'',text) # 置換処理
# ************************************************
# user_custam
# ユーザ登録した文字を読み替える
# ************************************************
def user_custam(text):
f = open('C:/open2/bin/dic.txt', 'r')
line = f.readline()
while line:
pattern = line.strip().split(',')
if pattern[0] in text and len(pattern) >= 2:
text = text.replace(pattern[0], pattern[1])
print('置換後のtext:'+text)
break
else:
line = f.readline()
f.close()
return text
# ************************************************
# creat_WAV
# message.contentをテキストファイルと音声ファイルに書き込む
# 引数:inputText
# 書き込みファイル:input.txt、output.wav
# ************************************************
def creat_WAV(inputText):
# message.contentをテキストファイルに書き込み
inputText = remove_custom_emoji(inputText) # 絵文字IDは読み上げない
inputText = remove_command(inputText) # コマンドは読み上げない
inputText = url_shouryaku(inputText) # URLなら省略
inputText = remove_picture(inputText) # 画像なら読み上げない
inputText = remove_log(inputText) # 参加ログなら読み上げない
inputText = user_custam(inputText) # ユーザ登録した文字を読み替える
input_file = 'input.txt'
with open(input_file,'w',encoding='shift_jis') as file:
file.write(inputText)
command = 'C:/open2/bin/open_jtalk -x {x} -m {m} -r {r} -ow {ow} {input_file}'
#辞書のPath
x = 'C:/open2/bin/dic'
#ボイスファイルのPath
#m = 'C:/open2/bin/nitech_jp_atr503_m001.htsvoice'
#m = 'C:/open2/bin/mei/mei_sad.htsvoice'
#m = 'C:/open2/bin/mei/mei_angry.htsvoice'
#m = 'C:/open2/bin/mei/mei_bashful.htsvoice'
#m = 'C:/open2/bin/mei/mei_happy.htsvoice'
#m = 'C:/open2/bin/mei/mei_normal.htsvoice'
#m = 'C:/open2/bin/想音いくる.htsvoice'
#m = 'C:/open2/bin/天月りよん.htsvoice'
m = 'C:/open2/bin/グリマルキン.htsvoice'
#発声のスピード
#r = '2.0'
r = '1.2'
#出力ファイル名 and Path
ow = 'output.wav'
args= {'x':x, 'm':m, 'r':r, 'ow':ow, 'input_file':input_file}
cmd= command.format(**args)
print(cmd)
subprocess.run(cmd)
return True
if __name__ == '__main__':
creat_WAV('テスト')
自分で試したこと
async def on_message(message):
~not inは試してみたのですがなぜかbotがエラーも吐くことなく動かなくなってしまいました…。
また、not in ではチャット参加者が同サーバー内の別の聞き専チャンネルに書き込んだ時それも読み上げてしまうのでこのやり方では私がやりたいことはできそうもありません。
よろしくお願いします。
環境はPython3.9.2です。
0