from discord import ( ApplicationContext, Cog, Member, SlashCommandGroup, VoiceChannel, VoiceState, option, utils, ) from discord.ext import commands from discord.abc import GuildChannel from functions import ( appendLog, changeNomicPerms, createUserVoice, getMsg, guildConfGet, guildConfReset, guildConfSet, isUserVoice, isVoiceOfUser, loadJson, makeEmbed, removeUserVoice, strToColor, ) # ========================================================================================================================= class CogChannel(commands.Cog): def __init__(self, client): self.client = client @commands.Cog.listener() async def on_guild_channel_delete(self, channel: GuildChannel): if isUserVoice(channel): await removeUserVoice(channel) @Cog.listener() async def on_voice_state_update( self, member: Member, before: VoiceState, after: VoiceState ): config = loadJson("config.json") vc_from = before.channel vc_to = after.channel # If user left vc if before.channel is not None and len(before.channel.members) == 0: if isUserVoice(vc_from): if not isVoiceOfUser(vc_from, member): if loadJson("config.json")["enable_nomic"]: await changeNomicPerms("deny", vc_from, member) await removeUserVoice(vc_from) # If user joined vc if after.channel is not None and after.channel.id == guildConfGet( member.guild, "channel" ): if isUserVoice(vc_to): if loadJson("config.json")["enable_nomic"]: await changeNomicPerms("allow", vc_to, member) if vc_to.id == guildConfGet(vc_to.guild, "channel"): if guildConfGet(vc_to.guild, "category") is not None: voice_chan = await createUserVoice( vc_to, utils.get( vc_to.guild.categories, id=guildConfGet(vc_to.guild, "category"), ), member, ) try: await member.move_to(voice_chan) except: await removeUserVoice(voice_chan) else: appendLog( f"Category for guild {vc_to.guild} ({str(vc_to.guild.id)}) is not set", guild=vc_to.guild, ) channel = SlashCommandGroup("channel", "Commands related to parent voice channel") @channel.command( name="set", description="Select the voice channel that will be parent to private ones", ) @option("channel", description="Parent Voice Channel") async def channel_set(self, ctx: ApplicationContext, channel: VoiceChannel): config = loadJson("config.json") if ctx.guild is not None: guildConfSet(ctx.guild, "channel", channel.id) await ctx.respond( embed=makeEmbed( title=getMsg("set_channel_title", ctx.guild), description=getMsg("set_channel_description", ctx.guild).format( channel.name ), color=strToColor(config["color_ok"]), ) ) if guildConfGet(ctx.guild, "category") is None: await ctx.respond( embed=makeEmbed( title=getMsg("hint_none_category_title", ctx.guild), description=getMsg("hint_none_category_description", ctx.guild), color=strToColor(config["color_warn"]), ) ) else: await ctx.respond( embed=makeEmbed( title=getMsg("dm_title", ctx.guild), description=getMsg("dm_description", ctx.guild), color=strToColor(config["color_error"]), ) ) @channel.command( name="reset", description="Reset the currently selected parent voice channel" ) async def channel_reset(self, ctx: ApplicationContext): config = loadJson("config.json") if ctx.guild is not None: if guildConfGet(ctx.guild, "channel") is not None: guildConfReset(ctx.guild, "channel") await ctx.respond( embed=makeEmbed( title=getMsg("reset_channel_title", ctx.guild), description=getMsg("reset_channel_description", ctx.guild), color=strToColor(config["color_ok"]), ) ) else: await ctx.respond( embed=makeEmbed( title=getMsg("hint_none_channel_title", ctx.guild), description=getMsg("hint_none_channel_description", ctx.guild), color=strToColor(config["color_warn"]), ) ) else: await ctx.respond( embed=makeEmbed( title=getMsg("dm_title", ctx.guild), description=getMsg("dm_description", ctx.guild), color=strToColor(config["color_error"]), ) ) # =========================================================================================================================