diff --git a/cog/admin_tools.py b/cog/admin_tools.py new file mode 100644 index 0000000..a928695 --- /dev/null +++ b/cog/admin_tools.py @@ -0,0 +1,334 @@ +from discord.commands import SlashCommandGroup +from discord.commands import Option +from discord.ext import commands +import aiosqlite +import traceback +import datetime +import discord + + +class ModerationSystem(commands.Cog): + def __init__(self, bot): + self.bot = bot + + admin = SlashCommandGroup("admin") + warn_group = admin.create_subgroup("warn") + + def create_user_remove_action_embed( + self, + source: discord.User, + target: discord.Member, + action: str, + reason: str + ): + guild = target.guild + embed = discord.Embed( + title=f"`✅` {target.name}#{target.discriminator} {action}", + description=f"Du hast den User {target.mention} aus dem Server **{guild.name}** {action}.", + color=discord.Color.green(), + timestamp=datetime.datetime.utcnow() + ) + embed.add_field(name="Moderator:", value=f"{source}", inline=False) + embed.add_field(name="Grund:", value=f"{reason}", inline=False) + embed.set_author(name=f"{guild.name}", icon_url=target.avatar.url) + embed.set_thumbnail(url=target.avatar.url) + embed.set_footer( + text=f"{self.bot.user.name}#{self.bot.user.discriminator} | Oppro.net Development", + icon_url=self.bot.user.avatar.url + ) + + return embed + + def create_warn_embed( + self, + source: discord.User, + target: discord.Member, + warn_id: int, + reason: str, + is_direct_message: bool = False, + is_remove: bool = False + ): + guild = target.guild + + embed = discord.Embed( + title="`⚠️` Warn", + description=( + f"Ein Warn von dir vom Server **{guild.name}** wurde zurückgezogen." + if is_direct_message else + f"Du hast den {target.mention} aus dem Server **{guild.name}** unwarned." + ) if is_remove else ( + f"Du wurdest auf dem Server **{guild.name}** gewarnt." + if is_direct_message else + f"Du hast den User {target.mention} auf dem Server **{guild.name}** gewarnt." + ), + color=discord.Color.green(), + timestamp=datetime.datetime.utcnow() + ) + embed.add_field(name="Moderator:", value=f"```{source}```", inline=False) + embed.add_field(name="Warn ID:", value=f"```{warn_id}```", inline=False) + embed.add_field(name="Grund:", value=f"```{reason}```", inline=False) + embed.set_author(name=f"{guild.name}", icon_url=target.avatar.url) + embed.set_thumbnail(url=target.avatar.url if is_direct_message else source.avatar.url) + embed.set_footer( + text=f"{self.bot.user.name}#{self.bot.user.discriminator} | Oppro.net Development", + icon_url=self.bot.user.avatar.url + ) + + return embed + + def create_error_embed( + self, + source: discord.User, + target: discord.Member, + error: discord.ClientException + ): + guild = target.guild + embed = discord.Embed( + title="`⚠️` Error", + description=f"Es ist ein Fehler aufgetreten.", + color=discord.Color.green(), + timestamp=datetime.datetime.utcnow() + ) + embed.add_field( + name=f"Beim Kicken von {target.mention} ist ein Fehler aufgetreten.", + value=f"Bitte versuche es später erneut.", inline=False + ) + embed.add_field(name=f"Fehler Code:", value=f"```{error}```", inline=False) + embed.set_author(name=f"{guild.name}", icon_url=self.bot.user.avatar.url) + embed.set_footer( + text=f"{self.bot.user.name}#{self.bot.user.discriminator} | Oppro.net Development", + icon_url=self.bot.user.avatar.url + ) + + return embed + + @commands.Cog.listener() + async def on_ready(self): + async with aiosqlite.connect("mod_sys.db") as db: + await db.executescript( + """ + CREATE TABLE IF NOT EXISTS WarnList ( + warn_id INTEGER PRIMARY KEY, + mod_id INTEGER, + guild_id INTEGER, + user_id INTEGER, + warns INTEGER DEFAULT 0, + warn_reason TEXT, + warn_time TEXT + ) + """ + ) + + @admin.command(description="Kicke einen User aus dem Server") + @discord.default_permissions(kick_members=True) + @discord.guild_only() + async def kick( + self, + ctx: discord.ApplicationContext, + member: Option(discord.Member, "Wähle den User aus, den du kicken willst", required=True), + reason: Option( + str, + "Gib einen Grund an, warum du den User kicken willst", + required=False, + default="Kein Grund angegeben" + ) + ): + try: + await member.kick(reason=reason) + except (discord.Forbidden, discord.HTTPException) as error: + traceback.print_exception(error) + return await ctx.respond( + embed=self.create_error_embed(ctx.user, member, error), + ephemeral=True + ) + + await ctx.respond( + embed=self.create_user_remove_action_embed(ctx.user, member, "gekickt", reason), + ephemeral=False + ) + + @commands.command(description="Banne einen User aus dem Server") + @discord.default_permissions(ban_members=True) + @discord.guild_only() + async def ban( + self, + ctx: discord.ApplicationContext, + member: Option(discord.Member, "Wähle den User aus, den du Bannen willst", required=True), + reason: Option( + str, + "Gib einen Grund an, warum du den User Bannen willst", + required=False, + default="Kein Grund angegeben" + ) + ): + try: + await member.ban(reason=reason) + except (discord.Forbidden, discord.HTTPException) as error: + traceback.print_exception(error) + return await ctx.respond( + embed=self.create_error_embed(ctx.user, member, error), + ephemeral=True + ) + + await ctx.respond( + embed=self.create_user_remove_action_embed(ctx.user, member, "gebannt", reason), + ephemeral=False + ) + + @warn_group.command(name="add", description="Warne einen User aus dem Server") + @discord.default_permissions(kick_members=True) + @discord.guild_only() + async def add_warning( + self, + ctx: discord.ApplicationContext, + member: Option(discord.Member, "Wähle den User aus, den du warnen willst", required=True), + reason: Option( + str, + "Gib einen Grund an, warum du den User warnen willst", + required=False, default="Kein Grund angegeben" + ) + ): + warn_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + async with aiosqlite.connect("mod_sys.db") as db: + await db.execute( + "INSERT INTO WarnList " + "(user_id, guild_id, warns, warn_reason, mod_id, warn_time) VALUES (?, ?, ?, ?, ?, ?)", + (member.id, ctx.guild.id, 1, reason, ctx.author.id, warn_time), + ) + await db.commit() + + async with db.execute( + "SELECT warn_id FROM WarnList WHERE user_id = ? AND guild_id = ? ORDER BY warn_id DESC LIMIT 1", + (member.id, ctx.guild.id), + ) as cursor: + row = await cursor.fetchone() + warn_id = row[0] + + await member.send( + embed=self.create_warn_embed(ctx.user, member, warn_id, reason, True) + ) + await ctx.respond( + embed=self.create_warn_embed(ctx.user, member, warn_id, reason, False), + ephemeral=False + ) + + @warn_group.command(name="remove", description="Unwarn einen User aus dem Server") + @discord.default_permissions(kick_members=True) + @discord.guild_only() + async def remove_warning( + self, + ctx: discord.ApplicationContext, + member: Option(discord.Member, "Wähle den User aus, den du unwarnen willst", required=True), + warn_id: Option(int, "Wähle die Warn ID aus, die du zurückziehen willst", required=True), + reason: Option( + str, + "Gib einen Grund an, warum du den User warnen willst", + required=False, default="Kein Grund angegeben" + ) + ): + async with aiosqlite.connect("mod_sys.db") as db: + await db.execute( + "DELETE FROM WarnList WHERE user_id = ? AND guild_id = ? AND warn_id = ?", + (member.id, ctx.guild.id, warn_id) + ) + await db.commit() + + await member.send( + embed=self.create_warn_embed(ctx.user, member, warn_id, reason, True, True) + ) + await ctx.respond( + embed=self.create_warn_embed(ctx.user, member, warn_id, reason, False, True), + ephemeral=False + ) + + @warn_group.command(name="list", description="Zeige alle Warns eines Users aus dem Server an") + @discord.default_permissions(kick_members=True) + @discord.guild_only() + async def warnings(self, ctx: discord.ApplicationContext, member: discord.Member): + async with aiosqlite.connect("mod_sys.db") as db: + async with db.execute( + "SELECT warn_id, mod_id, guild_id, user_id, warns, warn_reason, warn_time " + "FROM WarnList WHERE user_id = ? AND guild_id = ?", + (member.id, ctx.guild.id) + ) as cursor: + warnings = [ + f"**Warn-ID:** __{warn_id}__\n" + f"""**Warn ausgestellt am:** { + datetime.datetime.strptime(warn_time, '%Y-%m-%d %H:%M:%S').strftime('%Y-%m-%d %H:%M:%S') + }\n""" + f"**Moderator:** <@{mod_id}>\n" + f"**Mod-ID**: __{mod_id}__\n" + f"**> Grund:**\n```{warn_reason}```" + for warn_id, mod_id, guild_id, user_id, warns, warn_reason, warn_time in await cursor.fetchall() + ] + + if not warnings: + warnings_embed = discord.Embed( + title="`⚠️` The user has no warns!", + description=f"User: {member.mention}", + color=discord.Color.red(), + ) + else: + warnings_embed = discord.Embed( + title=f"`⚠️` Warn Liste {member.name}#{member.discriminator}", + description=f"__**Liste der Warns**__", + color=discord.Color.green(), + timestamp=datetime.datetime.utcnow() + ) + warnings_embed.add_field(name="", value="\n".join(warnings), inline=False) + warnings_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.guild.icon.url) + warnings_embed.set_thumbnail(url=member.avatar.url) + warnings_embed.set_footer( + text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", + icon_url=ctx.bot.user.avatar.url + ) + + await ctx.respond(embed=warnings_embed, ephemeral=False) + + @admin.command(description="Lösche Nachrichten aus dem Channel") + @commands.has_permissions(administrator=True) + async def purge( + self, + ctx: discord.ApplicationContext, + amount: Option(int, "Anzahl an Nachrichten (min. 1 | max. 100)", required=True) + ): + if amount > 101: + error_embed = discord.Embed( + title="`❌` Fehler!", + description="`Ich kann nicht mehr als 100 Nachrichten Löschen!`", + color=discord.Color.red(), + timestamp=datetime.datetime.utcnow() + ) + error_embed.set_thumbnail(url=ctx.guild.icon.url) + error_embed.set_footer(text=f"| {ctx.bot.user.name}#{ctx.bot.user.discriminator}", + icon_url=ctx.bot.user.avatar.url) + error_embed.set_author( + name=f"Purge | Moderation System | Oppro.net Development", + icon_url=ctx.bot.user.avatar.url + ) + + return await ctx.respond(embed=error_embed, delete_after=6, ephemeral=True) + + deleted = await ctx.channel.purge(limit=amount) + + success_embed = discord.Embed( + title="`✅` Erfolgreich!", + description="**{}** `Nachrichten gelöscht!`".format(len(deleted)), + color=discord.Color.green(), + timestamp=datetime.datetime.utcnow() + ) + success_embed.set_thumbnail(url=ctx.guild.icon.url) + success_embed.set_footer( + text=f"| {ctx.bot.user.name}#{ctx.bot.user.discriminator}", + icon_url=ctx.bot.user.avatar.url + ) + success_embed.set_author( + name=f"Purge | Moderation System | Oppro.net Development", + icon_url=ctx.bot.user.avatar.url + ) + + await ctx.respond(embed=success_embed, delete_after=3, ephemeral=True) + + +def setup(bot): + bot.add_cog(ModerationSystem(bot)) diff --git a/cog/admintools.py b/cog/admintools.py deleted file mode 100644 index 5300116..0000000 --- a/cog/admintools.py +++ /dev/null @@ -1,362 +0,0 @@ -import discord -from discord import Embed, Color -from discord.commands import slash_command, Option -from discord.ext import commands -from discord.commands import SlashCommandGroup - -import aiosqlite -import datetime - -import traceback - - -class ModerationSystem(commands.Cog): - def __init__(self, bot): - self.bot = bot - - admin = SlashCommandGroup("admin") - warn_group = admin.create_subgroup("warn_system") - ban_group = admin.create_subgroup("ban_system") - - @commands.Cog.listener() - async def on_ready(self): - async with aiosqlite.connect("mod_sys.db") as db: - await db.executescript( - """ - CREATE TABLE IF NOT EXISTS WarnList ( - warn_id INTEGER PRIMARY KEY, - mod_id INTEGER, - guild_id INTEGER, - user_id INTEGER, - warns INTEGER DEFAULT 0, - warn_reason TEXT, - warn_time TEXT - ) - """ - ) - - @admin.command(description="Kicke einen User aus dem Server") - @discord.default_permissions(kick_members=True) - @discord.guild_only() - async def kick( - self, - ctx, - member: Option(discord.Member, "Wähle den User aus, den du kicken willst", required=True), - reason: Option(str, "Gib einen Grund an, warum du den User kicken willst", required=False, - default="Kein Grund angegeben") - ): - - kick_embed = discord.Embed( - title=f"`✅` Kick {member.name}#{member.discriminator}", - description=f"Du hast den User {member.mention} aus dem Server **{ctx.guild.name}** gekickt.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - kick_embed.add_field(name="Moderator:", value=f"{ctx.author}", inline=False) - kick_embed.add_field(name="Grund:", value=f"{reason}", inline=False) - kick_embed.set_author(name=f"{ctx.guild.name}", icon_url=member.avatar.url) - kick_embed.set_thumbnail(url=member.avatar.url) - kick_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - try: - await member.kick(reason=reason) - except (discord.Forbidden, discord.HTTPException) as e: - - error_embed = discord.Embed( - title="`⚠️` Error", - description=f"Es ist ein Fehler aufgetreten.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - error_embed.add_field(name=f"Beim Kicken von {member.mention} ist ein Fehler aufgetreten.", - value=f"Bitte versuche es später erneut.", inline=False) - error_embed.add_field(name=f"Fehler Code:", value=f"```{e}```", inline=False) - error_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.bot.user.avatar.url) - error_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - print(e) - await ctx.respond(embed=error_embed, ephemeral=True) - return - await ctx.respond(embed=kick_embed, ephemeral=False) - - @ban_group.command(description="Banne einen User aus dem Server") - @discord.default_permissions(ban_members=True) - @discord.guild_only() - async def ban( - self, - ctx, - member: Option(discord.Member, "Wähle den User aus, den du Bannen willst", required=True), - reason: Option(str, "Gib einen Grund an, warum du den User Bannen willst", required=False, - default="Kein Grund angegeben") - ): - - ban_embed = discord.Embed( - title=f"`✅` Ban {member.name}#{member.discriminator}", - description=f"Du hast den User {member.mention} aus dem Server **{ctx.guild.name}** gebannt.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - ban_embed.add_field(name="Moderator:", value=f"{ctx.author}", inline=False) - ban_embed.add_field(name="Grund:", value=f"{reason}", inline=False) - ban_embed.set_author(name=f"{ctx.guild.name}", icon_url=member.avatar.url) - ban_embed.set_thumbnail(url=member.avatar.url) - ban_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", icon_url=ctx.bot.user.avatar.url) - - try: - await member.ban(reason=reason) - except (discord.Forbidden, discord.HTTPException) as e: - - error_embed = discord.Embed( - title="`⚠️` Error", - description=f"Es ist ein Fehler aufgetreten.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - error_embed.add_field(name=f"Beim Kicken von {member.mention} ist ein Fehler aufgetreten.", - value=f"Bitte versuche es später erneut.", inline=False) - error_embed.add_field(name=f"Fehler Code:", value=f"```{e}```", inline=False) - error_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.bot.user.avatar.url) - error_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - print(e) - await ctx.respond(embed=error_embed, ephemeral=True) - return - await ctx.respond(embed=ban_embed, ephemeral=False) - - @ban_group.command(description="Entbanne einen User aus dem Server") - @discord.default_permissions(ban_members=True) - @discord.guild_only() - async def unban( - self, - ctx, - member: Option(discord.Member, "Wähle den User aus, den du entbannen willst", required=True), - reason: Option(str, "Gib einen Grund an, warum du den User entbannen willst", required=False, - default="Kein Grund angegeben") - ): - - unban_embed = discord.Embed( - title=f"`✅` Unban {member.name}#{member.discriminator}", - description=f"Du hast den User {member.mention} auf dem Server **{ctx.guild.name}** entbannt.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - unban_embed.add_field(name="Moderator:", value=f"{ctx.author}", inline=False) - unban_embed.add_field(name="Grund:", value=f"{reason}", inline=False) - unban_embed.set_author(name=f"{ctx.guild.name}", icon_url=member.avatar.url) - unban_embed.set_thumbnail(url=member.avatar.url) - unban_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - try: - ban_entry = await ctx.guild.fetch_ban(member) - await ctx.guild.unban(ban_entry.user, reason=reason) - except (discord.Forbidden, discord.HTTPException) as e: - - error_embed = discord.Embed( - title="`⚠️` Error", - description=f"Es ist ein Fehler aufgetreten.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - error_embed.add_field(name=f"Beim Kicken von {member.mention} ist ein Fehler aufgetreten.", - value=f"Bitte versuche es später erneut.", inline=False) - error_embed.add_field(name=f"Fehler Code:", value=f"```{e}```", inline=False) - error_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.bot.user.avatar.url) - error_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - print(e) - await ctx.respond(embed=error_embed, ephemeral=True) - return - await ctx.respond(embed=unban_embed, ephemeral=False) - - @warn_group.command(description="Warne einen User aus dem Server") - @discord.default_permissions(kick_members=True) - @discord.guild_only() - async def warn( - self, - ctx, - member: Option(discord.Member, "Wähle den User aus, den du warnen willst", required=True), - reason: Option(str, "Gib einen Grund an, warum du den User warnen willst", required=False, - default="Kein Grund angegeben") - ): - - warn_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - async with aiosqlite.connect("mod_sys.db") as db: - await db.execute( - "INSERT INTO WarnList (user_id, guild_id, warns, warn_reason, mod_id, warn_time) VALUES (?, ?, ?, ?, ?, ?)", - (member.id, ctx.guild.id, 1, reason, ctx.author.id, warn_time), - ) - await db.commit() - - async with db.execute( - "SELECT warn_id FROM WarnList WHERE user_id = ? AND guild_id = ? ORDER BY warn_id DESC LIMIT 1", - (member.id, ctx.guild.id), - ) as cursor: - row = await cursor.fetchone() - warn_id = row[0] - - warnUser_embed = discord.Embed( - title="`⚠️` Warn", - description=f"Du wurdest auf dem Server **{ctx.guild.name}** gewarnt.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - warnUser_embed.add_field(name="Moderator:", value=f"```{ctx.author}```", inline=False) - warnUser_embed.add_field(name="Warn ID:", value=f"```{warn_id}```", inline=False) - warnUser_embed.add_field(name="Grund:", value=f"```{reason}```", inline=False) - warnUser_embed.set_author(name=f"{ctx.guild.name}", icon_url=member.avatar.url) - warnUser_embed.set_thumbnail(url=member.avatar.url) - warnUser_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - warn_embed = discord.Embed( - title="`✅` Warn", - description=f"Du hast den User {member.mention} auf dem Server **{ctx.guild.name}** gewarnt.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - warn_embed.add_field(name="Moderator:", value=f"```{ctx.author}```", inline=False) - warn_embed.add_field(name="Warn ID:", value=f"```{warn_id}```", inline=False) - warn_embed.add_field(name="Grund:", value=f"```{reason}```", inline=False) - warn_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.user.avatar.url) - warn_embed.set_thumbnail(url=member.avatar.url) - warn_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - await member.send(embed=warnUser_embed) - await ctx.respond(embed=warn_embed, ephemeral=False) - - @warn_group.command(description="Unwarn einen User aus dem Server") - @discord.default_permissions(kick_members=True) - @discord.guild_only() - async def unwarn( - self, - ctx, - member: Option(discord.Member, "Wähle den User aus, den du unwarnen willst", required=True), - warn_id: Option(int, "Wähle die Warn ID aus, die du zurückziehen willst", required=True), - reason: Option(str, "Gib einen Grund an, warum du den User warnen willst", required=False, - default="Kein Grund angegeben") - ): - - unwarnUser_embed = discord.Embed( - title="`🍀` Unwarn", - description=f"Ein Warn von dir vom Server **{ctx.guild.name}** wurde zurückgezogen.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - unwarnUser_embed.add_field(name="Moderator:", value=f"```{ctx.author}```", inline=False) - unwarnUser_embed.add_field(name="Warn ID:", value=f"```{warn_id}```", inline=False) - unwarnUser_embed.add_field(name="Grund:", value=f"```{reason}```", inline=False) - unwarnUser_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.bot.user.avatar.url) - unwarnUser_embed.set_thumbnail(url=ctx.guild.icon.url) - unwarnUser_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - unwarn_embed = discord.Embed( - title=f"`✅` Unwarn", - description=f"Du hast den {member.mention} aus dem Server **{ctx.guild.name}** unwarned.", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - unwarn_embed.add_field(name="Moderator:", value=f"```{ctx.author}```", inline=False) - unwarn_embed.add_field(name="Warn ID:", value=f"```{warn_id}```", inline=False) - unwarn_embed.add_field(name="Grund:", value=f"```{reason}```", inline=False) - unwarn_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.bot.user.avatar.url) - unwarn_embed.set_thumbnail(url=member.avatar.url) - unwarn_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - async with aiosqlite.connect("mod_sys.db") as db: - await db.execute( - "DELETE FROM WarnList WHERE user_id = ? AND guild_id = ? AND warn_id = ?", - (member.id, ctx.guild.id, warn_id) - ) - await db.commit() - - await member.send(embed=unwarnUser_embed) - await ctx.respond(embed=unwarn_embed, ephemeral=False) - - @warn_group.command(description="Zeige alle Warns eines Users aus dem Server an") - @discord.default_permissions(kick_members=True) - @discord.guild_only() - async def warnings(self, ctx, member: discord.Member): - - warns_info = [] - async with aiosqlite.connect("mod_sys.db") as db: - async with db.execute( - "SELECT warn_id, mod_id, guild_id, user_id, warns, warn_reason, warn_time FROM WarnList WHERE user_id = ? AND guild_id = ?", - (member.id, ctx.guild.id)) as cursor: - rows = await cursor.fetchall() - for row in rows: - warn_id, mod_id, guild_id, user_id, warns, warn_reason, warn_time = row - warn_time = datetime.datetime.strptime(warn_time, '%Y-%m-%d %H:%M:%S') - warns_info.append( - f"**Warn-ID:** __{warn_id}__ | **Warn ausgestellt am:** {warn_time.strftime('%Y-%m-%d %H:%M:%S')}\n") - warns_info.append(f"**Moderator:** <@{mod_id}> | **Mod-ID**: __{mod_id}__\n") - warns_info.append(f"**> Grund:**\n```{warn_reason}```") - warns_info.append("\n") - - if not warns_info: - warnings_embed = discord.Embed( - title="`⚠️` The user has no warns!", - description=f"User: {member.mention}", - color=discord.Color.red(), - ) - else: - warnings_embed = discord.Embed( - title=f"`⚠️` Warn Liste {member.name}#{member.discriminator}", - description=f"__**Liste der Warns**__", - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - warnings_embed.add_field(name="", value="".join(warns_info), inline=False) - warnings_embed.set_author(name=f"{ctx.guild.name}", icon_url=ctx.guild.icon.url) - warnings_embed.set_thumbnail(url=member.avatar.url) - warnings_embed.set_footer(text=f"{ctx.bot.user.name}#{ctx.bot.user.discriminator} | Oppro.net Development", - icon_url=ctx.bot.user.avatar.url) - - await ctx.respond(embed=warnings_embed, ephemeral=False) - - @admin.command(description="Lösche Nachrichten aus dem Channel") - @commands.has_permissions(administrator=True) - async def purge(self, ctx, amount: Option(int, "Anzahl an Nachrichten (min. 1 | max. 100)", required=True)): - amount = amount + 1 - - if amount > 101: - - error_embed = discord.Embed( - title="`❌` Fehler!", - description="`Ich kann nicht mehr als 100 Nachrichten Löschen!`", - color=discord.Color.red(), - timestamp=datetime.datetime.utcnow() - ) - error_embed.set_thumbnail(url=ctx.guild.icon.url) - error_embed.set_footer(text=f"| {ctx.bot.user.name}#{ctx.bot.user.discriminator}", - icon_url=ctx.bot.user.avatar.url) - error_embed.set_author(name=f"Purge | Moderation System | Oppro.net Development", icon_url=ctx.bot.user.avatar.url) - - await ctx.respond(embed=error_embed, delete_after=6, ephemeral=True) - - else: - deleted = await ctx.channel.purge(limit=amount) - - success_embed = discord.Embed( - title="`✅` Erfolgreich!", - description="**{}** `Nachrichten gelöscht!`".format(len(deleted)), - color=discord.Color.green(), - timestamp=datetime.datetime.utcnow() - ) - success_embed.set_thumbnail(url=ctx.guild.icon.url) - success_embed.set_footer(text=f"| {ctx.bot.user.name}#{ctx.bot.user.discriminator}", - icon_url=ctx.bot.user.avatar.url) - success_embed.set_author(name=f"Purge | Moderation System | Oppro.net Development", icon_url=ctx.bot.user.avatar.url) - - await ctx.respond(embed=success_embed, delete_after=3, ephemeral=True) - - -def setup(bot): - bot.add_cog(ModerationSystem(bot)) \ No newline at end of file diff --git a/cog/allgemein.py b/cog/allgemein.py deleted file mode 100644 index 7952bd6..0000000 --- a/cog/allgemein.py +++ /dev/null @@ -1,52 +0,0 @@ -import discord -from discord.ext import commands -from discord import slash_command, Option -from discord.commands import SlashCommandGroup - -class infos(commands.Cog): - def __init__(self, bot): - self.bot = bot - allgemein = SlashCommandGroup("allgemein") - @allgemein.command(description="Infomationen") - async def infos(self, ctx): - - embed = discord.Embed( - title="Infomationen für den Bot", - color=discord.Color.red() - ) - embed.set_author(name="OPPRO.NET GmbH") - embed.add_field(name="Coder", value="Coder: LennyPegauOfficial und Oppro.net Development") - embed.add_field(name="Name: OPPRO.NET Manage", value="", inline=False) - embed.add_field(name="Codes:", value="Admin Tools - from CodingKeks\nucreatepassword - from CodingKeks\nFeedback - From Oppro.net Development\ninfos - From Oppro.net Development\nnews - From Oppro.net Development\nstatus - From Oppro.net Development\ntimeout - From Codingkeks\nuserinfo - from Codingkeks") - embed.add_field(name="Rechte: ", value="Admin", inline=False) - embed.set_footer(text="Projekt des Oppro.net Development") - await ctx.respond(embed=embed, view=Button()) - - @allgemein.command(description="Bekomme den Support Server!") - async def support(self, ctx): - - embed = discord.Embed( - title="Unser Support Server", - color=discord.Color.red() - ) - embed.set_author(name="Oppro.net GmbH") - embed.add_field(name="Link: https://discord.gg/k38huukRcB", value="") - embed.set_footer(text="Projekt des Oppro.net Development") - await ctx.respond(embed=embed, ephemeral=True) - - -def setup(bot): - bot.add_cog(infos(bot)) - -class Button(discord.ui.View): - @discord.ui.button(label="Links", style=discord.ButtonStyle.primary) - async def button_callback(self, ctx, interactions): - embed2 = discord.Embed( - title="Hier sind die Links", - color=discord.Color.red() - ) - embed2.set_author(name="Oppro.net GmbH") - embed2.add_field(name="Links:", value="https://discord.gg/codingkeks\nhttps://discord.gg/3rbVWaRTpD") - embed2.set_footer(text="Projekt des Oppro.net Development") - - await interactions.response.send_message(embed=embed2) \ No newline at end of file diff --git a/cog/news.py b/cog/announcements.py similarity index 60% rename from cog/news.py rename to cog/announcements.py index e5279d8..ade1c9a 100644 --- a/cog/news.py +++ b/cog/announcements.py @@ -3,43 +3,56 @@ from discord import slash_command, Option import sqlite3 + def get_db_connection(): conn = sqlite3.connect('channels_id_newslog.db') return conn -class news1(commands.Cog): + +class Announce(commands.Cog): def __init__(self, bot): self.bot = bot @slash_command(description="Sende News") @commands.has_permissions(administrator=True) - async def news( + async def announce( self, - ctx, + ctx: discord.ApplicationContext, title: Option(str, "hier kommt der Title hin"), text: Option(str, "Hier kommt die Beschreibung hin"), - channel: Option(discord.TextChannel, "Hier kommt der Channel hin")): - + channel: Option(discord.TextChannel, "Hier kommt der Channel hin") + ): embed = discord.Embed( title=f"{title}", color=discord.Color.red() ) embed.set_author(name="OPPRO.NET GmbH") embed.add_field(name="", value=f"{text}", inline=False) - embed.add_field(name="Links:", value="[Invite](https://discord.com/oauth2/authorize?client_id=1248265007381348403&permissions=8&integration_type=0&scope=bot) | [Support Server](https://discord.gg/3rbVWaRTpD)") + embed.add_field( + name="Links:", + value="[Invite](https://discord.com/oauth2/authorize?" + "client_id=1248265007381348403&permissions=8&integration_type=0&scope=bot) | " + "[Support Server](https://discord.gg/3rbVWaRTpD)" + ) embed.set_footer(text="Created by Oppro.net Development") await channel.send(embed=embed) embed = discord.Embed( - title=f"News wurden erstellt für {title}", + title=f"Announcement wurden erstellt für {title}", color=discord.Color.green() ) embed.set_author(name="OPPRO.NET GmbH") embed.add_field(name="mit dem Inhalt:", value=f"{text}", inline=False) - embed.add_field(name="Links:", value="[Invite](https://discord.com/oauth2/authorize?client_id=1248265007381348403&permissions=8&integration_type=0&scope=bot) | [Support Server](https://discord.gg/3rbVWaRTpD)") + embed.add_field( + name="Links:", + value="[Invite](https://discord.com/oauth2/authorize?" + "client_id=1248265007381348403&permissions=8&integration_type=0&scope=bot) | " + "[Support Server](https://discord.gg/3rbVWaRTpD)") embed.set_footer(text="Created by Oppro.net Development") await ctx.respond(embed=embed, ephemeral=True) + + def setup(bot): - bot.add_cog(news1(bot)) \ No newline at end of file + bot.add_cog(Announce(bot)) diff --git a/cog/dead_chat.py b/cog/dead_chat.py new file mode 100644 index 0000000..c2de5fd --- /dev/null +++ b/cog/dead_chat.py @@ -0,0 +1,24 @@ +from discord import slash_command +from discord.ext import commands +import discord + + +class DeadChat(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @slash_command(name="dead-chat") + @discord.default_permissions(administrator=True) + async def dead_chat(self, ctx: discord.ApplicationContext): + embed = discord.Embed( + title="DeathChat", + description="Schreibt bitte mehr, dass würde uns freuen.\nVielen Dank!", + color=discord.Color.red() + ) + + await ctx.respond("@everyone", embed=embed, allowed_mentions=discord.AllowedMentions.all()) + await ctx.respond("Dead-Chat wurde gesendet", ephemeral=True) + + +def setup(bot): + bot.add_cog(DeadChat(bot)) diff --git a/cog/deathchat.py b/cog/deathchat.py deleted file mode 100644 index 27702a5..0000000 --- a/cog/deathchat.py +++ /dev/null @@ -1,21 +0,0 @@ -import discord -from discord.ext import commands -from discord import slash_command, Option - -class deathchat(commands.Cog): - def __init__(self, bot): - self.bot = bot - - @slash_command() - @discord.default_permissions(administrator=True) - async def deathchat(self, ctx): - - embed = discord.Embed( - title="DeathChat", - description="DeathChat Schreibe bitte mehr fas würde uns freuen\n Vielen Dank", - color=discord.Color.red() - ) - await ctx.respond("<@&1256974368450281564>", embed=embed) - await ctx.respond("DeathChat wurde gesendet", ephemeral=True) -def setup(bot): - bot.add_cog(deathchat(bot)) \ No newline at end of file diff --git a/cog/Feedback.py b/cog/feedback.py similarity index 93% rename from cog/Feedback.py rename to cog/feedback.py index 6f552e9..d1d9ca1 100644 --- a/cog/Feedback.py +++ b/cog/feedback.py @@ -1,6 +1,7 @@ -import discord -from discord.ext import commands from discord import slash_command, Option +from discord.ext import commands +import discord + class Feedback(commands.Cog): def __init__(self, bot): @@ -9,7 +10,7 @@ def __init__(self, bot): @slash_command(description="Bewerte unsere Team Mitglieder") async def feedback( self, - ctx, + ctx: discord.ApplicationContext, nutzer: Option(discord.Member, "Den Member den du Bewerten willst (Nur Teamler!)"), sterne: Option(int, "Bewertung in Sternen (1-5)", choices=[1, 2, 3, 4, 5]), text: Option(str, "Die Bewertung") @@ -38,7 +39,7 @@ async def feedback( color=discord.Color.red() ) embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar.url) - embed.add_field(name= "Deine Bewertung für",value=f"{nutzer} wurde erfolgreich versendet") + embed.add_field(name="Deine Bewertung für", value=f"{nutzer} wurde erfolgreich versendet") embed.add_field(name=f"mit {sterne} von 5", value="⭐" * sterne, inline=False) embed.set_footer(text="OPPRO.NET | LennyPegauOfficial has be created") @@ -46,4 +47,4 @@ async def feedback( def setup(bot): - bot.add_cog(Feedback(bot)) \ No newline at end of file + bot.add_cog(Feedback(bot)) diff --git a/cog/general.py b/cog/general.py new file mode 100644 index 0000000..4589f3b --- /dev/null +++ b/cog/general.py @@ -0,0 +1,68 @@ +from discord.commands import SlashCommandGroup +from discord.ext import commands +import discord + + +class Button(discord.ui.View): + @discord.ui.button(label="Links", style=discord.ButtonStyle.primary) + async def button_callback(self, ctx: discord.ApplicationContext, interactions): + embed = discord.Embed( + title="Hier sind die Links", + color=discord.Color.red() + ) + embed.set_author(name="Oppro.net GmbH") + embed.add_field( + name="Links:", + value="https://discord.gg/codingkeks\n" + "https://discord.gg/3rbVWaRTpD" + ) + embed.set_footer(text="Projekt des Oppro.net Development") + + await interactions.response.send_message(embed=embed) + + +class Infos(commands.Cog): + allgemein = SlashCommandGroup("allgemein") + + def __init__(self, bot): + self.bot = bot + + @allgemein.command(description="Informationen") + async def infos(self, ctx: discord.ApplicationContext): + embed = discord.Embed( + title="Informationen für den Bot", + color=discord.Color.red() + ) + embed.set_author(name="OPPRO.NET GmbH") + embed.add_field(name="Coder", value="Coder: LennyPegauOfficial und Oppro.net Development") + embed.add_field(name="Name: OPPRO.NET Manage", value="", inline=False) + embed.add_field( + name="Codes:", + value="Admin Tools - from CodingKeks\n" + "ucreatepassword - from CodingKeks\n" + "Feedback - From Oppro.net Development\n" + "infos - From Oppro.net Development\n" + "news - From Oppro.net Development\n" + "status - From Oppro.net Development\n" + "timeout - From Codingkeks\nuserinfo - from Codingkeks" + ) + embed.add_field(name="Rechte: ", value="Admin", inline=False) + embed.set_footer(text="Projekt des Oppro.net Development") + + await ctx.respond(embed=embed, view=Button()) + + @allgemein.command(description="Erhalte einen link zum Support Server!") + async def support(self, ctx: discord.ApplicationContext): + embed = discord.Embed( + title="Unser Support Server", + color=discord.Color.red() + ) + embed.set_author(name="Oppro.net GmbH") + embed.add_field(name="Link: https://discord.gg/k38huukRcB", value="") + embed.set_footer(text="Projekt des Oppro.net Development") + + await ctx.respond(embed=embed, ephemeral=True) + + +def setup(bot): + bot.add_cog(Infos(bot)) diff --git a/cog/status.py b/cog/status.py index 5eecfbd..daffdfd 100644 --- a/cog/status.py +++ b/cog/status.py @@ -1,7 +1,7 @@ -import discord -from discord.ext import commands from discord import slash_command, Option -from discord import Embed +from discord.ext import commands +import discord + class Status(commands.Cog): def __init__(self, bot): @@ -11,50 +11,51 @@ def __init__(self, bot): name="status", description="Setze den Status des Bots", options=[ - Option(str, name="typ", description="Der Typ des Status", choices=["game", "stream", "custom", "listening", "watching"]), - Option(str, name="name", description="Der Name des Spiels, Streams oder des benutzerdefinierten Status"), - Option(str, name="status", description="Der Status des Bots", choices=["online", "dnd ", "idle", "offline"], required=False) + Option( + str, name="typ", + description="Der Typ des Status", + choices=["playing", "stream", "custom", "listening", "watching"] + ), + Option( + str, + name="name", + description="Der Name des Spiels, Streams oder des benutzerdefinierten Status" + ), + Option( + str, + name="status", + description="Der Status des Bots", choices=["online", "dnd", "idle", "offline"], + required=False + ) ] ) async def status(self, ctx: discord.ApplicationContext, typ: str, name: str, status: str = "online"): - if typ == "game": - act = discord.Game(name=name) + if typ in ("playing", "custom", "listening", "watching"): + act = discord.Activity(type=getattr(discord.ActivityType, typ), name=name) elif typ == "stream": - act = discord.Streaming(name=name, url="https://www.twitch.tv/dein-kanal") - elif typ == "custom": - act = discord.Activity(type=discord.ActivityType.custom, name=name) - elif typ == "listening": - act = discord.Activity(type=discord.ActivityType.listening, name=name) - elif typ == "watching": - act = discord.Activity(type=discord.ActivityType.watching, name=name) + act = discord.Streaming(name=name, url="https://www.twitch.tv/lennypegauofficial") else: - await ctx.respond("Ungültiger Typ angegeben.") - return - - if status == "online": - bot_status = discord.Status.online - elif status == "dnd": - bot_status = discord.Status.dnd - elif status == "idle": - bot_status = discord.Status.idle - elif status == "offline": - bot_status = discord.Status.offline - else: - await ctx.respond("Ungültiger Status angegeben.") - return + return await ctx.respond("Ungültiger Typ angegeben.") + + if status not in ("online", "dnd", "idle", "offline"): + return await ctx.respond("Ungültiger Status angegeben.") + + bot_status = getattr(discord.Status, status) await self.bot.change_presence(activity=act, status=bot_status) - embed = discord.Embed ( - title="Erfolgerich den Status geandert", + embed = discord.Embed( + title="Erfolgreich den Status ge#ndert", color=discord.Color.green() - ) + ) embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar.url) - embed.add_field(name="Der Status wurde Erfolgerich geandert zu", value=f"{status}", inline=False) + embed.add_field(name="Der Status wurde Erfolgreich geändert zu", value=f"{status}", inline=False) embed.add_field(name="mit den Namen: ", value=f"{name}", inline=False) embed.add_field(name="Mit den Typ:", value=f"{typ}", inline=False) embed.set_footer(text="OPPRO.NET | Created by LennyPegauOfficial | Projekt des Oppro.net Development") await ctx.respond(embed=embed) + + def setup(bot): bot.add_cog(Status(bot)) diff --git a/cog/timeout.py b/cog/timeout.py index beaa108..d09e884 100644 --- a/cog/timeout.py +++ b/cog/timeout.py @@ -1,19 +1,19 @@ -import discord -from discord.ext import commands from discord.commands import slash_command, Option +from discord.ext import commands from datetime import timedelta +import discord -class timeout(commands.Cog): +class Timeout(commands.Cog): def __int__(self, bot): self.bot = bot @slash_command(description="Timeoute einen Member") @discord.default_permissions(moderate_members=True) async def timeout( - self, ctx, + self, + ctx: discord.ApplicationContext, member: Option(discord.Member, "Wähle ein Member aus"), - reason: Option(str, "Wähle ein Grund aus", choices=([ "Extremes Chatverhalten | Mute - 2 Stunden", "Extreme Beleidigungen | Mute - 1 Woche", @@ -23,24 +23,25 @@ async def timeout( "Support-Missbrauch | Mute - 1 Tag", ]), required=True) ): - - if reason == "Extremes Chatverhalten | Mute - 2 Stunden ": - duration = timedelta(hours=2) - - elif reason == "Extreme Beleidigungen | Mute - 1 Woche": - duration = timedelta(weeks=1) - - elif reason == "Missachtung von Team Anweisungen | Mute - 1 Tag": - duration = timedelta(days=1) - - elif reason == "Sensible Themen | Mute - 4 Tage": - duration = timedelta(days=4) - - elif reason == "Extreme Provokation | Mute 1 Woche": - duration = timedelta(weeks=1) - - elif reason == "Support-Missbrauch | Mute - 1 Tag": - duration = timedelta(days=1) + match reason: + case "Extremes Chatverhalten | Mute - 2 Stunden": + duration = timedelta(hours=2) + case "Extreme Beleidigungen | Mute - 1 Woche": + duration = timedelta(weeks=1) + case "Missachtung von Team Anweisungen | Mute - 1 Tag": + duration = timedelta(days=1) + case "Sensible Themen | Mute - 4 Tage": + duration = timedelta(days=4) + case "Extreme Provokation | Mute 1 Woche": + duration = timedelta(weeks=1) + case "Support-Missbrauch | Mute - 1 Tag": + duration = timedelta(days=1) + case _: + return discord.Embed( + title="✅ | User wurde erfolgreich getimeoutet", + description=f"", + color=discord.Color.green() + ) try: await member.timeout_for(duration, reason=reason) @@ -50,41 +51,43 @@ async def timeout( f"\nGrund: {reason}", color=discord.Color.green() ) - em = discord.Embed( - title="⛔ | Fehler beim muten", - description="Ich habe keine Berechtigung, um diesen Member zu muten", - color=discord.Color.red() + except (AttributeError, discord.Forbidden): + return await ctx.respond( + embed=discord.Embed( + title="⛔ | Fehler beim muten", + description="Ich habe entweder keine Berechtigung, " + "um diesen Member zu muten oder dieser User ist nicht Teil dieses Servers", + color=discord.Color.red() + ), + ephemeral=True ) - except discord.Forbidden: - await ctx.respond(embed=em, ephemeral=True) - return + await ctx.respond(embed=embed) @slash_command(description="Entferne einen Timeout") @discord.default_permissions(moderate_members=True) - async def removetimeout( + async def remove_timeout( self, ctx, member: Option(discord.Member, "Wähle einen Member"), ): try: - await member.timeout(None) + await member.Timeout(None) embed = discord.Embed( title="✅ | User wurde erfolgreich entmuted", description=f"Der Member {member.mention} wurde entmuted", color=discord.Color.green() ) - - em = discord.Embed( - title="⛔ | Fehler beim entmuten", - description="Ich habe keine Berechtigung, um diesen Member zu entmuten", - color=discord.Color.red() - ) - except discord.Forbidden: - await ctx.respond(embed=em, ephemeral=True) - return + return await ctx.respond( + embed=discord.Embed( + title="⛔ | Fehler beim entmuten", + description="Ich habe keine Berechtigung, um diesen Member zu entmuten", + color=discord.Color.red() + ), + ephemeral=True + ) await ctx.respond(embed=embed) def setup(bot): - bot.add_cog(timeout(bot)) \ No newline at end of file + bot.add_cog(Timeout(bot)) diff --git a/cog/userinfo.py b/cog/user_info.py similarity index 53% rename from cog/userinfo.py rename to cog/user_info.py index ea7dbca..3095d94 100644 --- a/cog/userinfo.py +++ b/cog/user_info.py @@ -4,74 +4,91 @@ # ┃ ┃ ┣━━━━━━┛ # ┃ ┃ ┃ # ┗━━━━━━┛ ┃ +from discord import slash_command +from ezcord import View +from bot import Bot +import discord +import ezcord +class UserInfo(ezcord.Cog, emoji="<:info:1147664192325812406>"): + @staticmethod + def get_user_activity(activity): + if isinstance(activity, discord.Spotify): + return f'Spotify: [{activity.artist} - {activity.title}]({activity.track_url})' -import discord -from discord import slash_command -import ezcord -from ezcord import View -class Userinfo(ezcord.Cog, emoji="<:info:1147664192325812406>"): + if isinstance(activity, discord.Game): + return f'Spielt: {activity.name}' + + if isinstance(activity, discord.Streaming): + return f'Streamt: [{activity.twitch_name} - {activity.game}]({activity.url})' + + if isinstance(activity, discord.CustomActivity): + return f'Status: {activity.name}' + + return f'{activity.name}: {activity.details}' @slash_command(description="Lasse dir Informationen über einen Benutzer auf den Server anzeigen") - @discord.option("user",discord.Member,description="Wähle den User aus über den die Info sein soll") - async def user(self,ctx:discord.ApplicationContext, member:discord.Member=None): + @discord.option("user", discord.Member, description="Wähle den User aus über den die Info sein soll") + async def user( + self, + ctx: discord.ApplicationContext, + member: discord.Member = None + ): if member is None: member = ctx.author + if member not in ctx.guild.members: - await ctx.respond("Dieser User ist nicht auf dem Server",ephemeral=True) - return - if isinstance(member, discord.Member): # Überprüfe, ob member ein Mitglied ist - activities = [] - for activity in member.activities: - if isinstance(activity, discord.Spotify): - txt = f'Spotify: [{activity.artist} - {activity.title}]({activity.track_url})' - elif isinstance(activity, discord.Game): - txt = f'Spielt: {activity.name}' - elif isinstance(activity, discord.Streaming): - txt = f'Streamt: [{activity.twitch_name} - {activity.game}]({activity.url})' - elif isinstance(activity, discord.CustomActivity): - txt = f'Status: {activity.name}' - else: - txt = f'{activity.name}: {activity.details}' - activities.append(txt) + return await ctx.respond("Dieser User ist nicht auf dem Server", ephemeral=True) + + activities = [ + UserInfo.get_user_activity(activity) + for activity in member.activities + ] if isinstance(member, discord.Member) else [] + rlist = [] for role in member.roles: rlist.append(str(role.mention)) rlist.reverse() - embed = discord.Embed(title=f"memberinfo über {member.display_name} ", color=0x5965f2) + embed = discord.Embed( + title=f"MemberInfo über {member.display_name} ", + color=0x5965f2 + ) embed.add_field(name="Name:", value=f"{member}") - embed.add_field(name="Nickname", value=f"{member.nick}" if member.nick else "hat keinen Nickname",inline=True) + embed.add_field(name="Nickname", value=f"{member.nick}" if member.nick else "hat keinen Nickname", inline=True) embed.add_field(name="Display Name", value=f"{member.display_name}") embed.add_field(name="Farbe", value=f"{member.colour}") embed.add_field(name="Erwähnung", value=f"{member.mention}") embed.add_field(name='Status:', value=member.status, inline=False) - embed.add_field(name="Booster", value=f"Ja" if member.premium_since else "Nein") + embed.add_field( + name="Booster", + value=f"Ja" if member.premium_since else "Nein" + ) embed.add_field(name="Höchste Rolle", value=f"{member.top_role.mention}") embed.add_field(name="Bot:", value=f'{("Ja" if member.bot else "Nein")}') embed.add_field(name="Server beigetreten:", value=f"") embed.add_field(name="Discord beigetreten:", value=f"") - embed.add_field(name=f"Rollen: {len(member.roles) - 1}", value=','.join(rlist),inline=False) - embed.add_field(name="Timeout?",value=f"ja" if member.timed_out else "nein") + embed.add_field(name=f"Rollen: {len(member.roles) - 1}", value=','.join(rlist), inline=False) + embed.add_field(name="Timeout?", value=f"ja" if member.timed_out else "nein") embed.set_footer(text="OPPRO.NET | created by Lucky 👑") banner_user = await self.bot.fetch_user(member.id) + try: embed.set_image(url=banner_user.banner.url) except AttributeError: pass + if activities: embed.add_field(name='Aktivitäten', inline=False, value='\n'.join(activities)) + embed.set_author(name=f"{member}", icon_url=f"{member.display_avatar}") embed.set_thumbnail(url=member.display_avatar) embed.set_footer(text=f'Angefragt von {ctx.user.name} • {ctx.user.id}', icon_url=ctx.user.display_avatar) - await ctx.respond(embed=embed,view=Userbutton(self,ctx,member,ctx.user)) - + await ctx.respond(embed=embed, view=UserButton(self, ctx, member, ctx.user)) -def setup(bot: discord.Bot): - bot.add_cog(Userinfo(bot)) -class Userbutton(View): - def __init__(self,bot,ctx,member,user) -> None: +class UserButton(View): + def __init__(self, bot: Bot, ctx: discord.ApplicationContext, member: discord.Member, user: discord.User) -> None: self.bot = bot self.ctx = ctx self.member = member @@ -79,99 +96,116 @@ def __init__(self,bot,ctx,member,user) -> None: super().__init__(timeout=None) @discord.ui.button(label="🔰 Home", style=discord.ButtonStyle.green, custom_id="info") - async def info(self, button,ctx: discord.Interaction): + async def info(self, button: discord.ui.Button, ctx: discord.ApplicationContext): if self.member is None: self.member = self.ctx.author - if isinstance(self.member, discord.Member): - activities = [] - for activity in self.member.activities: - if isinstance(activity, discord.Spotify): - txt = f'Spotify: [{activity.artist} - {activity.title}]({activity.track_url})' - elif isinstance(activity, discord.Game): - txt = f'Spielt: {activity.name}' - elif isinstance(activity, discord.Streaming): - txt = f'Streamt: [{activity.twitch_name} - {activity.game}]({activity.url})' - elif isinstance(activity, discord.CustomActivity): - txt = f'Status: {activity.name}' - else: - txt = f'{activity.name}: {activity.details}' - activities.append(txt) + + activities = [ + UserInfo.get_user_activity(activity) + for activity in self.member.activities + ] if isinstance(self.member, discord.Member) else [] + rlist = [] for role in self.member.roles: rlist.append(str(role.mention)) rlist.reverse() + embed = discord.Embed(title=f"Memberinfo über {self.member.display_name}", color=0x5965f2) embed.add_field(name="Name:", value=f"{self.member}") - embed.add_field(name="Nickname", value=f"{self.member.nick}" if self.member.nick else "hat keinen Nickname",inline=True) + embed.add_field( + name="Nickname", + value=f"{self.member.nick}" if self.member.nick else "hat keinen Nickname", + inline=True + ) embed.add_field(name="Display Name", value=f"{self.member.display_name}") embed.add_field(name="Farbe", value=f"{self.member.colour}") embed.add_field(name="Erwähnung", value=f"{self.member.mention}") embed.add_field(name='Status:', value=self.member.status, inline=False) - embed.add_field(name="Booster", value=f"Ja" if self.member.premium_since else "Nein") + embed.add_field( + name="Booster", + value=f"Ja" if self.member.premium_since else "Nein" + ) embed.add_field(name="Höchste Rolle", value=f"{self.member.top_role.mention}") embed.add_field(name="Bot:", value=f'{("Ja" if self.member.bot else "Nein")}') embed.add_field(name="Server beigetreten:", value=f"") - embed.add_field(name="<:Discord:1239890198674800671> Discord beigetreten:", value=f"") - embed.add_field(name=f"Rollen: {len(self.member.roles) - 1}", value=','.join(rlist),inline=False) - embed.add_field(name="Timeout?",value=f"ja" if self.member.timed_out else "nein") - banner_user = await ctx.client.fetch_user(self.member.id) + embed.add_field( + name="<:Discord:1239890198674800671> Discord beigetreten:", + value=f"" + ) + embed.add_field(name=f"Rollen: {len(self.member.roles) - 1}", value=','.join(rlist), inline=False) + embed.add_field(name="Timeout?", value=f"ja" if self.member.timed_out else "nein") + embed.set_thumbnail(url=self.member.display_avatar) + + banner_user = await self.bot.fetch_user(self.member.id) try: embed.set_image(url=banner_user.banner.url) except AttributeError: pass + if activities: embed.add_field(name='Aktivitäten', inline=False, value='\n'.join(activities)) - embed.set_thumbnail(url=self.member.display_avatar) - await ctx.response.edit_message(embed=embed) + await ctx.response.edit_message(embed=embed) @discord.ui.button(label="Avatar", style=discord.ButtonStyle.gray, custom_id="avatar") - async def avatar(self, button,ctx: discord.ApplicationContext): + async def avatar(self, button: discord.ui.Button, ctx: discord.ApplicationContext): if self.user.id != ctx.user.id: - return await ctx.respond("Du hast den Command nicht ausgeführt",ephemeral=True) - embed = discord.Embed(title="Avatar von {}".format(self.member.display_name)) + return await ctx.respond("Du hast den Command nicht ausgeführt", ephemeral=True) + embed = discord.Embed(title=f"Avatar von {self.member.display_name}") embed.set_image(url=self.member.display_avatar) await ctx.response.edit_message(embed=embed) @discord.ui.button(label="Banner", style=discord.ButtonStyle.blurple, custom_id="banner") - async def banner(self, button,ctx: discord.Interaction): + async def banner(self, button: discord.ui.Button, ctx: discord.ApplicationContext): if self.user.id != ctx.user.id: - return await ctx.respond("Du hast den Command nicht ausgeführt",ephemeral=True) + return await ctx.respond("Du hast den Command nicht ausgeführt", ephemeral=True) embed = discord.Embed(title="Banner von {}".format(self.member.display_name)) + if self.member.bot: - embed.add_field(name=" ",value="Bots haben keinen Banner") + embed.add_field(name=" ", value="Bots haben keinen Banner") return await ctx.response.edit_message(embed=embed) - banner_user = await ctx.client.fetch_user(self.member.id) + + banner_user = await self.bot.fetch_user(self.member.id) try: embed.set_image(url=banner_user.banner.url) except AttributeError: - embed.add_field(name=" ",value="Dieser User hat keinen Banner") + embed.add_field(name=" ", value="Dieser User hat keinen Banner") + await ctx.response.edit_message(embed=embed) @discord.ui.button(label="Berechtigungen", style=discord.ButtonStyle.red, custom_id="berechtigungen") - async def berechtigungen(self, button,ctx: discord.ApplicationContext): + async def berechtigungen(self, button: discord.ui.Button, ctx: discord.ApplicationContext): if self.user.id != ctx.user.id: - return await ctx.respond("Du hast den Command nicht ausgeführt",ephemeral=True) + return await ctx.respond("Du hast den Command nicht ausgeführt", ephemeral=True) embed = discord.Embed(title="Berechtigungen von {}".format(self.member.display_name)) - embed.add_field(name="Berechtigungen",value=",".join([str(perm[0]) for perm in self.member.guild_permissions if perm[1]])) + embed.add_field( + name="Berechtigungen", + value=",".join([str(perm[0]) for perm in self.member.guild_permissions if perm[1]]) + ) await ctx.response.edit_message(embed=embed) - @discord.ui.button(label="Rollen", style=discord.ButtonStyle.blurple, custom_id="Rollen") - async def rollen(self, button,ctx: discord.ApplicationContext): + async def rollen(self, button: discord.ui.Button, ctx: discord.ApplicationContext): if self.user.id != ctx.user.id: - return await ctx.respond("Du hast den Command nicht ausgeführt",ephemeral=True) - rlist = [] - for role in self.member.roles: - if role.name == "@everyone": - continue - rlist.append(str(role.mention)) - embed = discord.Embed(title="Rollen von {}".format(self.member.display_name)) - if len(rlist) == 0: - embed.add_field(name="Rollen",value="Dieser User hat keine Rollen") + return await ctx.respond("Du hast den Command nicht ausgeführt", ephemeral=True) + + embed = discord.Embed(title=f"Rollen von {self.member.display_name}") + rlist = [ + role.mention + for role in self.member.roles + if role.name == "@everyone" + ] + + if not rlist: + embed.add_field(name="Rollen", value="Dieser User hat keine Rollen") return await ctx.response.edit_message(embed=embed) - embed.add_field(name=f"Rollen: {len(self.member.roles) - 1}", value=','.join(rlist),inline=False) - await ctx.response.edit_message(embed=embed) \ No newline at end of file + embed.add_field(name=f"Rollen: {len(self.member.roles) - 1}", value=','.join(rlist), inline=False) + + await ctx.response.edit_message(embed=embed) + + +def setup(bot: discord.Bot): + bot.add_cog(UserInfo(bot)) diff --git a/de.yaml b/de.yaml index 7d8edf7..1298a04 100644 --- a/de.yaml +++ b/de.yaml @@ -1,54 +1,56 @@ de: - news: - name: neuigkeiten + # Uncategorized + announce: + name: announce options: title: - description: Hier die Überschreibt + description: Überschrift -# Warnungs Commands: - warn: + # Warn + add_warning: name: verwarnen description: options: member: name: nutzer - description: wähle den nutzer aus + description: Wähle einen Nutzer aus reason: name: Grund - description: such dir ein Grund aus + description: Gebe einen Grund an - unwarn: - name: warnung aufheben + remove_warning: + name: warnung-aufheben options: member: name: nutzer - description: wähle den nutzer aus + description: Wähle den Nutzer aus reason: name: Grund description: warnings: - name: warnungs - description: Zeige alle Warnungen eines Users vom Server an + name: warnungen + description: Zeige alle Warnungen eines Nutzers des Servers an options: member: name: nutzer + # Other moderation purge: name: löschen - description: Lösche Nachrichten aus dem Kanal + description: Lösche Nachrichten aus dem angegebenen Kanal options: amount: name: anzahl -# Timeouts commands + + # Timeouts timeout: name: auszeit - description: auszeite einen Nutzer + description: Sperre einen Nutzer für den Server temporär options: member: name: nutzer - removetimeout: - name: entfernt_auszeit - description: Entferne eine Auszeit - + remove_timeout: + name: entferne-auszeit + description: Entferne die Auszeit eines Nutzters diff --git a/en.yaml b/en.yaml index 477f910..2ac2c99 100644 --- a/en.yaml +++ b/en.yaml @@ -1,54 +1,56 @@ en: - news: - name: news + # Uncategorized + announce: + name: announce options: - title: - description: Here the overrides + title: + description: Überschrift -# Warning commands: - warn: + # Warn + add_warning: name: warn description: options: member: name: user - description: select the user + description: Select a user reason: name: reason - description: choose a reason + description: choose a reason - unwarn: - name: remove warning + remove_warning: + name: remove-warning options: member: name: user - description: select the user + description: Select the user reason: name: reason - description: choose a reason - + description: Choose a reason warnings: name: warnings - description: Show all warnings of a user from the server + description: Show all warnings of a user from this server options: member: name: user + # Other moderation purge: name: delete - description: Delete messages from the channel + description: Delete messages from a channel options: amount: name: number -# Timeouts commands + + # Timeouts timeout: name: timeout - description: timeout a user + description: Timeout a user options: member: name: user - removetimeout: - name: remove_timeout + remove_timeout: + name: remove-timeout description: Remove a timeout \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e284f53..cc2298a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,5 @@ -py-cord -ezcord -PyNaCl -PyYAML -aiocache -aiohttp -aiosqlite +python-dotenv>=1.0.1 +aiosqlite>=0.20.0 +colorama>=0.4.6 +py-cord>=2.4.0 +ezcord>=0.6.5