diff --git a/royalpack/commands/play.py b/royalpack/commands/play.py index 90ca08e5..b12058d8 100644 --- a/royalpack/commands/play.py +++ b/royalpack/commands/play.py @@ -4,6 +4,7 @@ import discord from typing import * from royalnet.commands import * from royalnet.utils import * +from royalnet.backpack.tables import User, Discord class PlayCommand(Command): @@ -16,7 +17,7 @@ class PlayCommand(Command): syntax = "{url}" async def get_url(self, args: CommandArgs): - return args.joined() + return args.joined(require_at_least=1) async def run(self, args: CommandArgs, data: CommandData) -> None: # if not (url.startswith("http://") or url.startswith("https://")): @@ -33,30 +34,21 @@ class PlayCommand(Command): guild_id: Optional[int] = guild.id else: guild_id = None - response: Dict[str, Any] = await self.interface.call_herald_event("discord", "discord_play", - url=await self.get_url(args), - guild_id=guild_id) - too_long: List[Dict[str, Any]] = response["too_long"] - if len(too_long) > 0: - await data.reply(f"⚠ {len(too_long)} file non {'è' if len(too_long) == 1 else 'sono'}" - f" stat{'o' if len(too_long) == 1 else 'i'} scaricat{'o' if len(too_long) == 1 else 'i'}" - f" perchè durava{'' if len(too_long) == 1 else 'no'}" - f" più di [c]{self.config['Play']['max_song_duration']}[/c] secondi.") + user: User = await data.get_author() + user_str = None - added: List[Dict[str, Any]] = response["added"] - if len(added) > 0: - reply = f"▶️ Aggiunt{'o' if len(added) == 1 else 'i'} {len(added)} file alla coda:\n" - if self.interface.name == "discord": - await data.reply(reply) - for item in added: - embed = pickle.loads(base64.b64decode(bytes(item["stringified_base64_pickled_discord_embed"], - encoding="ascii"))) - # noinspection PyUnboundLocalVariable - await message.channel.send(embed=embed) + if user is not None: + try: + user_discord: Discord = user.discord[0] + except (AttributeError, IndexError): + user_str = str(user) else: - reply += numberemojiformat([a["title"] for a in added]) - await data.reply(reply) + user_str = str(f"<@{user_discord.discord_id}>") - if len(added) + len(too_long) == 0: - raise ExternalError("Nessun video trovato.") + self.loop.create_task(self.interface.call_herald_event("discord", "discord_play", + url=await self.get_url(args), + guild_id=guild_id, + user=user_str)) + + # await data.reply("✅ Richiesta di riproduzione inviata!") diff --git a/royalpack/events/discord_play.py b/royalpack/events/discord_play.py index 2ca09f0c..aaa5e380 100644 --- a/royalpack/events/discord_play.py +++ b/royalpack/events/discord_play.py @@ -6,6 +6,7 @@ from typing import * from royalnet.commands import * from royalnet.serf.discord import * from royalnet.bard import * +from royalnet.backpack.tables.users import User from ..utils import RoyalQueue @@ -15,18 +16,22 @@ class DiscordPlayEvent(Event): async def run(self, url: str, guild_id: Optional[int] = None, + user: Optional[str] = None, **kwargs) -> dict: if not isinstance(self.serf, DiscordSerf): raise UnsupportedError() + serf: DiscordSerf = self.serf + client: discord.Client = self.serf.client + # TODO: fix this in Royalnet sometime candidate_players: List[VoicePlayer] = [] - for player in self.serf.voice_players: + for player in serf.voice_players: player: VoicePlayer if not player.voice_client.is_connected(): continue if guild_id is not None: - guild = self.serf.client.get_guild(guild_id) + guild = client.get_guild(guild_id) if guild != player.voice_client.guild: continue candidate_players.append(player) @@ -37,8 +42,8 @@ class DiscordPlayEvent(Event): elif len(candidate_players) == 1: voice_player = candidate_players[0] else: - raise InvalidInputError("Non so in che Server riprodurre questo file...\n" - "Invia il comando su Discord, per favore!") + raise CommandError("Non so in che Server riprodurre questo file...\n" + "Invia il comando su Discord, per favore!") ytds = await YtdlDiscord.from_url(url) added: List[YtdlDiscord] = [] @@ -55,6 +60,30 @@ class DiscordPlayEvent(Event): await voice_player.start() else: raise CommandError(f"Non so come aggiungere musica a [c]{voice_player.playing.__class__.__qualname__}[/c]!") + + main_channel: discord.TextChannel = client.get_channel(self.config["Discord"]["main_channel_id"]) + + if len(added) > 0: + if user: + await main_channel.send(escape(f"▶️ {user} ha aggiunto {len(added)} file alla coda:")) + else: + await main_channel.send(escape(f"▶️ Aggiunt{'o' if len(added) == 1 else 'i'} {len(added)} file alla" + f" coda:")) + for ytd in added: + await main_channel.send(embed=ytd.embed()) + + if len(too_long) > 0: + if user: + await main_channel.send(escape( + f"⚠ {len(too_long)} file non {'è' if len(too_long) == 1 else 'sono'}" + f" stat{'o' if len(too_long) == 1 else 'i'} scaricat{'o' if len(too_long) == 1 else 'i'}" + f" perchè durava{'' if len(too_long) == 1 else 'no'}" + f" più di [c]{self.config['Play']['max_song_duration']}[/c] secondi." + )) + + if len(added) + len(too_long) == 0: + raise + return { "added": [{ "title": ytd.info.title, diff --git a/royalpack/stars/api_discord_play.py b/royalpack/stars/api_discord_play.py index 194a89e3..88c87af0 100644 --- a/royalpack/stars/api_discord_play.py +++ b/royalpack/stars/api_discord_play.py @@ -2,7 +2,6 @@ from typing import * from starlette.requests import Request from starlette.responses import * from royalnet.constellation import * -from royalnet.utils import * import logging @@ -14,12 +13,16 @@ class ApiDiscordPlayStar(PageStar): async def page(self, request: Request) -> JSONResponse: url = request.query_params.get("url", "") + user = request.query_params.get("user") try: guild_id: Optional[int] = int(request.query_params.get("guild_id", None)) except (ValueError, TypeError): guild_id = None log.info(f"Received request to play {url} on guild_id {guild_id} via web") - response = await self.interface.call_herald_event("discord", "discord_play", url=url, guild_id=guild_id) + response = await self.interface.call_herald_event("discord", "discord_play", + url=url, + guild_id=guild_id, + user=user) return JSONResponse(response, headers={ - "Access-Control-Allow-Origin": self.interface.config['Funkwhale']['instance_url'], + "Access-Control-Allow-Origin": "*", })