pomice/examples/advanced_features.py

133 lines
4.4 KiB
Python

"""
Example usage of Pomice's integrated advanced features.
This example shows how easy it is to use:
- Integrated Track History (auto-tracking)
- Integrated Player Queue
- Integrated Analytics with player.get_stats()
- Playlist Import/Export
"""
import discord
from discord.ext import commands
import pomice
# Initialize bot
bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())
class IntegratedMusic(commands.Cog):
"""Music cog with integrated advanced features."""
def __init__(self, bot):
self.bot = bot
self.pomice = pomice.NodePool()
async def start_nodes(self):
"""Start Lavalink nodes."""
await self.pomice.create_node(
bot=self.bot,
host="127.0.0.1",
port="3030",
password="youshallnotpass",
identifier="MAIN",
)
@commands.command(name="play")
async def play(self, ctx, *, search: str):
"""Play a track using the integrated queue."""
if not ctx.voice_client:
await ctx.author.voice.channel.connect(cls=pomice.Player)
player: pomice.Player = ctx.voice_client
results = await player.get_tracks(query=search, ctx=ctx)
if not results:
return await ctx.send("No results found.")
if isinstance(results, pomice.Playlist):
player.queue.extend(results.tracks)
await ctx.send(f"Added playlist **{results.name}** ({len(results.tracks)} tracks).")
else:
track = results[0]
player.queue.put(track)
await ctx.send(f"Added **{track.title}** to queue.")
if not player.is_playing:
await player.do_next()
@commands.command(name="history")
async def history(self, ctx, limit: int = 10):
"""Show recently played tracks (tracked automatically!)."""
player: pomice.Player = ctx.voice_client
if not player:
return await ctx.send("Not connected.")
if player.history.is_empty:
return await ctx.send("No tracks in history.")
tracks = player.history.get_last(limit)
embed = discord.Embed(title="🎵 Recently Played", color=discord.Color.blue())
for i, track in enumerate(tracks, 1):
embed.add_field(name=f"{i}. {track.title}", value=f"by {track.author}", inline=False)
await ctx.send(embed=embed)
@commands.command(name="stats")
async def queue_stats(self, ctx):
"""Show detailed queue statistics via integrated get_stats()."""
player: pomice.Player = ctx.voice_client
if not player:
return await ctx.send("Not connected.")
stats = player.get_stats()
summary = stats.get_summary()
embed = discord.Embed(title="📊 Queue Statistics", color=discord.Color.green())
embed.add_field(name="Tracks", value=summary["total_tracks"], inline=True)
embed.add_field(name="Duration", value=summary["total_duration_formatted"], inline=True)
# Who added the most?
top_requesters = stats.get_top_requesters(3)
if top_requesters:
text = "\n".join(f"{u.display_name}: {c} tracks" for u, c in top_requesters)
embed.add_field(name="Top Requesters", value=text, inline=False)
await ctx.send(embed=embed)
@commands.command(name="export")
async def export_queue(self, ctx, filename: str = "my_playlist.json"):
"""Export current integrated queue."""
player: pomice.Player = ctx.voice_client
if not player or player.queue.is_empty:
return await ctx.send("Queue is empty.")
pomice.PlaylistManager.export_queue(
player.queue, f"playlists/{filename}", name=f"{ctx.guild.name}'s Playlist",
)
await ctx.send(f"✅ Queue exported to `playlists/{filename}`")
@commands.command(name="sort")
async def sort_queue(self, ctx):
"""Sort the queue using integrated utilities."""
player: pomice.Player = ctx.voice_client
if not player or player.queue.is_empty:
return await ctx.send("Queue is empty.")
# Use SearchHelper to sort the queue list
sorted_tracks = pomice.SearchHelper.sort_by_title(list(player.queue))
player.queue.clear()
player.queue.extend(sorted_tracks)
await ctx.send("✅ Queue sorted alphabetically.")
@bot.event
async def on_ready():
print(f"{bot.user} is ready!")
if __name__ == "__main__":
print("Example script ready for use!")