from typing import Dict from discord import Guild, Client, Embed from discord.ext import commands from discord.ext.commands import Context from Config.Config import Configs from Config.Helper import Helper from Controllers.ClearController import ClearController from Controllers.MoveController import MoveController from Controllers.NowPlayingController import NowPlayingController from Controllers.PlayerController import PlayersController from Controllers.RemoveController import RemoveController from Controllers.ResetController import ResetController from Controllers.ShuffleController import ShuffleController from Music.Player import Player from Utils.Utils import is_connected from Controllers.SkipController import SkipController from Controllers.PauseController import PauseController from Controllers.StopController import StopController from Controllers.ResumeController import ResumeController from Controllers.HistoryController import HistoryController from Controllers.QueueController import QueueController from Controllers.LoopController import LoopController from Views.EmoteView import EmoteView from Views.EmbedView import EmbedView helper = Helper() class Music(commands.Cog): def __init__(self, bot) -> None: self.__guilds: Dict[Guild, Player] = {} self.__bot: Client = bot self.__config = Configs() self.__controller = PlayersController(self.__bot) @commands.Cog.listener() async def on_ready(self) -> None: self.__controller = PlayersController(self.__bot) @commands.Cog.listener() async def on_guild_join(self, guild: Guild) -> None: """Load a player when joining a guild""" self.__guilds[guild] = Player(self.__bot, guild) print(f'Player for guild {guild.name} created') @commands.Cog.listener() async def on_guild_remove(self, guild: Guild) -> None: """Removes the player of the guild if banned""" if guild in self.__guilds.keys(): self.__guilds.pop(guild, None) print(f'Player for guild {guild.name} destroyed') @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 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) @commands.command(name="queue", help=helper.HELP_QUEUE, description=helper.HELP_QUEUE_LONG, aliases=['q', 'fila']) async def queue(self, ctx: Context) -> None: controller = QueueController(ctx, self.__bot) response = await controller.run() view2 = EmbedView(response) await view2.run() @commands.command(name="skip", help=helper.HELP_SKIP, description=helper.HELP_SKIP_LONG, aliases=['s', 'pular']) async def skip(self, ctx: Context) -> None: controller = SkipController(ctx, self.__bot) response = await controller.run() if response.success: view = EmoteView(response) else: view = EmbedView(response) await view.run() @commands.command(name='stop', help=helper.HELP_STOP, description=helper.HELP_STOP_LONG, aliases=['parar']) async def stop(self, ctx: Context) -> None: controller = StopController(ctx, self.__bot) response = await controller.run() if response.success: view = EmoteView(response) else: view = EmbedView(response) await view.run() @commands.command(name='pause', help=helper.HELP_PAUSE, description=helper.HELP_PAUSE_LONG, aliases=['pausar']) async def pause(self, ctx: Context) -> None: controller = PauseController(ctx, self.__bot) response = await controller.run() view1 = EmoteView(response) view2 = EmbedView(response) await view1.run() await view2.run() @commands.command(name='resume', help=helper.HELP_RESUME, description=helper.HELP_RESUME_LONG, aliases=['soltar']) async def resume(self, ctx: Context) -> None: controller = ResumeController(ctx, self.__bot) response = await controller.run() view1 = EmoteView(response) view2 = EmbedView(response) await view1.run() await view2.run() @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 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) @commands.command(name='history', help=helper.HELP_HISTORY, description=helper.HELP_HISTORY_LONG, aliases=['historico']) async def history(self, ctx: Context) -> None: controller = HistoryController(ctx, self.__bot) response = await controller.run() view1 = EmbedView(response) view2 = EmoteView(response) await view1.run() await view2.run() @commands.command(name='loop', help=helper.HELP_LOOP, description=helper.HELP_LOOP_LONG, aliases=['l', 'repeat']) async def loop(self, ctx: Context, args='') -> None: controller = LoopController(ctx, self.__bot) response = await controller.run(args) view1 = EmoteView(response) view2 = EmbedView(response) await view1.run() await view2.run() @commands.command(name='clear', help=helper.HELP_CLEAR, description=helper.HELP_CLEAR_LONG, aliases=['c', 'limpar']) async def clear(self, ctx: Context) -> None: controller = ClearController(ctx, self.__bot) response = await controller.run() view = EmoteView(response) await view.run() @commands.command(name='np', help=helper.HELP_NP, description=helper.HELP_NP_LONG, aliases=['playing', 'now']) async def now_playing(self, ctx: Context) -> None: controller = NowPlayingController(ctx, self.__bot) response = await controller.run() view1 = EmbedView(response) view2 = EmoteView(response) await view1.run() await view2.run() @commands.command(name='shuffle', help=helper.HELP_SHUFFLE, description=helper.HELP_SHUFFLE_LONG, aliases=['aleatorio']) async def shuffle(self, ctx: Context) -> None: controller = ShuffleController(ctx, self.__bot) response = await controller.run() view1 = EmbedView(response) view2 = EmoteView(response) await view1.run() await view2.run() @commands.command(name='move', help=helper.HELP_MOVE, description=helper.HELP_MOVE_LONG, aliases=['m', 'mover']) async def move(self, ctx: Context, pos1, pos2='1') -> None: controller = MoveController(ctx, self.__bot) response = await controller.run(pos1, pos2) view1 = EmbedView(response) view2 = EmoteView(response) await view1.run() await view2.run() @commands.command(name='remove', help=helper.HELP_REMOVE, description=helper.HELP_REMOVE_LONG, aliases=['remover']) async def remove(self, ctx: Context, position) -> None: controller = RemoveController(ctx, self.__bot) response = await controller.run(position) view1 = EmbedView(response) view2 = EmoteView(response) await view1.run() await view2.run() @commands.command(name='reset', help=helper.HELP_RESET, description=helper.HELP_RESET_LONG, aliases=['resetar']) async def reset(self, ctx: Context) -> None: controller = ResetController(ctx, self.__bot) response = await controller.run() view1 = EmbedView(response) view2 = EmoteView(response) await view1.run() await view2.run() async def __send_embed(self, ctx: Context, title='', description='', colour='grey') -> None: try: colour = self.__config.COLOURS[colour] except: colour = self.__config.COLOURS['grey'] embedvc = Embed( title=title, description=description, colour=colour ) await ctx.send(embed=embedvc) async def __clean_messages(self, ctx: Context) -> None: last_messages = await ctx.channel.history(limit=5).flatten() for message in last_messages: try: if message.author == self.__bot.user: if len(message.embeds) > 0: embed = message.embeds[0] if len(embed.fields) > 0: if embed.fields[0].name == 'Uploader:': await message.delete() except: continue def __get_player(self, ctx: Context) -> Player: return self.__controller.get_player(ctx.guild) def setup(bot): bot.add_cog(Music(bot))