diff --git a/config.json b/config.json index d1cb2ae..920507e 100644 --- a/config.json +++ b/config.json @@ -1,4 +1,5 @@ { + "debug": false, "owner": SET-OWNER-ID, "bot_name": "Yusa Nishimori", "bot_token": "SET-BOT-TOKEN", diff --git a/functions.py b/functions.py index b6a7fc5..bb94baf 100644 --- a/functions.py +++ b/functions.py @@ -11,6 +11,19 @@ path = Path(__file__).resolve().parent log_size = 512 +# This is the default option for "debug" key in +# file config.json, so if cebug is not set in it +# bot will use this value instead. +debug = False + +try: + with open(filename, 'r', encoding="utf-8") as json_file: + output = json.load(json_file) + json_file.close() + debug = output["debug"] +except: + debug = debug + # Check latest log size def checkSize(): global path @@ -34,12 +47,20 @@ def checkSize(): pass # Append string to log -def appendLog(message, guild="none"): +def appendLog(message, guild=None, announce=True): + global debug global path - message_formatted = f'[{datetime.now().strftime("%d.%m.%Y")}] [{datetime.now().strftime("%H:%M:%S")}] [{str(guild)}] {message}' + if guild == None: + message_formatted = f'[{datetime.now().strftime("%d.%m.%Y")}] [{datetime.now().strftime("%H:%M:%S")}] {message}' + else: + if debug: + 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}' - print(message_formatted) + if announce: + print(message_formatted) checkSize() @@ -53,50 +74,67 @@ def saveJson(value, filename): f.close() def loadJson(filename): + global debug try: with open(filename, 'r', encoding="utf-8") as json_file: output = json.load(json_file) json_file.close() except Exception as exp: - appendLog(f"Could not get contents of json file {filename} due to exception {exp}") + if debug: + appendLog(f"Could not load json file {filename} due to exception {exp}") output = {} return output +def gotCommand(message): + global debug + if debug: + 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, variable): global path - config = loadJson(f"{path}/guilds/{str(guild)}/config.json") + global debug try: + config = loadJson(f"{path}/guilds/{str(guild.id)}/config.json") return config[variable] - except: + except Exception as exp: + if debug: + appendLog(f"Could not get guild config key '{variable}' due to {exp}", guild) return None def guildConfSet(guild, variable, value): global path - config = loadJson(f"{path}/guilds/{str(guild)}/config.json") + config = loadJson(f"{path}/guilds/{str(guild.id)}/config.json") config[variable] = value try: - saveJson(config, f"{path}/guilds/{str(guild)}/config.json") + saveJson(config, f"{path}/guilds/{str(guild.id)}/config.json") except: - os.mkdir(f"{path}/guilds/{str(guild)}") - os.mkdir(f"{path}/guilds/{str(guild)}/channels") - saveJson(config, f"{path}/guilds/{str(guild)}/config.json") + os.mkdir(f"{path}/guilds/{str(guild.id)}") + os.mkdir(f"{path}/guilds/{str(guild.id)}/channels") + saveJson(config, f"{path}/guilds/{str(guild.id)}/config.json") + appendLog(f"Guild config key '{variable}' is now set to '{value}'", guild) def guildConfReset(guild, variable): global path - config = loadJson(f"{path}/guilds/{str(guild)}/config.json") - del config[variable] try: - saveJson(config, f"{path}/guilds/{str(guild)}/config.json") - except: - os.mkdir(f"{path}/guilds/{str(guild)}") - os.mkdir(f"{path}/guilds/{str(guild)}/channels") - saveJson(config, f"{path}/guilds/{str(guild)}/config.json") + config = loadJson(f"{path}/guilds/{str(guild.id)}/config.json") + del config[variable] + try: + saveJson(config, f"{path}/guilds/{str(guild.id)}/config.json") + except: + os.mkdir(f"{path}/guilds/{str(guild.id)}") + os.mkdir(f"{path}/guilds/{str(guild.id)}/channels") + saveJson(config, f"{path}/guilds/{str(guild.id)}/config.json") + appendLog(f"Guild config key '{variable}' has been reset", guild) + except Exception as exp: + appendLog(f"Could not reset guild config key '{variable}' due to {exp}", guild) def guildLocaleGet(guild): global path config = loadJson(f"{path}/config.json") try: - locale = guildConfGet(guild.id, "locale") + locale = guildConfGet(guild, "locale") except: return config["bot_locale"] if locale is None: @@ -104,14 +142,14 @@ def guildLocaleGet(guild): else: return locale -def getMsg(string, guild): +def getMsg(string, guild=None): global path config = loadJson("config.json") try: locale = loadJson(f'{path}/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}") + appendLog(f"Could not get locale string named {string} due to exception {exp}", guild) return f"Could not get locale string {string}" def isUserVoice(vc): @@ -127,6 +165,7 @@ def isUserVoice(vc): async def removeUserVoice(vc): global path + global debug channels_list = os.listdir(f"{path}/guilds/{str(vc.guild.id)}/channels/") if f"{vc.id}.json" in channels_list: vc_file = f"{path}/guilds/{str(vc.guild.id)}/channels/{str(vc.id)}.json" @@ -138,14 +177,21 @@ async def removeUserVoice(vc): os.remove(vc_file) await needed_channel.delete() - appendLog(f"Removed voice channel {str(needed_channel.id)} of user {str(vc_conf['ownerid'])}", guild=vc.guild.id) + if debug: + 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) await nomic_channel.delete() - appendLog(f"Removed nomic channel {str(nomic_channel.id)} of channel {str(needed_channel.id)}", guild=vc.guild.id) + if debug: + 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) else: return async def createUserVoice(vc, category, member): global path + global debug chan = {} overwrites_channel = { vc.guild.default_role: discord.PermissionOverwrite(view_channel=True), @@ -158,14 +204,20 @@ async def createUserVoice(vc, category, member): member: discord.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) - appendLog(f"Created voice channel {str(created_channel.id)} for user {str(member.id)}", guild=vc.guild.id) + if debug: + 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) if not os.path.isdir(f"{path}/guilds/{str(created_channel.guild.id)}/channels"): os.mkdir(f"{path}/guilds/{str(created_channel.guild.id)}/channels") vc_file = f"{path}/guilds/{str(created_channel.guild.id)}/channels/{str(created_channel.id)}.json" chan["ownerid"] = member.id saveJson(chan, vc_file) 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))) - appendLog(f"Created nomic channel {str(nomic_channel.id)} for channel {str(created_channel.id)}", guild=vc.guild.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) + else: + 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 @@ -221,16 +273,16 @@ async def guildConfigured(guild): config = loadJson("config.json") for kind in ["channel", "category", "prefix"]: - if guildConfGet(guild.id, kind) is not None: + if guildConfGet(guild, kind) is not None: try: if kind == "channel": - guild_object = discord.utils.get(guild.channels, id=guildConfGet(guild.id, kind)) + guild_object = discord.utils.get(guild.channels, id=guildConfGet(guild, kind)) output[kind] = getMsg("configured_"+kind, guild).format(guild_object.name) elif kind == "category": - guild_object = discord.utils.get(guild.categories, id=guildConfGet(guild.id, kind)) + guild_object = discord.utils.get(guild.categories, id=guildConfGet(guild, kind)) output[kind] = getMsg("configured_"+kind, guild).format(guild_object.name) elif kind == "prefix": - output[kind] = getMsg("info_prefix", guild).format(guildConfGet(guild.id, kind)) + output[kind] = getMsg("info_prefix", guild).format(guildConfGet(guild, kind)) except Exception as exp: if kind == "prefix": output[kind] = getMsg("info_prefix", guild).format(config["bot_prefix"]) diff --git a/yusarin.py b/yusarin.py index 75b6387..202ff86 100644 --- a/yusarin.py +++ b/yusarin.py @@ -1,6 +1,7 @@ import os import sys import json +import shutil import requests import threading @@ -12,7 +13,7 @@ except Exception as exp: from functions import * pid = os.getpid() -version = 1.1 +version = 1.2 if loadJson("config.json")["check_for_updates"]: try: @@ -37,10 +38,34 @@ async def on_ready(): await clearTrash(client) +@client.event +async def on_guild_join(guild): + + global path + + os.mkdir(f"{path}/guilds/{str(guild.id)}") + os.mkdir(f"{path}/guilds/{str(guild.id)}/channels") + saveJson({}, f"{path}/guilds/{str(guild.id)}/config.json") + + appendLog(f"Joined guild '{guild}' with id {str(guild.id)}") + +@client.event +async def on_guild_remove(guild): + + global path + + try: + shutil.rmtree(f"{path}/guilds/{str(guild.id)}") + except: + pass + + appendLog(f"Left guild '{guild}' with id {str(guild.id)}") @client.event async def on_voice_state_update(member, before, after): + global debug + config = loadJson("config.json") vc_from = before.channel @@ -64,15 +89,18 @@ async def on_voice_state_update(member, before, after): await changeNomicPerms("deny", vc_from, member) if isUserVoice(vc_to): await changeNomicPerms("allow", vc_to, member) - if vc_to.id == guildConfGet(vc_to.guild.id, "channel"): - if guildConfGet(vc_to.guild.id, "category") is not None: - voice_chan = await createUserVoice(vc_to, discord.utils.get(vc_to.guild.categories, id=guildConfGet(vc_to.guild.id, "category")), 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, discord.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 {str(vc_to.guild.id)} is not set", guild=vc_to.guild.id) + if debug: + appendLog(f"Category for guild {vc_to.guild} ({str(vc_to.guild.id)}) is not set", guild=vc_to.guild) + else: + appendLog(f"Category for guild {vc_to.guild} is not set", guild=vc_to.guild) # ========================================================================================== @@ -83,7 +111,7 @@ async def on_message(message): if message.guild is not None: try: - prefix = guildConfGet(message.guild.id, "prefix") + prefix = guildConfGet(message.guild, "prefix") if prefix is None: prefix = config["bot_prefix"] except Exception as exp: @@ -98,6 +126,8 @@ async def on_message(message): if message.content in [f"{prefix}reboot", f"{prefix}restart", f"{prefix}shutdown", f"{prefix}die"]: + gotCommand(message) + if message.author.id == config["owner"]: await message.channel.send(getMsg("shutdown", message.guild)) @@ -109,6 +139,8 @@ async def on_message(message): elif message.content.startswith(f"{prefix}channel"): + gotCommand(message) + fullcmd = message.content.split() if message.guild is not None: @@ -119,9 +151,9 @@ async def on_message(message): if fullcmd[1] == "reset": - if guildConfGet(message.guild.id, "channel") is not None: + if guildConfGet(message.guild, "channel") is not None: - guildConfReset(message.guild.id, "channel") + guildConfReset(message.guild, "channel") await message.channel.send(getMsg("reset_channel", message.guild)) @@ -133,11 +165,11 @@ async def on_message(message): selected_channel = discord.utils.get(message.guild.channels, id=int(fullcmd[1])) - guildConfSet(message.guild.id, "channel", int(fullcmd[1])) + guildConfSet(message.guild, "channel", int(fullcmd[1])) await message.channel.send(getMsg("result_channel", message.guild).format(selected_channel.name)) - if guildConfGet(message.guild.id, "category") is None: + if guildConfGet(message.guild, "category") is None: await message.channel.send(getMsg("warn_category", message.guild).format(prefix)) @@ -152,10 +184,12 @@ async def on_message(message): await message.channel.send(getMsg("command_forbidden", message.guild)) else: - await message.channel.send(getMsg("command_in_dm", message.guild)) + await message.channel.send(getMsg("command_in_dm")) elif message.content.startswith(f"{prefix}category"): + gotCommand(message) + fullcmd = message.content.split() if message.guild is not None: @@ -166,9 +200,9 @@ async def on_message(message): if fullcmd[1] == "reset": - if guildConfGet(message.guild.id, "category") is not None: + if guildConfGet(message.guild, "category") is not None: - guildConfReset(message.guild.id, "category") + guildConfReset(message.guild, "category") await message.channel.send(getMsg("reset_category", message.guild)) @@ -180,11 +214,11 @@ async def on_message(message): selected_category = discord.utils.get(message.guild.channels, id=int(fullcmd[1])) - guildConfSet(message.guild.id, "category", int(fullcmd[1])) + guildConfSet(message.guild, "category", int(fullcmd[1])) await message.channel.send(getMsg("result_category", message.guild).format(selected_category.name)) - if guildConfGet(message.guild.id, "channel") is None: + if guildConfGet(message.guild, "channel") is None: await message.channel.send(getMsg("warn_channel", message.guild).format(prefix)) @@ -199,10 +233,12 @@ async def on_message(message): await message.channel.send(getMsg("command_forbidden", message.guild)) else: - await message.channel.send(getMsg("command_in_dm", message.guild)) + await message.channel.send(getMsg("command_in_dm")) elif message.content.startswith(f"{prefix}prefix"): + gotCommand(message) + fullcmd = message.content.split() if message.guild is not None: @@ -213,9 +249,9 @@ async def on_message(message): if fullcmd[1] == "reset": - if guildConfGet(message.guild.id, "prefix") is not None: + if guildConfGet(message.guild, "prefix") is not None: - guildConfReset(message.guild.id, "prefix") + guildConfReset(message.guild, "prefix") await message.channel.send(getMsg("reset_prefix", message.guild).format(config["bot_prefix"])) @@ -225,7 +261,7 @@ async def on_message(message): else: - guildConfSet(message.guild.id, "prefix", fullcmd[1]) + guildConfSet(message.guild, "prefix", fullcmd[1]) await message.channel.send(getMsg("result_prefix", message.guild).format(fullcmd[1])) @@ -237,10 +273,12 @@ async def on_message(message): await message.channel.send(getMsg("command_forbidden", message.guild)) else: - await message.channel.send(getMsg("command_in_dm", message.guild)) + await message.channel.send(getMsg("command_in_dm")) elif message.content.startswith(f"{prefix}locale"): + gotCommand(message) + fullcmd = message.content.split() if message.guild is not None: @@ -251,10 +289,10 @@ async def on_message(message): if fullcmd[1] == "reset": - if guildConfGet(message.guild.id, "locale") is not None: + if guildConfGet(message.guild, "locale") is not None: - guildConfReset(message.guild.id, "locale") - appendLog(f"Server's locale has been reset", message.guild.id) + guildConfReset(message.guild, "locale") + appendLog(f"Server's locale has been reset", message.guild) await message.channel.send(getMsg("reset_locale", message.guild).format(getMsg("locale_name", message.guild))) else: @@ -265,8 +303,8 @@ async def on_message(message): for locale_file in os.listdir(f"{path}/locale/"): if locale_file[:-5] == fullcmd[1]: - guildConfSet(message.guild.id, "locale", fullcmd[1]) - appendLog(f"Server's locale is now set to {fullcmd[1]}", message.guild.id) + guildConfSet(message.guild, "locale", fullcmd[1]) + appendLog(f"Server's locale is now set to {fullcmd[1]}", message.guild) await message.channel.send(getMsg("locale_set", message.guild)) return @@ -290,19 +328,22 @@ async def on_message(message): await message.channel.send(getMsg("command_forbidden", message.guild)) else: - await message.channel.send(getMsg("command_in_dm", message.guild)) + await message.channel.send(getMsg("command_in_dm")) elif message.content.startswith(f"{prefix}help"): + + gotCommand(message) + if message.author.id == config["owner"]: if message.guild is not None: await message.channel.send(await guildConfigured(message.guild) + getMsg("help", message.guild).format(getMsg("help_owner", message.guild).format(prefix), prefix, prefix, prefix, prefix, prefix)) else: - await message.channel.send(getMsg("help", message.guild).format(getMsg("help_owner", message.guild).format(prefix), prefix, prefix, prefix, prefix, prefix)) + await message.channel.send(getMsg("help").format(getMsg("help_owner").format(prefix), prefix, prefix, prefix, prefix, prefix)) else: if message.guild is not None: - await message.channel.send(await guildConfigured(message.guild) + getMsg("help").format("", prefix, prefix, prefix, prefix)) + await message.channel.send(await guildConfigured(message.guild) + getMsg("help", message.guild).format("", prefix, prefix, prefix, prefix)) else: - await message.channel.send(getMsg("help", message.guild).format("", prefix, prefix, prefix, prefix)) + await message.channel.send(getMsg("help").format("", prefix, prefix, prefix, prefix)) #if loadJson("config.json")["auto_clear_trash"]: # run func