Advertisement
quab

Untitled

Jan 5th, 2025
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.37 KB | None | 0 0
  1. import asyncio
  2. import logging
  3. from typing import cast
  4.  
  5. import discord
  6. from discord.ext import commands
  7.  
  8. import wavelink
  9.  
  10.  
  11. class Bot(commands.Bot):
  12. def __init__(self) -> None:
  13. intents: discord.Intents = discord.Intents.default()
  14. intents.message_content = True
  15.  
  16. discord.utils.setup_logging(level=logging.INFO)
  17. super().__init__(command_prefix="?", intents=intents)
  18.  
  19. async def setup_hook(self) -> None:
  20. nodes = [wavelink.Node(uri="http://127.0.0.1:2333", password="youshallnotpass")]
  21.  
  22.  
  23. await wavelink.Pool.connect(nodes=nodes, client=self, cache_capacity=100)
  24.  
  25. async def on_ready(self) -> None:
  26. logging.info("Logged in: %s | %s", self.user, self.user.id)
  27.  
  28. async def on_wavelink_node_ready(self, payload: wavelink.NodeReadyEventPayload) -> None:
  29. logging.info("Wavelink Node connected: %r | Resumed: %s", payload.node, payload.resumed)
  30.  
  31. async def on_wavelink_track_start(self, payload: wavelink.TrackStartEventPayload) -> None:
  32. player: wavelink.Player | None = payload.player
  33. if not player:
  34.  
  35. return
  36.  
  37. original: wavelink.Playable | None = payload.original
  38. track: wavelink.Playable = payload.track
  39.  
  40. embed: discord.Embed = discord.Embed(title="Now Playing")
  41. embed.description = f"**{track.title}** by `{track.author}`"
  42.  
  43. if track.artwork:
  44. embed.set_image(url=track.artwork)
  45.  
  46. if original and original.recommended:
  47. embed.description += f"\n\n`This track was recommended via {track.source}`"
  48.  
  49. if track.album.name:
  50. embed.add_field(name="Album", value=track.album.name)
  51.  
  52. await player.home.send(embed=embed)
  53.  
  54.  
  55. bot: Bot = Bot()
  56.  
  57.  
  58. @bot.command()
  59. async def play(ctx: commands.Context, *, query: str) -> None:
  60. """Play a song with the given query."""
  61. if not ctx.guild:
  62. return
  63.  
  64. player: wavelink.Player
  65. player = cast(wavelink.Player, ctx.voice_client) # type: ignore
  66.  
  67. if not player:
  68. try:
  69. player = await ctx.author.voice.channel.connect(cls=wavelink.Player) # type: ignore
  70. except AttributeError:
  71. await ctx.send("Please join a voice channel first before using this command.")
  72. return
  73. except discord.ClientException:
  74. await ctx.send("I was unable to join this voice channel. Please try again.")
  75. return
  76.  
  77. player.autoplay = wavelink.AutoPlayMode.enabled
  78.  
  79. # Lock the player to this channel...
  80. if not hasattr(player, "home"):
  81. player.home = ctx.channel
  82. elif player.home != ctx.channel:
  83. await ctx.send(f"You can only play songs in {player.home.mention}, as the player has already started there.")
  84. return
  85.  
  86.  
  87. tracks: wavelink.Search = await wavelink.Playable.search(query)
  88. if not tracks:
  89. await ctx.send(f"{ctx.author.mention} - Could not find any tracks with that query. Please try again.")
  90. return
  91.  
  92. if isinstance(tracks, wavelink.Playlist):
  93. # tracks is a playlist...
  94. added: int = await player.queue.put_wait(tracks)
  95. await ctx.send(f"Added the playlist **`{tracks.name}`** ({added} songs) to the queue.")
  96. else:
  97. track: wavelink.Playable = tracks[0]
  98. await player.queue.put_wait(track)
  99. await ctx.send(f"Added **`{track}`** to the queue.")
  100.  
  101. if not player.playing:
  102.  
  103. await player.play(player.queue.get(), volume=30)
  104.  
  105.  
  106. try:
  107. await ctx.message.delete()
  108. except discord.HTTPException:
  109. pass
  110.  
  111.  
  112. @bot.command()
  113. async def skip(ctx: commands.Context) -> None:
  114. """Skip the current song."""
  115. player: wavelink.Player = cast(wavelink.Player, ctx.voice_client)
  116. if not player:
  117. return
  118.  
  119. await player.skip(force=True)
  120. await ctx.message.add_reaction("\u2705")
  121.  
  122.  
  123. @bot.command()
  124. async def nightcore(ctx: commands.Context) -> None:
  125. """Set the filter to a nightcore style."""
  126. player: wavelink.Player = cast(wavelink.Player, ctx.voice_client)
  127. if not player:
  128. return
  129.  
  130. filters: wavelink.Filters = player.filters
  131. filters.timescale.set(pitch=1.2, speed=1.2, rate=1)
  132. await player.set_filters(filters)
  133.  
  134. await ctx.message.add_reaction("\u2705")
  135.  
  136.  
  137. @bot.command(name="toggle", aliases=["pause", "resume"])
  138. async def pause_resume(ctx: commands.Context) -> None:
  139. """Pause or Resume the Player depending on its current state."""
  140. player: wavelink.Player = cast(wavelink.Player, ctx.voice_client)
  141. if not player:
  142. return
  143.  
  144. await player.pause(not player.paused)
  145. await ctx.message.add_reaction("\u2705")
  146.  
  147.  
  148. @bot.command()
  149. async def volume(ctx: commands.Context, value: int) -> None:
  150. """Change the volume of the player."""
  151. player: wavelink.Player = cast(wavelink.Player, ctx.voice_client)
  152. if not player:
  153. return
  154.  
  155. await player.set_volume(value)
  156. await ctx.message.add_reaction("\u2705")
  157.  
  158.  
  159. @bot.command(aliases=["dc"])
  160. async def disconnect(ctx: commands.Context) -> None:
  161. """Disconnect the Player."""
  162. player: wavelink.Player = cast(wavelink.Player, ctx.voice_client)
  163. if not player:
  164. return
  165.  
  166. await player.disconnect()
  167. await ctx.message.add_reaction("\u2705")
  168.  
  169.  
  170. async def main() -> None:
  171. async with bot:
  172. await bot.start(TOKEN)
  173.  
  174.  
  175. asyncio.run(main())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement