From 3759fce09084cf8466fd03001e33e6fe5c1dd79f Mon Sep 17 00:00:00 2001 From: aikaterna <20862007+aikaterna@users.noreply.github.com> Date: Sat, 9 Jun 2018 18:55:28 -0700 Subject: [PATCH] [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 --- redbot/cogs/audio/__init__.py | 1 + redbot/cogs/audio/audio.py | 73 ++++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/redbot/cogs/audio/__init__.py b/redbot/cogs/audio/__init__.py index 34968fd36..b63a2a6e6 100644 --- a/redbot/cogs/audio/__init__.py +++ b/redbot/cogs/audio/__init__.py @@ -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()) diff --git a/redbot/cogs/audio/audio.py b/redbot/cogs/audio/audio.py index 9401ccbb8..bac3054df 100644 --- a/redbot/cogs/audio/audio.py +++ b/redbot/cogs/audio/audio.py @@ -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)