Для моего бота раздора я хочу, чтобы он отправлял сообщение после того, как оставил голосовой канал, только на текстовый канал, в котором использовалась команда. Я пытался сделать это через событие, но это отправило сообщение на каждый канал.
Вот мой код:
class Commands(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
if not member.id == self.bot.user.id:
return
elif before.channel is None:
voice = after.channel.guild.voice_client
time = 0
while True:
await asyncio.sleep(1)
time += 1
if voice.is_playing() and not voice.is_paused():
time = 0
if time == 10:
await voice.disconnect()
if not voice.is_connected:
break
@commands.command(pass_context = True)
async def play(self, ctx):
if ctx.author.voice:
channel = ctx.message.author.voice.channel
await channel.connect()
Есть ли способ определить, когда бот уходит в команде воспроизведения?
Обработчик события on_voice_state_update должен обрабатывать любой тип изменения VoiceState , а before
и after
хранить данные о VoiceState до и после изменения. В частности, after.channel
является None
, если member
отключился от before.channel
. Вы можете просто добавить строку в начале вашей функции.
VOICE_CHANNELS = {}
@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
# Make sure the member is the bot
if not member.id == self.bot.user.id:
return
# Bot got disconnected
if after.channel is None:
text_channel = VOICE_CHANNELS.pop(before.channel.id)
if text_channel:
await text_channel.send("Disconnected!")
# Bot got connected
elif before.channel is None:
voice = after.channel.guild.voice_client
time = 0
while True:
await asyncio.sleep(1)
time += 1
if voice.is_playing() and not voice.is_paused():
time = 0
if time == 10:
await voice.disconnect()
if not voice.is_connected:
break
@commands.command(pass_context = True)
async def play(self, ctx):
if ctx.author.voice:
channel = ctx.message.author.voice.channel
await channel.connect()
VOICE_CHANNELS[channel.id] = ctx.channel
Ах, я вижу, что вы хотите. Я обновил ответ - решение заключалось в том, чтобы отслеживать все с помощью словаря. Это лучше?
вместо отправки сообщения в текстовый канал сообщение было отправлено в чат голосового канала.