import random from itertools import islice from typing import List import disnake from disnake import OptionChoice, Option, OptionType from disnake.ext import commands from lib import logger, ListGenerator from lib import read_db from lib import play_audio # todo: write chose audio from list by slash command class Audio(commands.Cog, name='Audio'): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_ready(self): logger.info(f'Cog {__name__.split(".")[1]} is ready!.') # todo: complete check activity @commands.Cog.listener() async def on_voice_state_update(self, member, before, after): if before.channel is None and not member.bot: if any('Escape from Tarkov' in str(user.activity) for user in after.channel.members): logger.info('Skip playing by Game') else: # Prepare list of audio from lib.Comands import read_json _role = await read_json(member.guild.id, 'tigger_role') # Read audio from DB audio_db = await read_db(member.guild.id, member.id, 'defaulttracks') if audio_db is not None: audio = audio_db.split(', ') else: from lib.Comands import list_files audio = await list_files() if audio_db is not None: logger.info(f'Play audio from DB') await play_audio(f'audio/{random.choice(audio)}', self.bot, after.channel) elif len(member.roles) == 1 or _role is None: logger.info(f'Skip playing by role') elif any(str(role.id) in _role for role in member.roles): logger.info(f'Play audio from list by role') await play_audio(f'audio/{random.choice(audio)}', self.bot, after.channel) else: logger.info(f'Skip playing by any else') @commands.slash_command(name="play_audio", description="Make possible playing audio by command", options=[ Option(name="audio", type=OptionType.string, required=True ) ]) async def playaudio(self, inter: disnake.ApplicationCommandInteraction, audio: str ): if inter.author.voice is not None: await inter.response.send_message(f'Played {audio}', ephemeral=True) await play_audio(audio, self.bot, inter.author.voice.channel) else: await inter.response.send_message('You`re not in voice', ephemeral=True) @playaudio.autocomplete('audio') async def list_to_play(self, inter: disnake.ApplicationCommandInteraction, current: str): current = current.lower() _dict: dict = {} for f in ListGenerator('audio'): _dict[f.name] = f'{f.path}/{f.name}' return [ OptionChoice(name=choice, value=f'{_dict[choice]}') for choice in _dict if current in choice.lower() ] def setup(bot): # an extension must have a setup function bot.add_cog(Audio(bot)) # adding a cog