mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-26 12:43:01 -05:00
First commit - Bring everything from dev cog minus NSFW support
This commit is contained in:
@@ -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."),
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."))
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user