mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 11:18:54 -05:00
[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:
parent
470521f7c8
commit
3759fce090
@ -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())
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user