41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
from discord import FFmpegOpusAudio, VoiceChannel, VoiceClient
|
|
|
|
from entity import File
|
|
|
|
|
|
class DiscordPlayer:
|
|
def __init__(self) -> None:
|
|
self.clients: dict[int, VoiceClient] = {}
|
|
self.timeout = 60
|
|
|
|
async def connect(self, guildId: int, voiceChannel: VoiceChannel) -> None:
|
|
if (
|
|
guildId not in self.clients
|
|
or self.clients[guildId] is None
|
|
or not self.clients[guildId].is_connected()
|
|
):
|
|
self.clients[guildId] = await voiceChannel.connect(timeout=self.timeout)
|
|
print(f"connect to {voiceChannel.name}")
|
|
|
|
async def disconnect(self, guildId: int) -> None:
|
|
if guildId in self.clients and self.clients[guildId].is_connected():
|
|
await self.clients[guildId].disconnect()
|
|
|
|
def play(
|
|
self, guildId: int, file: File | str, seekTime: int = 0, after=None
|
|
) -> None:
|
|
self.clients[guildId].play(
|
|
FFmpegOpusAudio(
|
|
file.name if isinstance(file, File) else file,
|
|
bitrate=256,
|
|
before_options="-ss %d" % seekTime,
|
|
options="-vn",
|
|
),
|
|
after=lambda error: self.clients[guildId].loop.create_task(after(error))
|
|
if after is not None
|
|
else None,
|
|
)
|
|
|
|
def stop(self, guildId) -> None:
|
|
self.clients[guildId].stop()
|