From 362ec02fe4160af7872d804cd08ca2fb8a0f9dba Mon Sep 17 00:00:00 2001 From: Rafael Vargas Date: Sat, 26 Mar 2022 12:19:25 -0400 Subject: [PATCH] Adding Play and Prev Controller --- Commands/Music.py | 40 ++++++++++--------------- Controllers/PlayController.py | 53 +++++++++++++++++++++++++++++++++ Controllers/PrevController.py | 55 +++++++++++++++++++++++++++++++++++ Music/Player.py | 8 ----- Views/Embeds.py | 8 +++++ 5 files changed, 132 insertions(+), 32 deletions(-) create mode 100644 Controllers/PlayController.py create mode 100644 Controllers/PrevController.py diff --git a/Commands/Music.py b/Commands/Music.py index 5186159..b514829 100644 --- a/Commands/Music.py +++ b/Commands/Music.py @@ -7,7 +7,9 @@ from Config.Helper import Helper from Controllers.ClearController import ClearController from Controllers.MoveController import MoveController from Controllers.NowPlayingController import NowPlayingController +from Controllers.PlayController import PlayController from Controllers.PlayerController import PlayersController +from Controllers.PrevController import PrevController from Controllers.RemoveController import RemoveController from Controllers.ResetController import ResetController from Controllers.ShuffleController import ShuffleController @@ -53,21 +55,14 @@ class Music(commands.Cog): @commands.command(name="play", help=helper.HELP_PLAY, description=helper.HELP_PLAY_LONG, aliases=['p', 'tocar']) async def play(self, ctx: Context, *args) -> None: - track = " ".join(args) - requester = ctx.author.name + controller = PlayController(ctx, self.__bot) - player = self.__get_player(ctx) - if player is None: - await self.__send_embed(ctx, self.__config.ERROR_TITLE, self.__config.NO_GUILD, 'red') - return - - if is_connected(ctx) is None: - success = await player.connect(ctx) - if success == False: - await self.__send_embed(ctx, self.__config.IMPOSSIBLE_MOVE, self.__config.NO_CHANNEL, 'red') - return - - await player.play(ctx, track, requester) + response = await controller.run(args) + if response is not None: + view1 = EmbedView(response) + view2 = EmoteView(response) + await view1.run() + await view2.run() @commands.command(name="queue", help=helper.HELP_QUEUE, description=helper.HELP_QUEUE_LONG, aliases=['q', 'fila']) async def queue(self, ctx: Context) -> None: @@ -123,17 +118,14 @@ class Music(commands.Cog): @commands.command(name='prev', help=helper.HELP_PREV, description=helper.HELP_PREV_LONG, aliases=['anterior']) async def prev(self, ctx: Context) -> None: - player = self.__get_player(ctx) - if player is None: - return + controller = PrevController(ctx, self.__bot) - if is_connected(ctx) is None: - success = await player.connect(ctx) - if success == False: - await self.__send_embed(ctx, self.__config.IMPOSSIBLE_MOVE, self.__config.NO_CHANNEL, 'red') - return - - await player.play_prev(ctx) + response = await controller.run() + if response is not None: + view1 = EmbedView(response) + view2 = EmoteView(response) + await view1.run() + await view2.run() @commands.command(name='history', help=helper.HELP_HISTORY, description=helper.HELP_HISTORY_LONG, aliases=['historico']) async def history(self, ctx: Context) -> None: diff --git a/Controllers/PlayController.py b/Controllers/PlayController.py new file mode 100644 index 0000000..6092f65 --- /dev/null +++ b/Controllers/PlayController.py @@ -0,0 +1,53 @@ +from discord.ext.commands import Context +from discord import Client +from Controllers.AbstractController import AbstractController +from Exceptions.Exceptions import ImpossibleMove, UnknownError +from Controllers.ControllerResponse import ControllerResponse + + +class PlayController(AbstractController): + def __init__(self, ctx: Context, bot: Client) -> None: + super().__init__(ctx, bot) + + async def run(self, args: str) -> ControllerResponse: + track = " ".join(args) + requester = self.ctx.author.name + + if not self.__user_connected(): + error = ImpossibleMove() + embed = self.embeds.NO_CHANNEL() + return ControllerResponse(self.ctx, embed, error) + + if not self.__is_connected(): + success = await self.__connect() + if not success: + error = UnknownError() + embed = self.embeds.UNKNOWN_ERROR() + return ControllerResponse(self.ctx, embed, error) + + await self.player.play(self.ctx, track, requester) + + def __user_connected(self) -> bool: + if self.ctx.author.voice: + return True + else: + return False + + def __is_connected(self) -> bool: + try: + voice_channel = self.guild.voice_client.channel + + if not self.guild.voice_client.is_connected(): + return False + else: + return True + except: + return False + + async def __connect(self) -> bool: + # if self.guild.voice_client is None: + try: + await self.ctx.author.voice.channel.connect(reconnect=True, timeout=None) + return True + except: + return False diff --git a/Controllers/PrevController.py b/Controllers/PrevController.py new file mode 100644 index 0000000..e2ad96b --- /dev/null +++ b/Controllers/PrevController.py @@ -0,0 +1,55 @@ +from discord.ext.commands import Context +from discord import Client +from Controllers.AbstractController import AbstractController +from Exceptions.Exceptions import ImpossibleMove, UnknownError +from Controllers.ControllerResponse import ControllerResponse + + +class PrevController(AbstractController): + def __init__(self, ctx: Context, bot: Client) -> None: + super().__init__(ctx, bot) + + async def run(self) -> ControllerResponse: + if len(self.player.playlist.history()) == 0: + error = ImpossibleMove() + embed = self.embeds.NOT_PREVIOUS_SONG() + return ControllerResponse(self.ctx, embed, error) + + if not self.__user_connected(): + error = ImpossibleMove() + embed = self.embeds.NO_CHANNEL() + return ControllerResponse(self.ctx, embed, error) + + if not self.__is_connected(): + success = await self.__connect() + if not success: + error = UnknownError() + embed = self.embeds.UNKNOWN_ERROR() + return ControllerResponse(self.ctx, embed, error) + + await self.player.play_prev(self.ctx) + + def __user_connected(self) -> bool: + if self.ctx.author.voice: + return True + else: + return False + + def __is_connected(self) -> bool: + try: + voice_channel = self.guild.voice_client.channel + + if not self.guild.voice_client.is_connected(): + return False + else: + return True + except: + return False + + async def __connect(self) -> bool: + # if self.guild.voice_client is None: + try: + await self.ctx.author.voice.channel.connect(reconnect=True, timeout=None) + return True + except: + return False diff --git a/Music/Player.py b/Music/Player.py index 68ed5d3..cedb658 100644 --- a/Music/Player.py +++ b/Music/Player.py @@ -36,14 +36,6 @@ class Player(commands.Cog): def playlist(self) -> Playlist: return self.__playlist - async def connect(self, ctx: Context) -> bool: - if not ctx.author.voice: - return False - - if self.__guild.voice_client == None: - await ctx.author.voice.channel.connect(reconnect=True, timeout=None) - return True - def __play_next(self, error, ctx: Context) -> None: if self.__force_stop: # If it's forced to stop player self.__force_stop = False diff --git a/Views/Embeds.py b/Views/Embeds.py index 5c6b237..bf40bf9 100644 --- a/Views/Embeds.py +++ b/Views/Embeds.py @@ -201,6 +201,14 @@ class Embeds: ) return embed + def NO_CHANNEL(self) -> Embed: + embed = Embed( + title=self.__config.IMPOSSIBLE_MOVE, + description=self.__config.NO_CHANNEL, + colour=self.__colors.BLACK + ) + return embed + def ERROR_DUE_LOOP_ONE_ON(self) -> Embed: embed = Embed( title=self.__config.BAD_COMMAND_TITLE,