[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)
bot.add_cog(cog)
bot.loop.create_task(cog.disconnect_timer())
bot.loop.create_task(cog.init_config())

View File

@ -6,6 +6,7 @@ import heapq
import lavalink
import math
import re
import time
import redbot.core
from redbot.core import Config, commands, checks, bank
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__)
__version__ = "0.0.6a"
__version__ = "0.0.6b"
__author__ = ["aikaterna", "billy/bollo/ati"]
@ -37,6 +38,8 @@ class Audio:
default_guild = {
"dj_enabled": False,
"dj_role": None,
"emptydc_enabled": False,
"emptydc_timer": 0,
"jukebox": False,
"jukebox_price": 0,
"playlists": {},
@ -195,6 +198,26 @@ class Audio:
await self.config.guild(ctx.guild).dj_enabled.set(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()
@checks.admin_or_permissions(manage_roles=True)
async def role(self, ctx, role_name: discord.Role):
@ -240,12 +263,16 @@ class Audio:
global_data = await self.config.all()
dj_role_obj = discord.utils.get(ctx.guild.roles, id=data["dj_role"])
dj_enabled = data["dj_enabled"]
emptydc_enabled = data["emptydc_enabled"]
emptydc_timer = data["emptydc_timer"]
jukebox = data["jukebox"]
jukebox_price = data["jukebox_price"]
jarbuild = redbot.core.__version__
vote_percent = data["vote_percent"]
msg = "```ini\n" "----Server Settings----\n"
if emptydc_enabled:
msg += "Disconnect timer: [{0}]\n".format(self._dynamic_time(emptydc_timer))
if dj_enabled:
msg += "DJ Role: [{}]\n".format(dj_role_obj.name)
if jukebox:
@ -592,7 +619,7 @@ class Audio:
queue_duration = await self._queue_duration(ctx)
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:
for track in tracks:
@ -605,7 +632,7 @@ class Audio:
if not shuffle and queue_duration > 0:
embed.set_footer(
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:
@ -621,11 +648,11 @@ class Audio:
if not shuffle and queue_duration > 0:
embed.set_footer(
text="{} until track playback: #{} in queue".format(
queue_total_duration, before_queue_length
queue_total_duration, before_queue_length + 1
)
)
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:
await player.play()
await ctx.send(embed=embed)
@ -1196,10 +1223,10 @@ class Audio:
query = query.strip("<>")
if query.startswith("list "):
query = "ytsearch:{}".format(query.lstrip("list "))
query = "ytsearch:{}".format(query.replace("list ", ""))
tracks = await player.get_tracks(query)
if not tracks:
return await self._embed_msg(ctx, "Nothing found 👀")
return await self._embed_msg(ctx, "Nothing found.")
songembed = discord.Embed(
colour=ctx.guild.me.top_role.colour,
title="Queued {} track(s).".format(len(tracks)),
@ -1218,12 +1245,12 @@ class Audio:
await player.play()
return await ctx.send(embed=songembed)
if query.startswith("sc "):
query = "scsearch:{}".format(query.lstrip("sc "))
query = "scsearch:{}".format(query.replace("sc ", ""))
elif not query.startswith("http"):
query = "ytsearch:{}".format(query)
tracks = await player.get_tracks(query)
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)
search_page_list = []
@ -1713,6 +1740,34 @@ class Audio:
if player.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
async def _draw_time(ctx):
player = lavalink.get_player(ctx.guild.id)