import pomice import discord from discord.ext import commands class MyBot(commands.Bot): def __init__(self) -> None: super().__init__(command_prefix='!', activity=discord.Activity(type=discord.ActivityType.listening, name='to music!')) self.add_cog(Music(self)) async def on_ready(self) -> None: print("I'm online!") await self.cogs["Music"].start_nodes() class Music(commands.Cog): def __init__(self, bot) -> None: self.bot = bot # In order to initialize a node, or really do anything in this library, you need to make a node pool self.pomice = pomice.NodePool() async def start_nodes(self): # You can pass in Spotify credentials to enable Spotify querying. # If you do not pass in valid Spotify credentials, Spotify querying will not work await self.pomice.create_node(bot=self.bot, host='127.0.0.1', port='3030', password='youshallnotpass', identifier='MAIN') print(f"Node is ready!") @commands.command(aliases=['connect']) async def join(self, ctx: commands.Context, *, channel: discord.TextChannel = None) -> None: if not channel: channel = getattr(ctx.author.voice, 'channel', None) if not channel: raise commands.CheckFailure('You must be in a voice channel to use this command' 'without specifying the channel argument.') # With the release of discord.py 1.7, you can now add a compatible VoiceProtocol class as a argument # in channel.connect(). This library takes advantage of that and is how you initialize a player. await ctx.author.voice.channel.connect(cls=pomice.Player) await ctx.send(f'Joined the voice channel `{channel}`') @commands.command(aliases=['dc', 'disconnect']) async def leave(self, ctx: commands.Context): if not ctx.voice_client: raise commands.CommandError('No player detected') player: pomice.Player = ctx.voice_client await player.destroy() await ctx.send("Player has left the channel.") @commands.command(aliases=['p']) async def play(self, ctx, *, search: str) -> None: # Checks if the players in the channel before we play anything if not ctx.voice_client: await ctx.invoke(self.join) player: pomice.Player = ctx.voice_client # If you search a keyword, Pomice will automagically search the result using Youtube # You can pass in "search_type=" as an argument to change the search type # i.e: player.get_tracks("query", search_type=SearchType.ytmsearch) # will search up any keyword results on Youtube Music results = player.get_tracks(f"{search}") if not results: raise commands.CommandError('No results were found for that search term.') if isinstance(results, pomice.Playlist): await player.play(track=results.tracks[0]) else: await player.play(track=results[0]) @commands.command() async def pause(self, ctx): if not ctx.voice_client: raise commands.CommandError('No player detected') player: pomice.Player = ctx.voice_client if player.is_paused: await ctx.send("Player is already paused!") await player.set_pause(pause=True) await ctx.send("Player has been paused") @commands.command() async def resume(self, ctx): if not ctx.voice_client: raise commands.CommandError('No player detected') player: pomice.Player = ctx.voice_client if not player.is_paused: await ctx.send("Player is already playing!") await player.set_pause(pause=False) await ctx.send("Player has been resumed") @commands.command() async def stop(self, ctx): if not ctx.voice_client: raise commands.CommandError('No player detected') player: pomice.Player = ctx.voice_client if not player.is_playing: await ctx.send("Player is already stopped!") await player.stop() await ctx.send("Player has been stopped") bot = MyBot() bot.run("token here")