from discord import ApplicationContext, SlashCommandGroup, VoiceChannel, Member, VoiceState, Cog, option, utils from discord.ext import commands 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 @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 vc_to is None: if isUserVoice(vc_from): if isVoiceOfUser(vc_from, member): await removeUserVoice(vc_from) return else: if loadJson("config.json")["enable_nomic"]: await changeNomicPerms("deny", vc_from, member) # If user joined vc else: if isUserVoice(vc_from): if isVoiceOfUser(vc_from, member): await removeUserVoice(vc_from) else: if loadJson("config.json")["enable_nomic"]: await changeNomicPerms("deny", vc_from, member) 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"]))) #=========================================================================================================================