[V3 Audio] Empty channel disconnect setting (#1832)

* [V3 Audio] Empty channel disconnect setting

* [V3 Audio] Small fixes

* [V3 Audio] Remove unused variable

* [V3 Audio] Timer task
This commit is contained in:
aikaterna 2018-06-09 18:55:28 -07:00 committed by Will
parent 470521f7c8
commit 3759fce090
2 changed files with 65 additions and 9 deletions

View File

@ -53,4 +53,5 @@ async def setup(bot: commands.Bot):
await start_lavalink_server(bot.loop) await start_lavalink_server(bot.loop)
bot.add_cog(cog) bot.add_cog(cog)
bot.loop.create_task(cog.disconnect_timer())
bot.loop.create_task(cog.init_config()) bot.loop.create_task(cog.init_config())

View File

@ -6,6 +6,7 @@ import heapq
import lavalink import lavalink
import math import math
import re import re
import time
import redbot.core import redbot.core
from redbot.core import Config, commands, checks, bank from redbot.core import Config, commands, checks, bank
from redbot.core.utils.menus import menu, DEFAULT_CONTROLS, prev_page, next_page, close_menu from redbot.core.utils.menus import menu, DEFAULT_CONTROLS, prev_page, next_page, close_menu
@ -14,7 +15,7 @@ from .manager import shutdown_lavalink_server
_ = Translator("Audio", __file__) _ = Translator("Audio", __file__)
__version__ = "0.0.6a" __version__ = "0.0.6b"
__author__ = ["aikaterna", "billy/bollo/ati"] __author__ = ["aikaterna", "billy/bollo/ati"]
@ -37,6 +38,8 @@ class Audio:
default_guild = { default_guild = {
"dj_enabled": False, "dj_enabled": False,
"dj_role": None, "dj_role": None,
"emptydc_enabled": False,
"emptydc_timer": 0,
"jukebox": False, "jukebox": False,
"jukebox_price": 0, "jukebox_price": 0,
"playlists": {}, "playlists": {},
@ -195,6 +198,26 @@ class Audio:
await self.config.guild(ctx.guild).dj_enabled.set(not dj_enabled) await self.config.guild(ctx.guild).dj_enabled.set(not dj_enabled)
await self._embed_msg(ctx, "DJ role enabled: {}.".format(not dj_enabled)) await self._embed_msg(ctx, "DJ role enabled: {}.".format(not dj_enabled))
@audioset.command()
@checks.mod_or_permissions(administrator=True)
async def emptydisconnect(self, ctx, seconds: int):
"""Auto-disconnection after x seconds while stopped. 0 to disable."""
if seconds < 0:
return await self._embed_msg(ctx, "Can't be less than zero.")
if seconds < 10 and seconds > 0:
seconds = 10
if seconds == 0:
enabled = False
await self._embed_msg(ctx, "Empty disconnect disabled.")
else:
enabled = True
await self._embed_msg(
ctx, "Empty disconnect timer set to {}.".format(self._dynamic_time(seconds))
)
await self.config.guild(ctx.guild).emptydc_timer.set(seconds)
await self.config.guild(ctx.guild).emptydc_enabled.set(enabled)
@audioset.command() @audioset.command()
@checks.admin_or_permissions(manage_roles=True) @checks.admin_or_permissions(manage_roles=True)
async def role(self, ctx, role_name: discord.Role): async def role(self, ctx, role_name: discord.Role):
@ -240,12 +263,16 @@ class Audio:
global_data = await self.config.all() global_data = await self.config.all()
dj_role_obj = discord.utils.get(ctx.guild.roles, id=data["dj_role"]) dj_role_obj = discord.utils.get(ctx.guild.roles, id=data["dj_role"])
dj_enabled = data["dj_enabled"] dj_enabled = data["dj_enabled"]
emptydc_enabled = data["emptydc_enabled"]
emptydc_timer = data["emptydc_timer"]
jukebox = data["jukebox"] jukebox = data["jukebox"]
jukebox_price = data["jukebox_price"] jukebox_price = data["jukebox_price"]
jarbuild = redbot.core.__version__ jarbuild = redbot.core.__version__
vote_percent = data["vote_percent"] vote_percent = data["vote_percent"]
msg = "```ini\n" "----Server Settings----\n" msg = "```ini\n" "----Server Settings----\n"
if emptydc_enabled:
msg += "Disconnect timer: [{0}]\n".format(self._dynamic_time(emptydc_timer))
if dj_enabled: if dj_enabled:
msg += "DJ Role: [{}]\n".format(dj_role_obj.name) msg += "DJ Role: [{}]\n".format(dj_role_obj.name)
if jukebox: if jukebox:
@ -592,7 +619,7 @@ class Audio:
queue_duration = await self._queue_duration(ctx) queue_duration = await self._queue_duration(ctx)
queue_total_duration = lavalink.utils.format_time(queue_duration) queue_total_duration = lavalink.utils.format_time(queue_duration)
before_queue_length = len(player.queue) + 1 before_queue_length = len(player.queue)
if "list" in query and "ytsearch:" not in query: if "list" in query and "ytsearch:" not in query:
for track in tracks: for track in tracks:
@ -605,7 +632,7 @@ class Audio:
if not shuffle and queue_duration > 0: if not shuffle and queue_duration > 0:
embed.set_footer( embed.set_footer(
text="{} until start of playlist playback: starts at #{} in queue".format( text="{} until start of playlist playback: starts at #{} in queue".format(
queue_total_duration, before_queue_length queue_total_duration, before_queue_length + 1
) )
) )
if not player.current: if not player.current:
@ -621,11 +648,11 @@ class Audio:
if not shuffle and queue_duration > 0: if not shuffle and queue_duration > 0:
embed.set_footer( embed.set_footer(
text="{} until track playback: #{} in queue".format( text="{} until track playback: #{} in queue".format(
queue_total_duration, before_queue_length queue_total_duration, before_queue_length + 1
) )
) )
elif queue_duration > 0: elif queue_duration > 0:
embed.set_footer(text="#{} in queue".format(len(player.queue) + 1)) embed.set_footer(text="#{} in queue".format(len(player.queue)))
if not player.current: if not player.current:
await player.play() await player.play()
await ctx.send(embed=embed) await ctx.send(embed=embed)
@ -1196,10 +1223,10 @@ class Audio:
query = query.strip("<>") query = query.strip("<>")
if query.startswith("list "): if query.startswith("list "):
query = "ytsearch:{}".format(query.lstrip("list ")) query = "ytsearch:{}".format(query.replace("list ", ""))
tracks = await player.get_tracks(query) tracks = await player.get_tracks(query)
if not tracks: if not tracks:
return await self._embed_msg(ctx, "Nothing found 👀") return await self._embed_msg(ctx, "Nothing found.")
songembed = discord.Embed( songembed = discord.Embed(
colour=ctx.guild.me.top_role.colour, colour=ctx.guild.me.top_role.colour,
title="Queued {} track(s).".format(len(tracks)), title="Queued {} track(s).".format(len(tracks)),
@ -1218,12 +1245,12 @@ class Audio:
await player.play() await player.play()
return await ctx.send(embed=songembed) return await ctx.send(embed=songembed)
if query.startswith("sc "): if query.startswith("sc "):
query = "scsearch:{}".format(query.lstrip("sc ")) query = "scsearch:{}".format(query.replace("sc ", ""))
elif not query.startswith("http"): elif not query.startswith("http"):
query = "ytsearch:{}".format(query) query = "ytsearch:{}".format(query)
tracks = await player.get_tracks(query) tracks = await player.get_tracks(query)
if not tracks: if not tracks:
return await self._embed_msg(ctx, "Nothing found 👀") return await self._embed_msg(ctx, "Nothing found.")
len_search_pages = math.ceil(len(tracks) / 5) len_search_pages = math.ceil(len(tracks) / 5)
search_page_list = [] search_page_list = []
@ -1713,6 +1740,34 @@ class Audio:
if player.volume != volume: if player.volume != volume:
await player.set_volume(volume) await player.set_volume(volume)
async def disconnect_timer(self):
stop_times = {}
while self == self.bot.get_cog("Audio"):
for p in lavalink.players:
server = p.channel.guild
if server.id not in stop_times:
stop_times[server.id] = None
if p.current is None and [self.bot.user] == p.channel.members:
if stop_times[server.id] is None:
stop_times[server.id] = int(time.time())
for sid in stop_times:
server_obj = self.bot.get_guild(sid)
emptydc_enabled = await self.config.guild(server_obj).emptydc_enabled()
if emptydc_enabled:
if stop_times[sid] is not None and [self.bot.user] == p.channel.members:
emptydc_timer = await self.config.guild(server_obj).emptydc_timer()
if stop_times[sid] and (
int(time.time()) - stop_times[sid] > emptydc_timer
):
stop_times[sid] = None
await lavalink.get_player(sid).disconnect()
await asyncio.sleep(5)
@staticmethod @staticmethod
async def _draw_time(ctx): async def _draw_time(ctx):
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)