def play_sound_tag(server_id, voice_channel_id, sound_tag_name, user_id):
"""Plays the sound from the given sound tag if it is available."""
try:
if servermanager.is_muted(server_id, voice_channel_id):
raise bot_exception(EXCEPT_TYPE, "The bot is muted in this voice channel")
except KeyError:
raise bot_exception(EXCEPT_TYPE, "You are not in a voice channel (are you perhaps on a different server?)")
sound_tag_data = get_sound_tag_data(server_id, sound_tag_name)
check_sound_tag_access(server_id, sound_tag_data, user_id, need_owner=False)
update_sound_tag(server_id, sound_tag_name, increment_hits=True) # Increment hits
from jshbot.botmanager import client
from jshbot.botmanager import voice_player
global timeout_goal
channel = botmanager.get_voice_channel(server_id, voice_channel_id)
if client.voice == None or client.voice.channel != channel or not client.voice.is_connected(): # Connect to channel
if client.voice: # Disconnect from old channel
await client.voice.disconnect()
client.voice = await client.join_voice_channel(channel)
voice_player.server_id = server_id
if voice_player.player is not None and voice_player.player.is_playing(): # Stop if playing
voice_player.player.stop()
if sound_tag_data['type'] == 'YouTube':
# To prevent playlist downloads
# 'noplaylist': True
voice_player.player = await client.voice.create_ytdl_player(sound_tag_data['url'])
else: # Direct download (or stream? Not sure)
try:
# One day, I will figure out how to stream this crap. But today is not that day.
#response = urllib.request.urlopen(sound_tag_data['url'])
#voice_player.player = client.voice.create_ffmpeg_player(response, use_avconv=True)
urllib.request.urlretrieve (sound_tag_data['url'], '{}/tempsound'.format(configmanager.data_directory))
voice_player.player = client.voice.create_ffmpeg_player('{}/tempsound'.format(configmanager.data_directory))
except:
raise bot_exception(EXCEPT_TYPE, "An error occurred when downloading the sound file")
voice_player.player.start()
timeout = configmanager.config['voice_timeout']
if timeout >= 0:
timeout_reset_lock.acquire()
timeout_goal = time.time() + ((timeout*60) if timeout > 0 else (sound_tag_data['length']+1))
timeout_reset_lock.release()
await timeout_disconnect()
评论列表
文章目录