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()