From 04a3e1a9bca7fdebc3d035beeb315774d4a1530b Mon Sep 17 00:00:00 2001 From: Paul Hennings Date: Wed, 1 Feb 2023 11:32:02 +0100 Subject: [PATCH 1/6] set up basic project structure --- .gitignore | 1 + Bot/bot.py | 16 +++++++++++ data/main.sqlite | 0 extensions/moderation/warn.py | 0 extensions/music/player.py | 0 requirements.txt | 27 ++++++++++++++++++ utils/log.py | 52 +++++++++++++++++++++++++++++++++++ 7 files changed, 96 insertions(+) create mode 100644 Bot/bot.py create mode 100644 data/main.sqlite create mode 100644 extensions/moderation/warn.py create mode 100644 extensions/music/player.py create mode 100644 requirements.txt create mode 100644 utils/log.py diff --git a/.gitignore b/.gitignore index b6e4761..2ab793b 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,4 @@ dmypy.json # Pyre type checker .pyre/ +.vscode diff --git a/Bot/bot.py b/Bot/bot.py new file mode 100644 index 0000000..1d6636c --- /dev/null +++ b/Bot/bot.py @@ -0,0 +1,16 @@ +import aiosqlite +import discord +from discord.ext import commands + +from utils.log import setup_logger + + +class DragonBot(commands.Bot): + def __init__(self, *args, **kwargs): + self.set_up = False + super().__init__(*args, **kwargs) + + + async def on_ready(self): + if not self.set_up: + self.log = setup_logger() diff --git a/data/main.sqlite b/data/main.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/extensions/moderation/warn.py b/extensions/moderation/warn.py new file mode 100644 index 0000000..e69de29 diff --git a/extensions/music/player.py b/extensions/music/player.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7ddd2f4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,27 @@ +aiohttp==3.8.3 +aiosignal==1.3.1 +aiosqlite==0.18.0 +async-timeout==4.0.2 +attrs==22.2.0 +autopep8==2.0.1 +black==22.12.0 +cffi==1.15.1 +charset-normalizer==2.1.1 +click==8.1.3 +colorama==0.4.6 +distlib==0.3.6 +filelock==3.9.0 +frozenlist==1.3.3 +idna==3.4 +multidict==6.0.4 +mypy-extensions==0.4.3 +pathspec==0.10.3 +platformdirs==2.6.2 +py-cord==2.3.2 +pycodestyle==2.10.0 +pycparser==2.21 +PyNaCl==1.5.0 +pypresence==4.2.1 +virtualenv==20.17.1 +wavelink==1.3.4 +yarl==1.8.2 diff --git a/utils/log.py b/utils/log.py new file mode 100644 index 0000000..daef075 --- /dev/null +++ b/utils/log.py @@ -0,0 +1,52 @@ +import datetime +import logging +from pathlib import Path +import os + + +class CustomFormatter(logging.Formatter): + def format(self, record): + log_fmt = FORMATS[record.levelno] + formatter = logging.Formatter(log_fmt, style="{", datefmt="%d-%m-%y %H:%M:%S") + return formatter.format(record) + + +FMT = "[{levelname:^9}] [{asctime}] [{name}] [{module}:{lineno}] : {message}" +FORMATS = { + logging.DEBUG: f"\33[37m{FMT}\33[0m", + logging.INFO: f"\33[36m{FMT}\33[0m", + logging.WARNING: f"\33[33m{FMT}\33[0m", + logging.ERROR: f"\33[31m{FMT}\33[0m", + logging.CRITICAL: f"\33[1m\33[31m{FMT}\33[0m", +} + + +def setup_logger() -> logging.Logger: + log = logging.getLogger("BotLog") + log.setLevel(logging.DEBUG) + if not Path("logs").exists(): + os.mkdir("logs") + if len(os.listdir("logs")) > 7: + for file in os.listdir("logs"): + os.remove("logs/" + file) + break + + log_path = f"logs/{log.name} {datetime.datetime.now().strftime('%Y-%m-%d')}.log" + file_format = logging.Formatter( + "[{levelname:^9}] [{asctime}] [{name}] [{module:^4}:{lineno:^4}] | {message}", + style="{", + datefmt="%d-%m-%y %H:%M:%S", + ) + + + file_handler = logging.FileHandler(log_path, "w") + file_handler.setLevel(logging.DEBUG) + file_handler.setFormatter(file_format) + + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.DEBUG) + console_handler.setFormatter(CustomFormatter()) + + log.addHandler(file_handler) + log.addHandler(console_handler) + return log \ No newline at end of file From 75c8b3dac8d834749f69289817a521ab1008dd3e Mon Sep 17 00:00:00 2001 From: DTheIcyDragon <74721808+DTheIcyDragon@users.noreply.github.com> Date: Wed, 1 Feb 2023 12:12:41 +0100 Subject: [PATCH 2/6] Create .exist add more folder structure --- extensions/admin/.exist | 1 + 1 file changed, 1 insertion(+) create mode 100644 extensions/admin/.exist diff --git a/extensions/admin/.exist b/extensions/admin/.exist new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/extensions/admin/.exist @@ -0,0 +1 @@ + From c32c4a2740979a2f4b33a6dbaf41d4ef59a0a18f Mon Sep 17 00:00:00 2001 From: DTheIcyDragon <74721808+DTheIcyDragon@users.noreply.github.com> Date: Wed, 1 Feb 2023 12:13:12 +0100 Subject: [PATCH 3/6] Create .exist add more folder structure --- extensions/fun/.exist | 1 + 1 file changed, 1 insertion(+) create mode 100644 extensions/fun/.exist diff --git a/extensions/fun/.exist b/extensions/fun/.exist new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/extensions/fun/.exist @@ -0,0 +1 @@ + From a8451ffda431a57ca44654e2caa8c4eaec634001 Mon Sep 17 00:00:00 2001 From: DTheIcyDragon <74721808+DTheIcyDragon@users.noreply.github.com> Date: Wed, 1 Feb 2023 12:13:36 +0100 Subject: [PATCH 4/6] Create .exist --- extensions/automation/.exist | 1 + 1 file changed, 1 insertion(+) create mode 100644 extensions/automation/.exist diff --git a/extensions/automation/.exist b/extensions/automation/.exist new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/extensions/automation/.exist @@ -0,0 +1 @@ + From 7371f6cd195dddb02eaea76c5d5ffd6f00af1442 Mon Sep 17 00:00:00 2001 From: pauln Date: Thu, 2 Feb 2023 21:03:54 +0100 Subject: [PATCH 5/6] Latest update --- .gitignore | 9 +++ extensions/music/player.py => CHANGELOG.md | 0 DragonBot.py | 56 +++++++++++++++++ data/main.sqlite | Bin 0 -> 16384 bytes extensions/admin/settings.py | 37 ++++++++++++ extensions/fun/qrcode.py | 24 ++++++++ extensions/moderation/warn.py | 28 +++++++++ utils/db.py | 66 +++++++++++++++++++++ utils/logger.py | 50 ++++++++++++++++ view/warn_v.py | 19 ++++++ 10 files changed, 289 insertions(+) rename extensions/music/player.py => CHANGELOG.md (100%) create mode 100644 DragonBot.py create mode 100644 extensions/admin/settings.py create mode 100644 extensions/fun/qrcode.py create mode 100644 utils/db.py create mode 100644 utils/logger.py create mode 100644 view/warn_v.py diff --git a/.gitignore b/.gitignore index 2ab793b..82aabb8 100644 --- a/.gitignore +++ b/.gitignore @@ -127,4 +127,13 @@ dmypy.json # Pyre type checker .pyre/ +# py-charm +/.idea/.gitignore +/.idea/discord.xml +/.idea/misc.xml +/.idea/modules.xml +/.idea/inspectionProfiles/profiles_settings.xml +/.idea/inspectionProfiles/Project_Default.xml +/.idea/pythonProject.iml +/.idea/vcs.xml .vscode diff --git a/extensions/music/player.py b/CHANGELOG.md similarity index 100% rename from extensions/music/player.py rename to CHANGELOG.md diff --git a/DragonBot.py b/DragonBot.py new file mode 100644 index 0000000..9144ce7 --- /dev/null +++ b/DragonBot.py @@ -0,0 +1,56 @@ +import datetime +import logging + +import discord +from discord.ext import commands, tasks + +import config +from utils import db, logger + +log = logging.getLogger("DragonLog") + + +ascii_art = """ +╭━━━╮╱╱╱╱╱╱╱╱╱╱╱╱╱╭━━╮╱╱╱╭╮ +╰╮╭╮┃╱╱╱╱╱╱╱╱╱╱╱╱╱┃╭╮┃╱╱╭╯╰╮ +╱┃┃┃┣━┳━━┳━━┳━━┳━╮┃╰╯╰┳━┻╮╭╯ +╱┃┃┃┃╭┫╭╮┃╭╮┃╭╮┃╭╮┫╭━╮┃╭╮┃┃ +╭╯╰╯┃┃┃╭╮┃╰╯┃╰╯┃┃┃┃╰━╯┃╰╯┃╰╮ +╰━━━┻╯╰╯╰┻━╮┣━━┻╯╰┻━━━┻━━┻━╯ +╱╱╱╱╱╱╱╱╱╭━╯┃ +╱╱╱╱╱╱╱╱╱╰━━╯ +""" + + +def pre_start_hook(): + print(ascii_art) + client.load_extensions("extensions", recursive = True) + + +class DragonBot(commands.Bot): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + async def on_ready(self) -> None: + try: + log.info(f"Bot started as {self.user.name}#{self.user.discriminator} | {self.user.id}") + except UnicodeEncodeError: + log.info("Bot started") + await db.set_up() + log.debug("Database setup successful") + + +client = DragonBot( + command_prefix = commands.when_mentioned, + case_insensitive = True, + strip_after_prefix = True, + intents = discord.Intents.all(), + debug_guilds = config.GUILDS, + activity = discord.Activity(type = discord.ActivityType.watching, name = "you"), + state = discord.Status.online, +) + + +if __name__ == "__main__": + pre_start_hook() + client.run(config.DISCORD_TOKEN) diff --git a/data/main.sqlite b/data/main.sqlite index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f0bc62040cb119dbc86cfd8bfc0d0e2ecf85ad99 100644 GIT binary patch literal 16384 zcmeI#T}#4H7zglkoTvn8cito&@FGPCU&474XfZ@mvo#^FWa>!<+kDwE=q~#reXKr2 zU!r5V*dn@5{tw&E+jcn5Z&%OVZO0OvJRZ2gXgiC->-TJ)_7%d5fpTF75EV!<{i-`H6?EgynFy zeR#rj7Wr*$E{lEy1Rwwb2tWV=5P$##AOHafKmY=JEP(odkAE&wg8&2|009U<00Izz z00bZa0SN2_w)H None: + if not DBFOLD.exists(): + os.mkdir(DBFOLD) + if not DBPATH.exists(): + open(DBPATH, "w").close() + async with aiosqlite.connect(DBPATH) as conn: + async with conn.cursor() as cursor: + await cursor.execute(""" + CREATE TABLE IF NOT EXISTS mod_actions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + type TEXT, + member INTEGER, + time timestamp) + """) + + await cursor.execute(""" + CREATE TABLE IF NOT EXISTS settings ( + setting TEXT, + value TEXT, + guild INTEGER) + """) + + await conn.commit() + + +async def insert_setting(setting: str, value: str, guild: int): + setting = setting.lower() + value = value.lower() + async with aiosqlite.connect(DBPATH) as conn: + async with conn.cursor() as cursor: + await cursor.execute(""" + SELECT value FROM settings where setting = ? AND guild = ? + """, (setting, guild)) + response = await cursor.fetchone() + if response is None: + await cursor.execute(""" + INSERT INTO settings (setting, value, guild) VALUES (?, ?, ?) + """, (setting, value, guild)) + else: + await cursor.execute(""" + UPDATE settings SET value = ? WHERE setting = ? AND guild = ? + """, (value, setting, guild)) + await conn.commit() + + +async def get_setting(setting: str, guild: int) -> str | None: + setting = setting.lower() + async with aiosqlite.connect(DBPATH) as conn: + async with conn.cursor() as cursor: + await cursor.execute(""" + SELECT value FROM settings where setting = ? AND guild = ? + """) + response = await cursor.fetchone() + if response is None: + return None + else: + return response[0] + + +async def add_warn(): + pass diff --git a/utils/logger.py b/utils/logger.py new file mode 100644 index 0000000..d2abfda --- /dev/null +++ b/utils/logger.py @@ -0,0 +1,50 @@ +import datetime +import logging +import os +from pathlib import Path + + +class CustomFormatter(logging.Formatter): + def format(self, record): + log_fmt = FORMATS[record.levelno] + formatter = logging.Formatter(log_fmt, style="{", datefmt="%d-%m-%y %H:%M:%S") + return formatter.format(record) + + +FMT = "[{levelname:^9}] [{asctime}] [{name}] [{module}:{lineno}] : {message}" +FORMATS = { + logging.DEBUG: f"\33[37m{FMT}\33[0m", + logging.INFO: f"\33[36m{FMT}\33[0m", + logging.WARNING: f"\33[33m{FMT}\33[0m", + logging.ERROR: f"\33[31m{FMT}\33[0m", + logging.CRITICAL: f"\33[1m\33[31m{FMT}\33[0m", +} + + +log = logging.getLogger("DragonLog") +log.setLevel(logging.DEBUG) +if not Path("logs").exists(): + os.mkdir("logs") +if len(os.listdir("logs")) > 10: + for file in os.listdir("logs"): + os.remove("logs/" + file) + break + +log_path = f"logs/{log.name} {datetime.datetime.now().strftime('%Y-%m-%d')}.log" +file_format = logging.Formatter( + "[{levelname:^9}] [{asctime}] [{name}] [{module:^4}:{lineno:^4}] | {message}", + style="{", + datefmt="%d-%m-%y %H:%M:%S", +) + + +file_handler = logging.FileHandler(log_path, "w") +file_handler.setLevel(logging.DEBUG) +file_handler.setFormatter(file_format) + +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.DEBUG) +console_handler.setFormatter(CustomFormatter()) + +log.addHandler(file_handler) +log.addHandler(console_handler) diff --git a/view/warn_v.py b/view/warn_v.py new file mode 100644 index 0000000..8d65b22 --- /dev/null +++ b/view/warn_v.py @@ -0,0 +1,19 @@ +import discord +from discord import ui + +from utils import db + + +class WarnModal(ui.Modal): + def __init__(self, user: discord.Member, title = "Warn Context"): + self.user = user + self.title = title + super().__init__() + self.add_item(ui.InputText( + style = discord.InputTextStyle.long, + label = "Reason to warn", + required = True)) + + async def callback(self, interaction: discord.Interaction): + log = await db.get_setting(setting = "log", guild = interaction.guild_id) + if log is None: From 19c6c7ad1f66819eadde3a5aaf0841ead584de1e Mon Sep 17 00:00:00 2001 From: pauln Date: Mon, 6 Feb 2023 22:36:33 +0100 Subject: [PATCH 6/6] Added warn input and output --- Bot/bot.py | 16 -------- extensions/admin/.exist | 1 - extensions/admin/settings.py | 5 ++- extensions/moderation/warn.py | 21 +++++++---- extensions/utility/userinfo.py | 68 ++++++++++++++++++++++++++++++++++ utils/db.py | 39 ++++++++++++++++--- utils/log.py | 52 -------------------------- view/warn_v.py | 26 ++++++++++++- 8 files changed, 143 insertions(+), 85 deletions(-) delete mode 100644 Bot/bot.py delete mode 100644 extensions/admin/.exist create mode 100644 extensions/utility/userinfo.py delete mode 100644 utils/log.py diff --git a/Bot/bot.py b/Bot/bot.py deleted file mode 100644 index 1d6636c..0000000 --- a/Bot/bot.py +++ /dev/null @@ -1,16 +0,0 @@ -import aiosqlite -import discord -from discord.ext import commands - -from utils.log import setup_logger - - -class DragonBot(commands.Bot): - def __init__(self, *args, **kwargs): - self.set_up = False - super().__init__(*args, **kwargs) - - - async def on_ready(self): - if not self.set_up: - self.log = setup_logger() diff --git a/extensions/admin/.exist b/extensions/admin/.exist deleted file mode 100644 index 8b13789..0000000 --- a/extensions/admin/.exist +++ /dev/null @@ -1 +0,0 @@ - diff --git a/extensions/admin/settings.py b/extensions/admin/settings.py index f9ee8a5..01f521d 100644 --- a/extensions/admin/settings.py +++ b/extensions/admin/settings.py @@ -28,9 +28,10 @@ async def settings(self, guild = ctx.guild_id ) embed = discord.Embed(title = "Success", - description = f"Successfully set {setting} to {value}", + description = f"Successfully set {setting} to <@&{value}>", color = discord.Color.brand_green()) - await ctx.response.send_message(embed = embed) + await ctx.response.send_message(embed = embed, + ephemeral = True) def setup(client: DragonBot): diff --git a/extensions/moderation/warn.py b/extensions/moderation/warn.py index 198d8bd..2959669 100644 --- a/extensions/moderation/warn.py +++ b/extensions/moderation/warn.py @@ -12,16 +12,23 @@ class WarnCog(commands.Cog): def __init__(self, client): self.client = client - @commands.user_command(name = "warn") + @commands.user_command(name = "Warn") async def warn(self, ctx: discord.ApplicationContext, member: discord.Member): + team_id = await db.get_setting(setting = "team role", guild = str(ctx.guild_id)) + if team_id is None: + return await ctx.response.send_message(embed = discord.Embed( + title = "Error", + description = "You have not set up a team role.\nPlease set up a team role by running /settings Team Role your team role id", + color = discord.Color.brand_red() + ), ephemeral = True) for role in ctx.author.roles: - if not role.id in await db.get_setting(): - return await ctx.response.send_message("You are not allowed to warn a member!", - ephemeral = True, - delete_after = 5) - + if int(team_id[0]) == int(role.id): + await ctx.response.send_modal(warn_v.WarnModal(title = "Warn Member", user = member)) + break else: - await ctx.response.send_modal(warn_v.WarnModal()) + return await ctx.response.send_message("You are not allowed to warn a member!", + ephemeral = True, + delete_after = 5) def setup(client: DragonBot): diff --git a/extensions/utility/userinfo.py b/extensions/utility/userinfo.py new file mode 100644 index 0000000..ef38ed8 --- /dev/null +++ b/extensions/utility/userinfo.py @@ -0,0 +1,68 @@ +import datetime +import logging +import time + +import discord +from discord.ext import commands + +from DragonBot import DragonBot +from utils import db + + +class UserCog(commands.Cog): + def __init__(self, client): + self.client: DragonBot = client + + @commands.slash_command(name = "userinfo", description = "get information about a user") + async def userinfo(self, ctx: discord.ApplicationContext, user: discord.Option( + input_type = discord.SlashCommandOptionType.user, + description = "mention a user to get information about him" + )): + user = user.strip("<@!>") + user = ctx.guild.get_member(int(user)) + em = discord.Embed( + title = f"{user.name}#{user.discriminator}", + color = discord.Color.purple() + ) + em.set_thumbnail(url = user.display_avatar.url) + em.add_field(name = f"User ID", value = f"{user.id}") + em.add_field(name = f"Accout created", value = f"{user.created_at.strftime('%d.%m.%Y %H:%M')}\n") + em.add_field(name = f"Joined at", value = f"{user.joined_at.strftime('%d.%m.%Y %H:%M')}\n") + + team_id = await db.get_setting(setting = "team role", guild = str(ctx.guild_id)) + if team_id is None: + return await ctx.response.send_message(embed = discord.Embed( + title = "Error", + description = "You have not set up a team role.\nPlease set up a team role by running /settings Team Role your team role id", + color = discord.Color.brand_red() + ), ephemeral = True) + for role in ctx.author.roles: + if int(team_id[0]) == int(role.id): + response = await db.get_mod_action(member = user.id) + counter = 0 + for item in response: + pub_id, moderator, reason, action, date = item + date1, date2 = date.split(" ") + date1 = date1.split("-") + date = f"{date1[2]}.{date1[1]}.{date1[0]} {date2}" + em.add_field(name = f"{action.capitalize()} (ID: {pub_id})", + value = f"**---Reason---**\n{reason}\n------------\nBy <@{moderator}>\nAt {date}", + inline = False) + counter += 1 + if counter > 24: + break + await ctx.response.send_message( + embed = em, + ephemeral = True + ) + break + else: + + await ctx.response.send_message( + embed = em, + ephemeral = True + ) + + +def setup(client: DragonBot): + client.add_cog(UserCog(client)) diff --git a/utils/db.py b/utils/db.py index 7d4cb8a..004547a 100644 --- a/utils/db.py +++ b/utils/db.py @@ -1,6 +1,9 @@ +import os +import datetime + import aiosqlite + from config import DBPATH, DBFOLD -import os async def set_up() -> None: @@ -13,8 +16,10 @@ async def set_up() -> None: await cursor.execute(""" CREATE TABLE IF NOT EXISTS mod_actions ( id INTEGER PRIMARY KEY AUTOINCREMENT, - type TEXT, member INTEGER, + moderator INTEGER, + reason TEXT, + action TEXT, time timestamp) """) @@ -54,13 +59,35 @@ async def get_setting(setting: str, guild: int) -> str | None: async with conn.cursor() as cursor: await cursor.execute(""" SELECT value FROM settings where setting = ? AND guild = ? - """) + """, (setting, guild)) response = await cursor.fetchone() if response is None: return None else: - return response[0] + return response -async def add_warn(): - pass +async def add_mod_action(member: int, moderator: int, reason: str, action: str) -> None: + timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + async with aiosqlite.connect(DBPATH) as conn: + async with conn.cursor() as cursor: + await cursor.execute(""" + INSERT INTO mod_actions (member, moderator, reason, action, time) VALUES (?, ?, ?, ?, ?) + """, (member, reason, action.lower(), timestamp)) + await conn.commit() + + +async def get_mod_action(member: int = None, action: str = None) -> tuple | list[tuple] | None: + if member is not None: + async with aiosqlite.connect(DBPATH) as conn: + async with conn.cursor() as cursor: + await cursor.execute(""" + SELECT id, moderator, reason, action, time FROM mod_actions WHERE member = ? + """, (member,)) + response = await cursor.fetchall() + if response is None: + return None + else: + return response + if action is not None: + pass diff --git a/utils/log.py b/utils/log.py deleted file mode 100644 index daef075..0000000 --- a/utils/log.py +++ /dev/null @@ -1,52 +0,0 @@ -import datetime -import logging -from pathlib import Path -import os - - -class CustomFormatter(logging.Formatter): - def format(self, record): - log_fmt = FORMATS[record.levelno] - formatter = logging.Formatter(log_fmt, style="{", datefmt="%d-%m-%y %H:%M:%S") - return formatter.format(record) - - -FMT = "[{levelname:^9}] [{asctime}] [{name}] [{module}:{lineno}] : {message}" -FORMATS = { - logging.DEBUG: f"\33[37m{FMT}\33[0m", - logging.INFO: f"\33[36m{FMT}\33[0m", - logging.WARNING: f"\33[33m{FMT}\33[0m", - logging.ERROR: f"\33[31m{FMT}\33[0m", - logging.CRITICAL: f"\33[1m\33[31m{FMT}\33[0m", -} - - -def setup_logger() -> logging.Logger: - log = logging.getLogger("BotLog") - log.setLevel(logging.DEBUG) - if not Path("logs").exists(): - os.mkdir("logs") - if len(os.listdir("logs")) > 7: - for file in os.listdir("logs"): - os.remove("logs/" + file) - break - - log_path = f"logs/{log.name} {datetime.datetime.now().strftime('%Y-%m-%d')}.log" - file_format = logging.Formatter( - "[{levelname:^9}] [{asctime}] [{name}] [{module:^4}:{lineno:^4}] | {message}", - style="{", - datefmt="%d-%m-%y %H:%M:%S", - ) - - - file_handler = logging.FileHandler(log_path, "w") - file_handler.setLevel(logging.DEBUG) - file_handler.setFormatter(file_format) - - console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) - console_handler.setFormatter(CustomFormatter()) - - log.addHandler(file_handler) - log.addHandler(console_handler) - return log \ No newline at end of file diff --git a/view/warn_v.py b/view/warn_v.py index 8d65b22..5b6fd03 100644 --- a/view/warn_v.py +++ b/view/warn_v.py @@ -8,7 +8,7 @@ class WarnModal(ui.Modal): def __init__(self, user: discord.Member, title = "Warn Context"): self.user = user self.title = title - super().__init__() + super().__init__(title = title) self.add_item(ui.InputText( style = discord.InputTextStyle.long, label = "Reason to warn", @@ -16,4 +16,28 @@ def __init__(self, user: discord.Member, title = "Warn Context"): async def callback(self, interaction: discord.Interaction): log = await db.get_setting(setting = "log", guild = interaction.guild_id) + await db.add_mod_action(member = self.user.id, + moderator = interaction.user.id, + action = "warn", + reason = self.children[0].value) + em = discord.Embed( + title = "Warn", + description = f"Warn for {self.user.name}#{self.user.discriminator} ({self.user.id})", + color = discord.Color.gold() + ) + em.set_author( + name = f"{interaction.user.name}#{interaction.user.discriminator} ({interaction.user.id})", + icon_url = interaction.user.display_avatar + ) if log is None: + await interaction.response.send_message(content = f"Please set a log channel to send logs.", + embed = em, + ephemeral = True, + delete_after = 5) + + else: + log = interaction.client.get_channel(log[0]) + await interaction.response.send_message(embed = em, + ephemeral = True, + delete_after = 5) + await log.send(embed = em)