Source code for pylav.extension.red.ui.sources.player
from __future__ import annotations
from pathlib import Path
import discord
from redbot.core.i18n import Translator
from redbot.core.utils.chat_formatting import humanize_number
from redbot.vendored.discord.ext import menus
from pylav.extension.red.ui.menus.generic import BaseMenu
from pylav.extension.red.utils import rgetattr
from pylav.logging import getLogger
from pylav.players.player import Player
from pylav.type_hints.bot import DISCORD_COG_TYPE
LOGGER = getLogger("PyLav.ext.red.ui.sources.player")
_ = Translator("PyLav", Path(__file__))
[docs]
class PlayersSource(menus.ListPageSource):
def __init__(self, cog: DISCORD_COG_TYPE, specified_guild: int = None):
super().__init__([], per_page=1)
self.cog = cog
self.current_player = None
self.specified_guild = specified_guild
@property
def entries(self) -> list[Player]:
if self.specified_guild is not None and (player := self.cog.pylav.player_manager.get(self.specified_guild)):
return [player]
return self.cog.pylav.player_manager.connected_players
@entries.setter
def entries(self, players: list[Player]):
pass
[docs]
def get_max_pages(self):
if self.specified_guild is not None and (player := self.cog.pylav.player_manager.get(self.specified_guild)):
players = [player]
else:
players = self.cog.pylav.player_manager.connected_players
pages, left_over = divmod(len(players), self.per_page)
if left_over:
pages += 1
return pages or 1
[docs]
def get_starting_index_and_page_number(self, menu: BaseMenu) -> tuple[int, int]:
page_num = menu.current_page
start = page_num * self.per_page
return start, page_num
[docs]
async def format_page(self, menu: BaseMenu, player: Player) -> discord.Embed:
idx_start, page_num = self.get_starting_index_and_page_number(menu)
connect_dur = discord.utils.format_dt(player.connected_at, style="R")
self.current_player = player
guild_name = player.guild.name
queue_len = player.queue.size()
history_queue_len = player.history.size()
server_owner = f"{player.guild.owner} ({player.guild.owner.id})"
current_track = (
await player.current.get_track_display_name(max_length=50, with_url=True)
if player.current
else _("I am not currently playing anything on this server.")
)
listener_count = sum(True for m in iter(rgetattr(player, "channel.members", [])) if not m.bot)
listeners = humanize_number(listener_count)
current_track += "\n"
match queue_len:
case 1:
queue_length_translation = _("1 track")
case 0:
queue_length_translation = _("0 tracks")
case __:
queue_length_translation = _("{queue_length_variable_do_not_translate} tracks").format(
queue_length_variable_do_not_translate=humanize_number(queue_len)
)
match history_queue_len:
case 1:
history_queue_length_translation = _("1 track")
case 0:
history_queue_length_translation = _("0 tracks")
case __:
history_queue_length_translation = _("{history_queue_length_variable_do_not_translate} tracks").format(
history_queue_length_variable_do_not_translate=humanize_number(history_queue_len)
)
field_values = "\n".join(
f"**{i[0]}**: {i[1]}"
for i in [
(_("Server Owner"), server_owner),
(_("Connected"), connect_dur),
(_("Users in Voice Channel"), listeners),
(
_("Queue Length"),
queue_length_translation,
),
(
_("Queue History Length"),
history_queue_length_translation,
),
]
)
current_track += field_values
embed = await self.cog.pylav.construct_embed(messageable=menu.ctx, title=guild_name, description=current_track)
total_number_of_entries = len(self.entries)
current_page = humanize_number(page_num + 1)
total_number_of_pages = humanize_number(self.get_max_pages())
match total_number_of_entries:
case 1:
message = _("Page 1 / 1 | 1 server")
case 0:
message = _("Page 1 / 1 | 0 servers")
case __:
message = _(
"Page {current_page_variable_do_not_translate} / {total_number_of_pages_variable_do_not_translate} | {total_number_of_entries_variable_do_not_translate} servers"
).format(
current_page_variable_do_not_translate=current_page,
total_number_of_pages_variable_do_not_translate=total_number_of_pages,
total_number_of_entries_variable_do_not_translate=humanize_number(total_number_of_entries),
)
embed.set_footer(text=message)
return embed