Files
Xalos/cogs/custom_commands.py
2025-10-06 14:20:28 +02:00

90 lines
4.4 KiB
Python

import discord
from discord.ext import commands
from discord import app_commands
import sqlite3
class CustomCommands(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.db_connection = sqlite3.connect("xalos_data.db")
self.db_cursor = self.db_connection.cursor()
self.db_cursor.execute("""
CREATE TABLE IF NOT EXISTS custom_commands (
guild_id INTEGER,
command_name TEXT,
response_text TEXT,
PRIMARY KEY (guild_id, command_name)
)
""")
self.db_connection.commit()
# We define a static prefix for custom commands, as they are text-based.
self.prefix = "!"
@commands.Cog.listener()
async def on_message(self, message: discord.Message):
# Ignore bots, DMs, and messages that don't start with the prefix
if message.author.bot or not message.guild or not message.content.startswith(self.prefix):
return
# Extract command name (e.g., "!hello" -> "hello")
command_name = message.content[len(self.prefix):].split(' ')[0].lower()
if not command_name:
return
# Look up the command in the database
self.db_cursor.execute(
"SELECT response_text FROM custom_commands WHERE guild_id = ? AND command_name = ?",
(message.guild.id, command_name)
)
result = self.db_cursor.fetchone()
if result:
response_text = result[0]
await message.channel.send(response_text)
# --- Management Commands ---
customcmd_group = app_commands.Group(name="customcommand", description="Verwaltet benutzerdefinierte Befehle.", default_permissions=discord.Permissions(manage_guild=True))
@customcmd_group.command(name="add", description="Erstellt einen neuen benutzerdefinierten Befehl.")
@app_commands.describe(name="Der Name des Befehls (ohne '!').", response="Die Antwort, die der Bot senden soll.")
async def cc_add(self, interaction: discord.Interaction, name: str, response: str):
command_name = name.lower().split(' ')[0] # Ensure single word and lowercase
try:
self.db_cursor.execute("INSERT INTO custom_commands (guild_id, command_name, response_text) VALUES (?, ?, ?)", (interaction.guild.id, command_name, response))
self.db_connection.commit()
await interaction.response.send_message(f"✅ Der Befehl `{self.prefix}{command_name}` wurde erstellt.", ephemeral=True)
except sqlite3.IntegrityError:
await interaction.response.send_message(f"⚠️ Ein Befehl mit dem Namen `{command_name}` existiert bereits. Bitte entferne ihn zuerst.", ephemeral=True)
@customcmd_group.command(name="remove", description="Löscht einen benutzerdefinierten Befehl.")
@app_commands.describe(name="Der Name des Befehls, der gelöscht werden soll (ohne '!').")
async def cc_remove(self, interaction: discord.Interaction, name: str):
command_name = name.lower()
self.db_cursor.execute("DELETE FROM custom_commands WHERE guild_id = ? AND command_name = ?", (interaction.guild.id, command_name))
if self.db_cursor.rowcount > 0:
self.db_connection.commit()
await interaction.response.send_message(f"✅ Der Befehl `{self.prefix}{command_name}` wurde gelöscht.", ephemeral=True)
else:
await interaction.response.send_message(f"❌ Kein Befehl mit dem Namen `{command_name}` gefunden.", ephemeral=True)
@customcmd_group.command(name="list", description="Zeigt alle benutzerdefinierten Befehle an.")
async def cc_list(self, interaction: discord.Interaction):
self.db_cursor.execute("SELECT command_name FROM custom_commands WHERE guild_id = ?", (interaction.guild.id,))
commands_list = [row[0] for row in self.db_cursor.fetchall()]
if not commands_list:
await interaction.response.send_message("Es gibt keine benutzerdefinierten Befehle auf diesem Server.", ephemeral=True)
return
embed = discord.Embed(
title="Benutzerdefinierte Befehle",
description=", ".join(f"`{self.prefix}{cmd}`" for cmd in commands_list),
color=discord.Color.green()
)
await interaction.response.send_message(embed=embed, ephemeral=True)
async def setup(bot: commands.Bot):
cog = CustomCommands(bot)
bot.tree.add_command(cog.customcmd_group)
await bot.add_cog(cog)