First commit - Bring everything from dev cog minus NSFW support

This commit is contained in:
Drapersniper
2020-09-25 16:58:31 +01:00
parent a6ff5b8e9c
commit 8e70b4cd59
39 changed files with 1321 additions and 243 deletions

View File

@@ -1,6 +1,7 @@
import asyncio
import contextlib
import logging
from typing import Union
import discord
@@ -951,6 +952,8 @@ class AudioSetCommands(MixinMeta, metaclass=CompositeMetaClass):
bumpped_shuffle = _("Enabled") if data["shuffle_bumped"] else _("Disabled")
song_notify = _("Enabled") if data["notify"] else _("Disabled")
song_status = _("Enabled") if global_data["status"] else _("Disabled")
persist_queue = _("Enabled") if data["persist_queue"] else _("Disabled")
countrycode = data["country_code"]
spotify_cache = CacheLevel.set_spotify()
@@ -992,6 +995,7 @@ class AudioSetCommands(MixinMeta, metaclass=CompositeMetaClass):
"Shuffle bumped: [{bumpped_shuffle}]\n"
"Song notify msgs: [{notify}]\n"
"Songs as status: [{status}]\n"
"Persist queue: [{persist_queue}]\n"
"Spotify search: [{countrycode}]\n"
).format(
countrycode=countrycode,
@@ -1000,6 +1004,7 @@ class AudioSetCommands(MixinMeta, metaclass=CompositeMetaClass):
notify=song_notify,
status=song_status,
bumpped_shuffle=bumpped_shuffle,
persist_queue=persist_queue,
)
if thumbnail:
msg += _("Thumbnails: [{0}]\n").format(
@@ -1050,16 +1055,22 @@ class AudioSetCommands(MixinMeta, metaclass=CompositeMetaClass):
+ _("Local Spotify cache: [{spotify_status}]\n")
+ _("Local Youtube cache: [{youtube_status}]\n")
+ _("Local Lavalink cache: [{lavalink_status}]\n")
# + _("Global cache status: [{global_cache}]\n")
# + _("Global timeout: [{num_seconds}]\n")
+ _("Global cache status: [{global_cache}]\n")
+ _("Global timeout: [{num_seconds}]\n")
).format(
max_age=str(await self.config.cache_age()) + " " + _("days"),
spotify_status=_("Enabled") if has_spotify_cache else _("Disabled"),
youtube_status=_("Enabled") if has_youtube_cache else _("Disabled"),
lavalink_status=_("Enabled") if has_lavalink_cache else _("Disabled"),
# global_cache=_("Enabled") if global_data["global_db_enabled"] else _("Disabled"),
# num_seconds=self.get_time_string(global_data["global_db_get_timeout"]),
global_cache=_("Enabled") if global_data["global_db_enabled"] else _("Disabled"),
num_seconds=self.get_time_string(global_data["global_db_get_timeout"]),
)
msg += (
"\n---"
+ _("User Settings")
+ "--- \n"
+ _("Spotify search: [{country_code}]\n")
).format(country_code=await self.config.user(ctx.author).country_code())
msg += (
"\n---"
@@ -1212,6 +1223,28 @@ class AudioSetCommands(MixinMeta, metaclass=CompositeMetaClass):
await self.config.guild(ctx.guild).country_code.set(country)
@command_audioset.command(name="mycountrycode")
@commands.guild_only()
async def command_audioset_countrycode_user(self, ctx: commands.Context, country: str):
"""Set the country code for Spotify searches."""
if len(country) != 2:
return await self.send_embed_msg(
ctx,
title=_("Invalid Country Code"),
description=_(
"Please use an official [ISO 3166-1 alpha-2]"
"(https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code."
),
)
country = country.upper()
await self.send_embed_msg(
ctx,
title=_("Setting Changed"),
description=_("Country Code set to {country}.").format(country=country),
)
await self.config.user(ctx.author).country_code.set(country)
@command_audioset.command(name="cache")
@commands.is_owner()
async def command_audioset_cache(self, ctx: commands.Context, *, level: int = None):
@@ -1315,3 +1348,71 @@ class AudioSetCommands(MixinMeta, metaclass=CompositeMetaClass):
msg += _("I've set the cache age to {age} days").format(age=age)
await self.config.cache_age.set(age)
await self.send_embed_msg(ctx, title=_("Setting Changed"), description=msg)
@commands.is_owner()
@command_audioset.group(name="globalapi")
async def command_audioset_audiodb(self, ctx: commands.Context):
"""Change globalapi settings."""
@command_audioset_audiodb.command(name="toggle")
async def command_audioset_audiodb_toggle(self, ctx: commands.Context):
"""Toggle the server settings.
Default is ON
"""
state = await self.config.global_db_enabled()
await self.config.global_db_enabled.set(not state)
await ctx.send(
_("Global DB is {status}").format(status=_("enabled") if not state else _("disabled"))
)
@command_audioset_audiodb.command(name="timeout")
async def command_audioset_audiodb_timeout(
self, ctx: commands.Context, timeout: Union[float, int]
):
"""Set GET request timeout.
Example: 0.1 = 100ms 1 = 1 second
"""
await self.config.global_db_get_timeout.set(timeout)
await ctx.send(_("Request timeout set to {time} second(s)").format(time=timeout))
@command_audioset.command(name="persistqueue")
@commands.admin()
async def command_audioset_persist_queue(self, ctx: commands.Context):
"""Toggle persistent queues.
Persistent queues allows the current queue to be restored when the queue closes.
"""
persist_cache = self._persist_queue_cache.setdefault(
ctx.guild.id, await self.config.guild(ctx.guild).persist_queue()
)
await self.config.guild(ctx.guild).persist_queue.set(not persist_cache)
self._persist_queue_cache[ctx.guild.id] = not persist_cache
await self.send_embed_msg(
ctx,
title=_("Setting Changed"),
description=_("Persisting queues: {true_or_false}.").format(
true_or_false=_("Enabled") if not persist_cache else _("Disabled")
),
)
@command_audioset.command(name="restart")
@commands.is_owner()
async def command_audioset_restart(self, ctx: commands.Context):
"""Restarts the lavalink connection."""
async with ctx.typing():
lavalink.unregister_event_listener(self.lavalink_event_handler)
await lavalink.close()
if self.player_manager is not None:
await self.player_manager.shutdown()
self.lavalink_restart_connect()
lavalink.register_event_listener(self.lavalink_event_handler)
await self.restore_players()
await self.send_embed_msg(
ctx,
title=_("Restarting Lavalink"),
description=_("It can take a couple of minutes for Lavalink to fully start up."),
)

View File

@@ -2,13 +2,15 @@ import asyncio
import contextlib
import datetime
import logging
from typing import Optional, Tuple, Union
import time
from typing import Optional, Union
import discord
import lavalink
from redbot.core.utils import AsyncIter
from redbot.core import commands
from redbot.core.utils import AsyncIter
from redbot.core.utils.chat_formatting import humanize_number
from redbot.core.utils.menus import start_adding_reactions
from redbot.core.utils.predicates import ReactionPredicate
@@ -67,6 +69,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
await self.config.custom("EQUALIZER", ctx.guild.id).eq_bands.set(eq.bands)
await player.stop()
await player.disconnect()
await self.api_interface.persistent_queue_api.drop(ctx.guild.id)
@commands.command(name="now")
@commands.guild_only()
@@ -91,7 +94,10 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
dur = "LIVE"
else:
dur = self.format_time(player.current.length)
song = self.get_track_description(player.current, self.local_folder_current_path) or ""
song = (
await self.get_track_description(player.current, self.local_folder_current_path)
or ""
)
song += _("\n Requested by: **{track.requester}**")
song += "\n\n{arrow}`{pos}`/`{dur}`"
song = song.format(track=player.current, arrow=arrow, pos=pos, dur=dur)
@@ -206,7 +212,9 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
if not player.current:
return await self.send_embed_msg(ctx, title=_("Nothing playing."))
description = self.get_track_description(player.current, self.local_folder_current_path)
description = await self.get_track_description(
player.current, self.local_folder_current_path
)
if player.current and not player.paused:
await player.pause()
@@ -262,6 +270,13 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
)
else:
track = player.fetch("prev_song")
track.extras.update(
{
"enqueue_time": int(time.time()),
"vc": player.channel.id,
"requester": ctx.author.id,
}
)
player.add(player.fetch("prev_requester"), track)
self.bot.dispatch("red_audio_track_enqueue", player.channel.guild, track, ctx.author)
queue_len = len(player.queue)
@@ -269,7 +284,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
player.queue.insert(0, bump_song)
player.queue.pop(queue_len)
await player.skip()
description = self.get_track_description(
description = await self.get_track_description(
player.current, self.local_folder_current_path
)
embed = discord.Embed(title=_("Replaying Track"), description=description)
@@ -406,8 +421,8 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
async def command_shuffle_bumpped(self, ctx: commands.Context):
"""Toggle bumped track shuffle.
Set this to disabled if you wish to avoid bumped songs being shuffled.
This takes priority over `[p]shuffle`.
Set this to disabled if you wish to avoid bumped songs being shuffled. This takes priority
over `[p]shuffle`.
"""
dj_enabled = self._dj_status_cache.setdefault(
ctx.guild.id, await self.config.guild(ctx.guild).dj_enabled()
@@ -581,6 +596,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
player.store("requester", None)
await player.stop()
await self.send_embed_msg(ctx, title=_("Stopping..."))
await self.api_interface.persistent_queue_api.drop(ctx.guild.id)
@commands.command(name="summon")
@commands.guild_only()
@@ -626,12 +642,14 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
await self.self_deafen(player)
else:
player = lavalink.get_player(ctx.guild.id)
if ctx.author.voice.channel == player.channel:
ctx.command.reset_cooldown(ctx)
return
await player.move_to(ctx.author.voice.channel)
await self.self_deafen(player)
except AttributeError:
ctx.command.reset_cooldown(ctx)
return await self.send_embed_msg(
@@ -774,7 +792,12 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
)
index_or_url -= 1
removed = player.queue.pop(index_or_url)
removed_title = self.get_track_description(removed, self.local_folder_current_path)
await self.api_interface.persistent_queue_api.played(
ctx.guild.id, removed.extras.get("enqueue_time")
)
removed_title = await self.get_track_description(
removed, self.local_folder_current_path
)
await self.send_embed_msg(
ctx,
title=_("Removed track from queue"),
@@ -787,6 +810,9 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
if track.uri != index_or_url:
clean_tracks.append(track)
else:
await self.api_interface.persistent_queue_api.played(
ctx.guild.id, track.extras.get("enqueue_time")
)
removed_tracks += 1
player.queue = clean_tracks
if removed_tracks == 0:
@@ -841,7 +867,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass):
bump_song.extras["bumped"] = True
player.queue.insert(0, bump_song)
removed = player.queue.pop(index)
description = self.get_track_description(removed, self.local_folder_current_path)
description = await self.get_track_description(removed, self.local_folder_current_path)
await self.send_embed_msg(
ctx, title=_("Moved track to the top of the queue."), description=description
)

View File

@@ -6,9 +6,9 @@ import random
import discord
import lavalink
from redbot.core.utils import AsyncIter
from redbot.core import commands
from redbot.core.utils import AsyncIter
from redbot.core.utils.chat_formatting import humanize_number, pagify
from redbot.core.utils.menus import DEFAULT_CONTROLS, menu
@@ -52,7 +52,7 @@ class MiscellaneousCommands(MixinMeta, metaclass=CompositeMetaClass):
try:
if not p.current:
raise AttributeError
current_title = self.get_track_description(
current_title = await self.get_track_description(
p.current, self.local_folder_current_path
)
msg += "{} [`{}`]: {}\n".format(p.channel.guild.name, connect_dur, current_title)

View File

@@ -2,20 +2,27 @@ import contextlib
import datetime
import logging
import math
from typing import MutableMapping, Optional
import time
from typing import MutableMapping
import discord
import lavalink
from discord.embeds import EmptyEmbed
from redbot.core.utils import AsyncIter
from discord.embeds import EmptyEmbed
from redbot.core import commands
from redbot.core.commands import UserInputOptional
from redbot.core.utils import AsyncIter
from redbot.core.utils.menus import DEFAULT_CONTROLS, close_menu, menu, next_page, prev_page
from ...audio_dataclasses import _PARTIALLY_SUPPORTED_MUSIC_EXT, Query
from ...audio_logging import IS_DEBUG
from ...errors import DatabaseError, QueryUnauthorized, SpotifyFetchError, TrackEnqueueError
from ...errors import (
DatabaseError,
QueryUnauthorized,
SpotifyFetchError,
TrackEnqueueError,
)
from ..abc import MixinMeta
from ..cog_utils import CompositeMetaClass, _
@@ -39,7 +46,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
title=_("Unable To Play Tracks"),
description=_("That URL is not allowed."),
)
elif not await self.is_query_allowed(self.config, ctx.guild, f"{query}", query_obj=query):
elif not await self.is_query_allowed(self.config, ctx, f"{query}", query_obj=query):
return await self.send_embed_msg(
ctx, title=_("Unable To Play Tracks"), description=_("That track is not allowed.")
)
@@ -64,6 +71,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
await self.self_deafen(player)
except AttributeError:
return await self.send_embed_msg(
ctx,
@@ -143,7 +151,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
title=_("Unable To Play Tracks"),
description=_("That URL is not allowed."),
)
elif not await self.is_query_allowed(self.config, ctx.guild, f"{query}", query_obj=query):
elif not await self.is_query_allowed(self.config, ctx, f"{query}", query_obj=query):
return await self.send_embed_msg(
ctx, title=_("Unable To Play Tracks"), description=_("That track is not allowed.")
)
@@ -168,6 +176,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
await self.self_deafen(player)
except AttributeError:
return await self.send_embed_msg(
ctx,
@@ -258,13 +267,12 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
)
if seek and seek > 0:
single_track.start_timestamp = seek * 1000
query = Query.process_input(single_track, self.local_folder_current_path)
if not await self.is_query_allowed(
self.config,
ctx.guild,
(
f"{single_track.title} {single_track.author} {single_track.uri} "
f"{str(Query.process_input(single_track, self.local_folder_current_path))}"
),
ctx,
f"{single_track.title} {single_track.author} {single_track.uri} " f"{str(query)}",
query_obj=query,
):
if IS_DEBUG:
log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
@@ -277,6 +285,13 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
elif guild_data["maxlength"] > 0:
if self.is_track_length_allowed(single_track, guild_data["maxlength"]):
single_track.requester = ctx.author
single_track.extras.update(
{
"enqueue_time": int(time.time()),
"vc": player.channel.id,
"requester": ctx.author.id,
}
)
player.queue.insert(0, single_track)
player.maybe_shuffle()
self.bot.dispatch(
@@ -293,12 +308,21 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
else:
single_track.requester = ctx.author
single_track.extras["bumped"] = True
single_track.extras.update(
{
"enqueue_time": int(time.time()),
"vc": player.channel.id,
"requester": ctx.author.id,
}
)
player.queue.insert(0, single_track)
player.maybe_shuffle()
self.bot.dispatch(
"red_audio_track_enqueue", player.channel.guild, single_track, ctx.author
)
description = self.get_track_description(single_track, self.local_folder_current_path)
description = await self.get_track_description(
single_track, self.local_folder_current_path
)
footer = None
if not play_now and not guild_data["shuffle"] and queue_dur > 0:
footer = _("{time} until track playback: #1 in queue").format(
@@ -416,6 +440,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
await self.self_deafen(player)
except AttributeError:
return await self.send_embed_msg(
ctx,
@@ -530,6 +555,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
await self.self_deafen(player)
except AttributeError:
return await self.send_embed_msg(
ctx,
@@ -603,10 +629,15 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
async def command_search(self, ctx: commands.Context, *, query: str):
"""Pick a track with a search.
Use `[p]search list <search term>` to queue all tracks found on YouTube.
Use `[p]search sc <search term>` will search SoundCloud instead of YouTube.
Use `[p]search list <search term>` to queue all tracks found on YouTube. Use `[p]search sc
<search term>` will search SoundCloud instead of YouTube.
"""
if not isinstance(query, (str, Query)):
raise RuntimeError(
f"Expect 'query' to be a string or Query object but recieved: {type(query)} is an unexpected argument type please report it."
)
async def _search_menu(
ctx: commands.Context,
pages: list,
@@ -654,6 +685,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
await self.self_deafen(player)
except AttributeError:
return await self.send_embed_msg(
ctx,
@@ -693,9 +725,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
title=_("Unable To Play Tracks"),
description=_("That URL is not allowed."),
)
if not await self.is_query_allowed(
self.config, ctx.guild, f"{query}", query_obj=query
):
if not await self.is_query_allowed(self.config, ctx, f"{query}", query_obj=query):
return await self.send_embed_msg(
ctx,
title=_("Unable To Play Tracks"),
@@ -762,13 +792,12 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
async for track in AsyncIter(tracks):
if len(player.queue) >= 10000:
continue
query = Query.process_input(track, self.local_folder_current_path)
if not await self.is_query_allowed(
self.config,
ctx.guild,
(
f"{track.title} {track.author} {track.uri} "
f"{str(Query.process_input(track, self.local_folder_current_path))}"
),
ctx,
f"{track.title} {track.author} {track.uri} " f"{str(query)}",
query_obj=query,
):
if IS_DEBUG:
log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
@@ -776,12 +805,26 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass):
elif guild_data["maxlength"] > 0:
if self.is_track_length_allowed(track, guild_data["maxlength"]):
track_len += 1
track.extras.update(
{
"enqueue_time": int(time.time()),
"vc": player.channel.id,
"requester": ctx.author.id,
}
)
player.add(ctx.author, track)
self.bot.dispatch(
"red_audio_track_enqueue", player.channel.guild, track, ctx.author
)
else:
track_len += 1
track.extras.update(
{
"enqueue_time": int(time.time()),
"vc": player.channel.id,
"requester": ctx.author.id,
}
)
player.add(ctx.author, track)
self.bot.dispatch(
"red_audio_track_enqueue", player.channel.guild, track, ctx.author

View File

@@ -4,22 +4,24 @@ import logging
import math
import os
import tarfile
import time
from io import BytesIO
from typing import Optional, cast
from typing import cast
import discord
import lavalink
from redbot.core.utils import AsyncIter
from redbot.core import commands
from redbot.core.commands import UserInputOptional
from redbot.core.data_manager import cog_data_path
from redbot.core.utils import AsyncIter
from redbot.core.utils.chat_formatting import bold, pagify
from redbot.core.utils.menus import DEFAULT_CONTROLS, menu
from redbot.core.utils.predicates import MessagePredicate
from ...apis.api_utils import FakePlaylist
from ...apis.playlist_interface import create_playlist, delete_playlist, get_all_playlist, Playlist
from ...apis.playlist_interface import Playlist, create_playlist, delete_playlist, get_all_playlist
from ...audio_dataclasses import LocalPath, Query
from ...audio_logging import IS_DEBUG, debug_exc_log
from ...converters import ComplexScopeParser, ScopeParser
@@ -48,7 +50,6 @@ class PlaylistCommands(MixinMeta, metaclass=CompositeMetaClass):
**User**:
Visible to all bot users, if --author is passed.
Editable by bot owner and creator.
"""
@command_playlist.command(
@@ -1368,7 +1369,7 @@ class PlaylistCommands(MixinMeta, metaclass=CompositeMetaClass):
else:
return await self.send_embed_msg(
ctx,
title=_("Playlist Couldn't Be Created"),
title=_("Playlist Couldn't be created"),
description=_("Unable to create your playlist."),
)
@@ -1472,13 +1473,12 @@ class PlaylistCommands(MixinMeta, metaclass=CompositeMetaClass):
async for track in AsyncIter(tracks):
if len(player.queue) >= 10000:
continue
query = Query.process_input(track, self.local_folder_current_path)
if not await self.is_query_allowed(
self.config,
ctx.guild,
(
f"{track.title} {track.author} {track.uri} "
f"{str(Query.process_input(track, self.local_folder_current_path))}"
),
ctx,
f"{track.title} {track.author} {track.uri} " f"{str(query)}",
query_obj=query,
):
if IS_DEBUG:
log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
@@ -1492,7 +1492,13 @@ class PlaylistCommands(MixinMeta, metaclass=CompositeMetaClass):
continue
if maxlength > 0 and not self.is_track_length_allowed(track, maxlength):
continue
track.extras.update(
{
"enqueue_time": int(time.time()),
"vc": player.channel.id,
"requester": ctx.author.id,
}
)
player.add(author_obj, track)
self.bot.dispatch(
"red_audio_track_enqueue", player.channel.guild, track, ctx.author
@@ -1800,7 +1806,9 @@ class PlaylistCommands(MixinMeta, metaclass=CompositeMetaClass):
)
try:
async with self.session.request("GET", file_url) as r:
uploaded_playlist = await r.json(content_type="text/plain", encoding="utf-8")
uploaded_playlist = await r.json(
content_type="text/plain", encoding="utf-8", loads=json.loads
)
except UnicodeDecodeError:
return await self.send_embed_msg(ctx, title=_("Not a valid playlist file."))

View File

@@ -3,13 +3,14 @@ import contextlib
import datetime
import logging
import math
from typing import MutableMapping, Optional, Union, Tuple
from typing import MutableMapping, Optional
import discord
import lavalink
from redbot.core.utils import AsyncIter
from redbot.core import commands
from redbot.core.utils import AsyncIter
from redbot.core.utils.menus import (
DEFAULT_CONTROLS,
close_menu,
@@ -66,7 +67,10 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
dur = "LIVE"
else:
dur = self.format_time(player.current.length)
song = self.get_track_description(player.current, self.local_folder_current_path) or ""
song = (
await self.get_track_description(player.current, self.local_folder_current_path)
or ""
)
song += _("\n Requested by: **{track.requester}**")
song += "\n\n{arrow}`{pos}`/`{dur}`"
song = song.format(track=player.current, arrow=arrow, pos=pos, dur=dur)
@@ -186,6 +190,10 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
title=_("Unable To Clear Queue"),
description=_("You need the DJ role to clear the queue."),
)
async for track in AsyncIter(player.queue):
await self.api_interface.persistent_queue_api.played(
ctx.guild.id, track.extras.get("enqueue_time")
)
player.queue.clear()
await self.send_embed_msg(
ctx, title=_("Queue Modified"), description=_("The queue has been cleared.")
@@ -220,6 +228,9 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
if track.requester in listeners:
clean_tracks.append(track)
else:
await self.api_interface.persistent_queue_api.played(
ctx.guild.id, track.extras.get("enqueue_time")
)
removed_tracks += 1
player.queue = clean_tracks
if removed_tracks == 0:
@@ -252,6 +263,9 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
clean_tracks.append(track)
else:
removed_tracks += 1
await self.api_interface.persistent_queue_api.played(
ctx.guild.id, track.extras.get("enqueue_time")
)
player.queue = clean_tracks
if removed_tracks == 0:
await self.send_embed_msg(ctx, title=_("Removed 0 tracks."))
@@ -325,6 +339,7 @@ class QueueCommands(MixinMeta, metaclass=CompositeMetaClass):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store("connect", datetime.datetime.utcnow())
await self.self_deafen(player)
except AttributeError:
ctx.command.reset_cooldown(ctx)
return await self.send_embed_msg(