From 97fe10bb96816841881beadd7bf5f393cb691756 Mon Sep 17 00:00:00 2001 From: profitroll Date: Wed, 22 Mar 2023 20:59:50 +0100 Subject: [PATCH] Formatted with black --- cogs/cogCategory.py | 88 +++++++++++--- cogs/cogChannel.py | 122 +++++++++++++++---- cogs/cogLocale.py | 83 +++++++++++-- cogs/cogUtility.py | 35 ++++-- functions.py | 290 ++++++++++++++++++++++++++++++++------------ yusarin.py | 45 ++++--- 6 files changed, 509 insertions(+), 154 deletions(-) diff --git a/cogs/cogCategory.py b/cogs/cogCategory.py index 700aab5..a680c23 100644 --- a/cogs/cogCategory.py +++ b/cogs/cogCategory.py @@ -1,35 +1,91 @@ -from discord import ApplicationContext, Option, SlashCommandGroup, CategoryChannel +from discord import ApplicationContext, CategoryChannel, Option, SlashCommandGroup from discord.ext import commands -from functions import getMsg, guildConfGet, guildConfReset, guildConfSet, loadJson, makeEmbed, strToColor -#========================================================================================================================= +from functions import ( + getMsg, + guildConfGet, + guildConfReset, + guildConfSet, + loadJson, + makeEmbed, + strToColor, +) + + +# ========================================================================================================================= class CogCategory(commands.Cog): - def __init__(self, client): self.client = client - category = SlashCommandGroup("category", "Commands related to parent channels category") + category = SlashCommandGroup( + "category", "Commands related to parent channels category" + ) - @category.command(name="set", description="Select the voice channel that will be parent to private ones") - async def category_set(self, ctx: ApplicationContext, category: Option(CategoryChannel, "Parent Channel Category")): # type: ignore + @category.command( + name="set", + description="Select the voice channel that will be parent to private ones", + ) + async def category_set(self, ctx: ApplicationContext, category: Option(CategoryChannel, "Parent Channel Category")): # type: ignore config = loadJson("config.json") if ctx.guild is not None: guildConfSet(ctx.guild, "category", category.id) - await ctx.respond(embed=makeEmbed(title=getMsg("set_category_title", ctx.guild), description=getMsg("set_category_description", ctx.guild).format(category.name), color=strToColor(config["color_ok"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("set_category_title", ctx.guild), + description=getMsg("set_category_description", ctx.guild).format( + category.name + ), + color=strToColor(config["color_ok"]), + ) + ) if guildConfGet(ctx.guild, "channel") is None: - 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"]))) + 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"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("dm_title", ctx.guild), + description=getMsg("dm_description", ctx.guild), + color=strToColor(config["color_error"]), + ) + ) - @category.command(name="reset", description="Reset the currently selected parent channel category") - async def category_reset(self, ctx: ApplicationContext): # type: ignore + @category.command( + name="reset", description="Reset the currently selected parent channel category" + ) + async def category_reset(self, ctx: ApplicationContext): # type: ignore config = loadJson("config.json") if ctx.guild is not None: if guildConfGet(ctx.guild, "category") is not None: guildConfReset(ctx.guild, "category") - await ctx.respond(embed=makeEmbed(title=getMsg("reset_category_title", ctx.guild), description=getMsg("reset_category_description", ctx.guild), color=strToColor(config["color_ok"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("reset_category_title", ctx.guild), + description=getMsg("reset_category_description", ctx.guild), + color=strToColor(config["color_ok"]), + ) + ) else: - 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"]))) + 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"]))) -#========================================================================================================================= \ No newline at end of file + await ctx.respond( + embed=makeEmbed( + title=getMsg("dm_title", ctx.guild), + description=getMsg("dm_description", ctx.guild), + color=strToColor(config["color_error"]), + ) + ) + + +# ========================================================================================================================= diff --git a/cogs/cogChannel.py b/cogs/cogChannel.py index 91e74e9..170fffe 100644 --- a/cogs/cogChannel.py +++ b/cogs/cogChannel.py @@ -1,21 +1,46 @@ -from discord import ApplicationContext, SlashCommandGroup, VoiceChannel, Member, VoiceState, Cog, option, utils +from discord import ( + ApplicationContext, + Cog, + Member, + SlashCommandGroup, + VoiceChannel, + VoiceState, + option, + utils, +) from discord.ext import commands -from functions import appendLog, changeNomicPerms, createUserVoice, getMsg, guildConfGet, guildConfReset, guildConfSet, isUserVoice, isVoiceOfUser, loadJson, makeEmbed, removeUserVoice, strToColor -#========================================================================================================================= +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): - + 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): @@ -25,7 +50,7 @@ class CogChannel(commands.Cog): else: if loadJson("config.json")["enable_nomic"]: await changeNomicPerms("deny", vc_from, member) - + # If user joined vc else: if isUserVoice(vc_from): @@ -39,37 +64,92 @@ class CogChannel(commands.Cog): 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) + 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) - + 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") + @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"]))) + 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"]))) + 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"]))) + 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): + @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"]))) + 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"]))) + 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"]))) -#========================================================================================================================= \ No newline at end of file + await ctx.respond( + embed=makeEmbed( + title=getMsg("dm_title", ctx.guild), + description=getMsg("dm_description", ctx.guild), + color=strToColor(config["color_error"]), + ) + ) + + +# ========================================================================================================================= diff --git a/cogs/cogLocale.py b/cogs/cogLocale.py index e556fdd..3e1e3eb 100644 --- a/cogs/cogLocale.py +++ b/cogs/cogLocale.py @@ -1,11 +1,22 @@ from os import listdir + from discord import ApplicationContext, Option, SlashCommandGroup from discord.ext import commands -from functions import appendLog, getMsg, guildConfGet, guildConfReset, guildConfSet, loadJson, makeEmbed, strToColor -#========================================================================================================================= +from functions import ( + appendLog, + getMsg, + guildConfGet, + guildConfReset, + guildConfSet, + loadJson, + makeEmbed, + strToColor, +) + + +# ========================================================================================================================= class CogLocale(commands.Cog): - def __init__(self, client): self.client = client @@ -17,32 +28,78 @@ class CogLocale(commands.Cog): valid_locales.append(".".join(entry.split(".")[:-1])) @locale.command(name="set", description="Set bot's messages language") - async def locale_set(self, ctx: ApplicationContext, language: Option(str, "One of the languages in list", choices=valid_locales)): # type: ignore + async def locale_set(self, ctx: ApplicationContext, language: Option(str, "One of the languages in list", choices=valid_locales)): # type: ignore config = loadJson("config.json") if ctx.guild is not None: - if language+".json" in listdir(f"locale/"): + if language + ".json" in listdir(f"locale/"): guildConfSet(ctx.guild, "locale", language) appendLog(f"Server's locale is now set to {language}", ctx.guild) - await ctx.respond(embed=makeEmbed(title=getMsg("set_locale_title", ctx.guild), description=getMsg("set_locale_description", ctx.guild).format(getMsg("locale_name", ctx.guild)), color=strToColor(config["color_ok"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("set_locale_title", ctx.guild), + description=getMsg("set_locale_description", ctx.guild).format( + getMsg("locale_name", ctx.guild) + ), + color=strToColor(config["color_ok"]), + ) + ) else: valid_locales = [] files_locales = listdir(f"locale/") for entry in files_locales: valid_locales.append(entry.split(".")[:-1]) - await ctx.respond(embed=makeEmbed(title=getMsg("error_locale_title", ctx.guild), description=getMsg("error_locale_description", ctx.guild).format(", ".join(valid_locales)), color=strToColor(config["color_error"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("error_locale_title", ctx.guild), + description=getMsg( + "error_locale_description", ctx.guild + ).format(", ".join(valid_locales)), + color=strToColor(config["color_error"]), + ) + ) else: - await ctx.respond(embed=makeEmbed(title=getMsg("dm_title", ctx.guild), description=getMsg("dm_description", ctx.guild), color=strToColor(config["color_error"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("dm_title", ctx.guild), + description=getMsg("dm_description", ctx.guild), + color=strToColor(config["color_error"]), + ) + ) @locale.command(name="reset", description="Reset the bot's language in this guild") - async def locale_reset(self, ctx: ApplicationContext): # type: ignore + async def locale_reset(self, ctx: ApplicationContext): # type: ignore config = loadJson("config.json") if ctx.guild is not None: if guildConfGet(ctx.guild, "locale") is not None: guildConfReset(ctx.guild, "locale") appendLog(f"Server's locale has been reset", ctx.guild) - await ctx.respond(embed=makeEmbed(title=getMsg("reset_locale_title", ctx.guild), description=getMsg("reset_locale_description", ctx.guild).format(getMsg("locale_name", ctx.guild)), color=strToColor(config["color_ok"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("reset_locale_title", ctx.guild), + description=getMsg( + "reset_locale_description", ctx.guild + ).format(getMsg("locale_name", ctx.guild)), + color=strToColor(config["color_ok"]), + ) + ) else: - await ctx.respond(embed=makeEmbed(title=getMsg("hint_none_locale_title", ctx.guild), description=getMsg("hint_none_locale_description", ctx.guild).format(getMsg("locale_name", ctx.guild)), color=strToColor(config["color_warn"]))) + await ctx.respond( + embed=makeEmbed( + title=getMsg("hint_none_locale_title", ctx.guild), + description=getMsg( + "hint_none_locale_description", ctx.guild + ).format(getMsg("locale_name", 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"]))) -#========================================================================================================================= \ No newline at end of file + await ctx.respond( + embed=makeEmbed( + title=getMsg("dm_title", ctx.guild), + description=getMsg("dm_description", ctx.guild), + color=strToColor(config["color_error"]), + ) + ) + + +# ========================================================================================================================= diff --git a/cogs/cogUtility.py b/cogs/cogUtility.py index a5dff61..d4e67c1 100644 --- a/cogs/cogUtility.py +++ b/cogs/cogUtility.py @@ -1,40 +1,53 @@ from os import getpid, makedirs, system from shutil import rmtree -from discord import ApplicationContext, slash_command, Cog, Guild + +from discord import ApplicationContext, Cog, Guild, slash_command from discord.ext import commands + from functions import appendLog, getMsg, loadJson, makeEmbed, saveJson, strToColor -#========================================================================================================================= -class CogUtility(commands.Cog): +# ========================================================================================================================= +class CogUtility(commands.Cog): def __init__(self, client): self.client = client @Cog.listener() async def on_guild_join(self, guild: Guild): - makedirs(f"guilds/{str(guild.id)}", exist_ok=True) makedirs(f"guilds/{str(guild.id)}/channels", exist_ok=True) saveJson({}, f"guilds/{str(guild.id)}/config.json") - + appendLog(f"Joined guild '{guild}' with id {str(guild.id)}") @Cog.listener() async def on_guild_remove(self, guild: Guild): - try: rmtree(f"guilds/{str(guild.id)}") except: pass - + appendLog(f"Left guild '{guild}' with id {str(guild.id)}") @slash_command(name="shutdown", description="Restart the bot") async def shutdown(self, ctx: ApplicationContext): config = loadJson("config.json") - if ctx.author.id == config["owner"]: - await ctx.respond(embed=makeEmbed(description=getMsg("shutdown", ctx.guild).format(ctx.author), color=strToColor(config["color_default"]))) + if ctx.author.id == config["owner"]: + await ctx.respond( + embed=makeEmbed( + description=getMsg("shutdown", ctx.guild).format(ctx.author), + color=strToColor(config["color_default"]), + ) + ) system(f"kill -9 {str(getpid())}") else: - await ctx.respond(embed=makeEmbed(title=getMsg("admin_title", ctx.guild), description=getMsg("admin_description", ctx.guild), color=strToColor(config["color_error"]))) -#========================================================================================================================= \ No newline at end of file + await ctx.respond( + embed=makeEmbed( + title=getMsg("admin_title", ctx.guild), + description=getMsg("admin_description", ctx.guild), + color=strToColor(config["color_error"]), + ) + ) + + +# ========================================================================================================================= diff --git a/functions.py b/functions.py index 70a6139..7d6b713 100644 --- a/functions.py +++ b/functions.py @@ -1,14 +1,27 @@ -from gzip import open as gzipopen from datetime import datetime -from os import listdir, makedirs, remove, stat, path +from gzip import open as gzipopen +from os import listdir, makedirs, path, remove, stat from shutil import copyfileobj from typing import Any, Literal, Union -from discord import utils, Embed, TextChannel, VoiceChannel, PermissionOverwrite, Guild, CategoryChannel, Member, Client, ApplicationContext, Message + +from discord import ( + ApplicationContext, + CategoryChannel, + Client, + Embed, + Guild, + Member, + Message, + PermissionOverwrite, + TextChannel, + VoiceChannel, + utils, +) try: - from ujson import loads, dumps + from ujson import dumps, loads except ImportError: - from json import loads, dumps + from json import dumps, loads # path = Path(__file__).resolve().parent @@ -20,38 +33,42 @@ log_size = 512 debug = False try: - with open("config.json", 'r', encoding="utf-8") as json_file: + with open("config.json", "r", encoding="utf-8") as json_file: output = loads(json_file.read()) json_file.close() debug = output["debug"] except: debug = debug + # Check latest log size def checkSize(): - try: if not path.isdir("logs"): makedirs("logs", exist_ok=True) - + log = stat("logs/latest.log") global log_size if (log.st_size / 1024) > log_size: with open("logs/latest.log", "rb") as f_in: - with gzipopen(f'logs/{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.log.gz', 'wb') as f_out: + with gzipopen( + f'logs/{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.log.gz', "wb" + ) as f_out: copyfileobj(f_in, f_out) - print(f'Copied logs/{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.log.gz') + print( + f'Copied logs/{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.log.gz' + ) open("logs/latest.log", "w").close() except FileNotFoundError: - print('Not found') + print("Not found") pass + # Append string to log def appendLog(message: str, guild: Union[Guild, None] = None, announce=True) -> None: global debug - - + if guild == None: message_formatted = f'[{datetime.now().strftime("%d.%m.%Y")}] [{datetime.now().strftime("%H:%M:%S")}] {message}' else: @@ -59,25 +76,27 @@ def appendLog(message: str, guild: Union[Guild, None] = None, announce=True) -> message_formatted = f'[{datetime.now().strftime("%d.%m.%Y")}] [{datetime.now().strftime("%H:%M:%S")}] [{guild} | {str(guild.id)}] {message}' else: message_formatted = f'[{datetime.now().strftime("%d.%m.%Y")}] [{datetime.now().strftime("%H:%M:%S")}] [{guild}] {message}' - + if announce: print(message_formatted, flush=True) checkSize() - log = open('logs/latest.log', 'a') # type: ignore - log.write(f'{message_formatted}\n') + log = open("logs/latest.log", "a") # type: ignore + log.write(f"{message_formatted}\n") log.close() + def saveJson(value: Any, filename: str) -> None: - with open(filename, 'w', encoding="utf-8") as f: + with open(filename, "w", encoding="utf-8") as f: f.write(dumps(value, indent=4, ensure_ascii=False)) f.close() + def loadJson(filename: str) -> Any: global debug try: - with open(filename, 'r', encoding="utf-8") as json_file: + with open(filename, "r", encoding="utf-8") as json_file: output = loads(json_file.read()) json_file.close() except Exception as exp: @@ -86,19 +105,26 @@ def loadJson(filename: str) -> Any: output = {} return output + def colorToStr(): pass + def strToColor(string: str) -> int: return int(hex(int(string.replace("#", ""), 16)), 0) + def gotCommand(message: Message) -> None: global debug if debug: - appendLog(f"Command '{message.content}' from {message.author} ({str(message.author.id)})", message.guild) + appendLog( + f"Command '{message.content}' from {message.author} ({str(message.author.id)})", + message.guild, + ) else: appendLog(f"Command '{message.content}' from {message.author}", message.guild) + def guildConfGet(guild: Guild, variable: str) -> Any: global debug try: @@ -106,9 +132,12 @@ def guildConfGet(guild: Guild, variable: str) -> Any: return config[variable] except Exception as exp: if debug: - appendLog(f"Could not get guild config key '{variable}' due to {exp}", guild) + appendLog( + f"Could not get guild config key '{variable}' due to {exp}", guild + ) return None + def guildConfSet(guild: Guild, variable: str, value: Any) -> None: config = loadJson(f"guilds/{str(guild.id)}/config.json") config[variable] = value @@ -120,6 +149,7 @@ def guildConfSet(guild: Guild, variable: str, value: Any) -> None: saveJson(config, f"guilds/{str(guild.id)}/config.json") appendLog(f"Guild config key '{variable}' is now set to '{value}'", guild) + def guildConfReset(guild: Guild, variable: str) -> None: try: config = loadJson(f"guilds/{str(guild.id)}/config.json") @@ -134,6 +164,7 @@ def guildConfReset(guild: Guild, variable: str) -> None: except Exception as exp: appendLog(f"Could not reset guild config key '{variable}' due to {exp}", guild) + def guildLocaleGet(guild: Guild) -> str: config = loadJson(f"config.json") try: @@ -145,21 +176,28 @@ def guildLocaleGet(guild: Guild) -> str: else: return locale + def getMsg(string: str, guild: Union[Guild, None] = None) -> str: try: - locale = loadJson(f'locale/{guildLocaleGet(guild)}.json') + locale = loadJson(f"locale/{guildLocaleGet(guild)}.json") return locale["messages"][string] except Exception as exp: - appendLog(f"Could not get locale string named {string} due to exception {exp}", guild) + appendLog( + f"Could not get locale string named {string} due to exception {exp}", guild + ) return string -def makeEmbed(title="", description="", footer="", color=0xffffff) -> Embed: - embed=Embed(title=title, description=description, color=color) + +def makeEmbed(title="", description="", footer="", color=0xFFFFFF) -> Embed: + embed = Embed(title=title, description=description, color=color) if footer is not None: embed.set_footer(text=footer) return embed -def channelExists(number: int, guild: Guild, type: Literal["Any", "Text", "Voice"] = "Any") -> bool: + +def channelExists( + number: int, guild: Guild, type: Literal["Any", "Text", "Voice"] = "Any" +) -> bool: global debug if number == None: return False @@ -180,6 +218,7 @@ def channelExists(number: int, guild: Guild, type: Literal["Any", "Text", "Voice appendLog(f"Channel ID {str(number)} is not a channel due to {exp}") return False + def channelGetName(number: int, guild: Guild): global debug try: @@ -190,6 +229,7 @@ def channelGetName(number: int, guild: Guild): appendLog(f"Channel ID {str(number)} is not a channel due to {exp}") return "Channel doesn't exist" + def isUserVoice(vc: VoiceChannel) -> bool: try: channels_list = listdir(f"guilds/{str(vc.guild.id)}/channels/") @@ -199,68 +239,116 @@ def isUserVoice(vc: VoiceChannel) -> bool: return False except: return False - + + async def removeUserVoice(vc: VoiceChannel) -> None: global debug channels_list = listdir(f"guilds/{str(vc.guild.id)}/channels/") if f"{vc.id}.json" in channels_list: vc_file = f"guilds/{str(vc.guild.id)}/channels/{str(vc.id)}.json" vc_conf = loadJson(vc_file) - + needed_channel = utils.get(vc.guild.channels, id=vc.id) if loadJson("config.json")["enable_nomic"]: nomic_channel = utils.get(vc.guild.channels, id=vc_conf["nomic"]) - + remove(vc_file) - + await needed_channel.delete() if debug: - appendLog(f"Removed voice channel '{needed_channel}' ({str(needed_channel.id)}) of user with id {str(vc_conf['ownerid'])}", guild=vc.guild) + appendLog( + f"Removed voice channel '{needed_channel}' ({str(needed_channel.id)}) of user with id {str(vc_conf['ownerid'])}", + guild=vc.guild, + ) else: - appendLog(f"Removed voice channel '{needed_channel}' of user with id {str(vc_conf['ownerid'])}", guild=vc.guild) - + appendLog( + f"Removed voice channel '{needed_channel}' of user with id {str(vc_conf['ownerid'])}", + guild=vc.guild, + ) + if loadJson("config.json")["enable_nomic"]: await nomic_channel.delete() if debug: - appendLog(f"Removed nomic channel {nomic_channel} ({str(nomic_channel.id)}) of channel with id {str(needed_channel.id)}", guild=vc.guild) + appendLog( + f"Removed nomic channel {nomic_channel} ({str(nomic_channel.id)}) of channel with id {str(needed_channel.id)}", + guild=vc.guild, + ) else: - appendLog(f"Removed nomic channel '{nomic_channel}' of channel with id {str(needed_channel.id)}", guild=vc.guild) + appendLog( + f"Removed nomic channel '{nomic_channel}' of channel with id {str(needed_channel.id)}", + guild=vc.guild, + ) else: return -async def createUserVoice(vc: VoiceChannel, category: CategoryChannel, member: Member) -> VoiceChannel: + +async def createUserVoice( + vc: VoiceChannel, category: CategoryChannel, member: Member +) -> VoiceChannel: global debug chan = {} overwrites_channel = { vc.guild.default_role: PermissionOverwrite(view_channel=True), - vc.guild.me: PermissionOverwrite(read_messages=True, view_channel=True, manage_channels=True), - member: PermissionOverwrite(read_messages=True, view_channel=True, manage_channels=True) + vc.guild.me: PermissionOverwrite( + read_messages=True, view_channel=True, manage_channels=True + ), + member: PermissionOverwrite( + read_messages=True, view_channel=True, manage_channels=True + ), } overwrites_nomic = { - vc.guild.default_role: PermissionOverwrite(view_channel=False, read_messages=False), - vc.guild.me: PermissionOverwrite(read_messages=True, view_channel=True, manage_channels=True), - member: PermissionOverwrite(read_messages=True, view_channel=True, manage_channels=True) + vc.guild.default_role: PermissionOverwrite( + view_channel=False, read_messages=False + ), + vc.guild.me: PermissionOverwrite( + read_messages=True, view_channel=True, manage_channels=True + ), + member: PermissionOverwrite( + read_messages=True, view_channel=True, manage_channels=True + ), } - created_channel = await vc.guild.create_voice_channel(getMsg("name_voice", vc.guild).format(member.name), category=category, overwrites=overwrites_channel) + created_channel = await vc.guild.create_voice_channel( + getMsg("name_voice", vc.guild).format(member.name), + category=category, + overwrites=overwrites_channel, + ) if debug: - appendLog(f"Created voice channel '{created_channel}' ({str(created_channel.id)}) for user {member} ({str(member.id)})", guild=vc.guild) + appendLog( + f"Created voice channel '{created_channel}' ({str(created_channel.id)}) for user {member} ({str(member.id)})", + guild=vc.guild, + ) else: - appendLog(f"Created voice channel '{created_channel}' for user {member}", guild=vc.guild) + appendLog( + f"Created voice channel '{created_channel}' for user {member}", + guild=vc.guild, + ) if not path.isdir(f"guilds/{str(created_channel.guild.id)}/channels"): makedirs(f"guilds/{str(created_channel.guild.id)}/channels", exist_ok=True) vc_file = f"guilds/{str(created_channel.guild.id)}/channels/{str(created_channel.id)}.json" chan["ownerid"] = member.id saveJson(chan, vc_file) if loadJson("config.json")["enable_nomic"]: - nomic_channel = await vc.guild.create_text_channel(getMsg("name_nomic", vc.guild).format(created_channel.id), category=category, overwrites=overwrites_nomic, topic=getMsg("description_nomic", vc.guild).format(str(created_channel.id))) + nomic_channel = await vc.guild.create_text_channel( + getMsg("name_nomic", vc.guild).format(created_channel.id), + category=category, + overwrites=overwrites_nomic, + topic=getMsg("description_nomic", vc.guild).format(str(created_channel.id)), + ) if debug: - appendLog(f"Created nomic channel '{nomic_channel}' ({str(nomic_channel.id)}) for channel '{created_channel}' ({str(created_channel.id)})", guild=vc.guild) + appendLog( + f"Created nomic channel '{nomic_channel}' ({str(nomic_channel.id)}) for channel '{created_channel}' ({str(created_channel.id)})", + guild=vc.guild, + ) else: - appendLog(f"Created nomic channel '{nomic_channel}' for channel '{created_channel}'", guild=vc.guild) + appendLog( + f"Created nomic channel '{nomic_channel}' for channel '{created_channel}'", + guild=vc.guild, + ) chan["nomic"] = nomic_channel.id saveJson(chan, vc_file) return created_channel + def isVoiceOfUser(vc: VoiceChannel, member: Member) -> bool: vc_file = f"guilds/{str(vc.guild.id)}/channels/{str(vc.id)}.json" vc_conf = loadJson(vc_file) @@ -269,7 +357,10 @@ def isVoiceOfUser(vc: VoiceChannel, member: Member) -> bool: else: return False -async def changeNomicPerms(mode: Literal["deny", "allow"], vc: VoiceChannel, member: Member) -> None: + +async def changeNomicPerms( + mode: Literal["deny", "allow"], vc: VoiceChannel, member: Member +) -> None: vc_file = f"guilds/{str(vc.guild.id)}/channels/{str(vc.id)}.json" vc_conf = loadJson(vc_file) if loadJson("config.json")["enable_nomic"]: @@ -279,6 +370,7 @@ async def changeNomicPerms(mode: Literal["deny", "allow"], vc: VoiceChannel, mem else: await nomic_channel.set_permissions(member, view_channel=True) + async def clearTrash(client: Client): if not path.isdir(f"guilds/"): makedirs(f"guilds", exist_ok=True) @@ -290,8 +382,12 @@ async def clearTrash(client: Client): for channel in channels_list: channel_id = channel[:-5] try: - selected_channel = utils.get(guild_object.voice_channels, id=int(channel_id)) - channel_owner = loadJson(f"guilds/{guild}/channels/{channel}")["ownerid"] + selected_channel = utils.get( + guild_object.voice_channels, id=int(channel_id) + ) + channel_owner = loadJson(f"guilds/{guild}/channels/{channel}")[ + "ownerid" + ] remove_channel = True for member in selected_channel.members: if member.id == channel_owner: @@ -301,52 +397,82 @@ async def clearTrash(client: Client): except: remove(f"guilds/{guild}/channels/{channel_id}.json") -#async def autoClearTrash(client): - # execute clearTrash every 120 seconds + +# async def autoClearTrash(client): +# execute clearTrash every 120 seconds + def getHelpMessage(ctx: ApplicationContext, version: float) -> Embed: - - #channelExists(number, guild, type="Voice") - + # channelExists(number, guild, type="Voice") + config = loadJson("config.json") - + if ctx.guild is not None: - if channelExists(guildConfGet(ctx.guild, 'channel'), ctx.guild, type="Voice"): - desc_channel = getMsg("help_channel_set", guild=ctx.guild).format(channelGetName(guildConfGet(ctx.guild, 'channel'), ctx.guild)) + if channelExists(guildConfGet(ctx.guild, "channel"), ctx.guild, type="Voice"): + desc_channel = getMsg("help_channel_set", guild=ctx.guild).format( + channelGetName(guildConfGet(ctx.guild, "channel"), ctx.guild) + ) else: desc_channel = getMsg("help_channel_none", guild=ctx.guild) - - if channelExists(guildConfGet(ctx.guild, 'category'), ctx.guild, type="Any"): - desc_category = getMsg("help_category_set", guild=ctx.guild).format(channelGetName(guildConfGet(ctx.guild, 'category'), ctx.guild)) + + if channelExists(guildConfGet(ctx.guild, "category"), ctx.guild, type="Any"): + desc_category = getMsg("help_category_set", guild=ctx.guild).format( + channelGetName(guildConfGet(ctx.guild, "category"), ctx.guild) + ) else: desc_category = getMsg("help_category_none", guild=ctx.guild) - - desc_locale = getMsg("help_locale", guild=ctx.guild).format(getMsg("locale_name", ctx.guild)) + + desc_locale = getMsg("help_locale", guild=ctx.guild).format( + getMsg("locale_name", ctx.guild) + ) description = "\n".join([desc_locale, desc_channel, desc_category]) - embed=Embed(title=getMsg("help_title", ctx.guild), description=description, color=strToColor(config["color_default"])) + embed = Embed( + title=getMsg("help_title", ctx.guild), + description=description, + color=strToColor(config["color_default"]), + ) else: - embed=Embed(title=getMsg("help_title_dm", ctx.guild), color=strToColor(config["color_default"])) - - embed.set_author(name=f'{config["bot_name"]} v{str(version)}', url=config["bot_site"], icon_url=config["bot_icon"]) - + embed = Embed( + title=getMsg("help_title_dm", ctx.guild), + color=strToColor(config["color_default"]), + ) + + embed.set_author( + name=f'{config["bot_name"]} v{str(version)}', + url=config["bot_site"], + icon_url=config["bot_icon"], + ) + if ctx.author.id == config["owner"]: - embed.add_field(name=f"/shutdown", value=getMsg("help_cmd_shutdown", ctx.guild), inline=False) - - embed.add_field(name=f"/channel set", value=getMsg("help_cmd_channel", ctx.guild), inline=False) - embed.add_field(name=f"/category set", value=getMsg("help_cmd_category", ctx.guild), inline=False) - embed.add_field(name=f"/locale set", value=getMsg("help_cmd_locale", ctx.guild), inline=False) - + embed.add_field( + name=f"/shutdown", + value=getMsg("help_cmd_shutdown", ctx.guild), + inline=False, + ) + + embed.add_field( + name=f"/channel set", value=getMsg("help_cmd_channel", ctx.guild), inline=False + ) + embed.add_field( + name=f"/category set", + value=getMsg("help_cmd_category", ctx.guild), + inline=False, + ) + embed.add_field( + name=f"/locale set", value=getMsg("help_cmd_locale", ctx.guild), inline=False + ) + if ctx.guild is None: embed.set_footer(text=getMsg("help_server", ctx.guild)) else: embed.set_footer(text=getMsg("help_notice_id", ctx.guild)) - + return embed -async def guildConfigured(guild: Guild) -> str: +async def guildConfigured(guild: Guild) -> str: output = {} config = loadJson("config.json") @@ -354,10 +480,16 @@ async def guildConfigured(guild: Guild) -> str: if guildConfGet(guild, kind) is not None: try: guild_object = utils.get(guild.categories, id=guildConfGet(guild, kind)) - output[kind] = getMsg("configured_"+kind, guild).format(guild_object.name) + output[kind] = getMsg("configured_" + kind, guild).format( + guild_object.name + ) except Exception as exp: - output[kind] = getMsg("unconfigured_"+kind, guild) + output[kind] = getMsg("unconfigured_" + kind, guild) else: - output[kind] = getMsg("unconfigured_"+kind, guild) + output[kind] = getMsg("unconfigured_" + kind, guild) - return getMsg("server_config", guild).format(getMsg("info_locale", guild).format(getMsg("locale_name", guild)), output["channel"], output["category"]) + return getMsg("server_config", guild).format( + getMsg("info_locale", guild).format(getMsg("locale_name", guild)), + output["channel"], + output["category"], + ) diff --git a/yusarin.py b/yusarin.py index 7aafc2d..3c7d759 100644 --- a/yusarin.py +++ b/yusarin.py @@ -1,29 +1,42 @@ try: + from discord import Activity, ActivityType, ApplicationContext, Bot, Intents from requests import get - from discord import ApplicationContext, Intents, Bot, ActivityType, Activity, VoiceState except Exception as exp: - print(f"Dependencies not installed. Make sure to run 'pip install -r requirements.txt' before first start") + print( + f"Dependencies not installed. Make sure to run 'pip install -r requirements.txt' before first start" + ) exit() from os import getpid -from shutil import rmtree + from functions import * pid = getpid() version = 1.8 -if loadJson("config.json")["owner"] == "SET-OWNER-ID" or loadJson("config.json")["bot_token"] == "SET-BOT-TOKEN": - print(f"Bot is not correctly configured.\nMake sure you've set up owner id and bot token in 'config.json'\nLearn more here: https://git.end-play.xyz/profitroll/YusarinBot") +if ( + loadJson("config.json")["owner"] == "SET-OWNER-ID" + or loadJson("config.json")["bot_token"] == "SET-BOT-TOKEN" +): + print( + f"Bot is not correctly configured.\nMake sure you've set up owner id and bot token in 'config.json'\nLearn more here: https://git.end-play.xyz/profitroll/YusarinBot" + ) exit() if loadJson("config.json")["check_for_updates"]: try: - serv_ver = loads(get("https://api.end-play.xyz/version?app=yusarinbot&apikey=publickey").text)["version"] + serv_ver = loads( + get("https://api.end-play.xyz/version?app=yusarinbot&apikey=publickey").text + )["version"] if float(serv_ver) > version: - appendLog(f"YusarinBot version {serv_ver} is available. Download new version here: https://git.end-play.xyz/profitroll/YusarinBot/releases/latest") + appendLog( + f"YusarinBot version {serv_ver} is available. Download new version here: https://git.end-play.xyz/profitroll/YusarinBot/releases/latest" + ) appendLog(f"Currently using YusarinBot v{str(version)}") except Exception as exp: - appendLog(f"Could not get YusarinBot cloud version due to {exp}. Currently using {str(version)}") + appendLog( + f"Could not get YusarinBot cloud version due to {exp}. Currently using {str(version)}" + ) intents = Intents().all() client = Bot(intents=intents) @@ -33,25 +46,29 @@ from cogs.cogChannel import CogChannel from cogs.cogLocale import CogLocale from cogs.cogUtility import CogUtility + @client.slash_command(name="help", description="Get information about this server") async def help(ctx: ApplicationContext): await ctx.respond(embed=getHelpMessage(ctx, version)) + @client.event async def on_ready(): - appendLog(f"Logged in as {client.user}") - + config = loadJson("config.json") - - await client.change_presence(activity=Activity(type=ActivityType.listening, name=config["bot_activity"])) - + + await client.change_presence( + activity=Activity(type=ActivityType.listening, name=config["bot_activity"]) + ) + await clearTrash(client) + client.add_cog(CogCategory(client)) client.add_cog(CogChannel(client)) client.add_cog(CogLocale(client)) client.add_cog(CogUtility(client)) appendLog(f"Trying to log in...") -client.run(loadJson("config.json")["bot_token"]) \ No newline at end of file +client.run(loadJson("config.json")["bot_token"])