Añadiendo todos los archivos del proyecto (incluidos secretos y venv)
This commit is contained in:
132
botdiscord/discord_bot.py
Normal file
132
botdiscord/discord_bot.py
Normal file
@@ -0,0 +1,132 @@
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
from discord import app_commands
|
||||
import aiohttp
|
||||
|
||||
from botdiscord.config import get_libretranslate_url
|
||||
from botdiscord.database import init_db, get_active_languages, set_active_languages
|
||||
|
||||
lang_mapping = {
|
||||
"Inglés": "en",
|
||||
"Portugués": "pt",
|
||||
"Francés": "fr",
|
||||
"Alemán": "de",
|
||||
"Italiano": "it",
|
||||
"Español": "es"
|
||||
}
|
||||
|
||||
async def translate_text(text, target_lang):
|
||||
url = get_libretranslate_url()
|
||||
if not url:
|
||||
return "Error: URL de LibreTranslate no configurada"
|
||||
|
||||
payload = {
|
||||
"q": text,
|
||||
"source": "auto",
|
||||
"target": lang_mapping.get(target_lang, target_lang),
|
||||
"format": "text"
|
||||
}
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(url, json=payload) as resp:
|
||||
if resp.status == 200:
|
||||
data = await resp.json()
|
||||
return data.get("translatedText", "Error en la traducción.")
|
||||
else:
|
||||
return f"Error de API: {resp.status}"
|
||||
|
||||
class TranslationView(discord.ui.View):
|
||||
def __init__(self, text, languages, original_message):
|
||||
super().__init__(timeout=None)
|
||||
self.text = text
|
||||
self.original_message = original_message
|
||||
for lang in languages:
|
||||
self.add_item(TranslationButton(lang, text))
|
||||
|
||||
class TranslationButton(discord.ui.Button):
|
||||
def __init__(self, lang_name, text):
|
||||
super().__init__(label=f"Traducir a {lang_name}", style=discord.ButtonStyle.primary)
|
||||
self.lang_name = lang_name
|
||||
self.text = text
|
||||
|
||||
async def callback(self, interaction: discord.Interaction):
|
||||
await interaction.response.defer(ephemeral=True)
|
||||
translated = await translate_text(self.text, self.lang_name)
|
||||
await interaction.followup.send(f"**Traducción ({self.lang_name}):**\n{translated}", ephemeral=True)
|
||||
|
||||
class ConfigSelect(discord.ui.Select):
|
||||
def __init__(self, guild_id):
|
||||
active = get_active_languages(guild_id)
|
||||
options = [
|
||||
discord.SelectOption(label=name, value=name, default=(lang_mapping[name] in active))
|
||||
for name in lang_mapping.keys()
|
||||
]
|
||||
super().__init__(placeholder="Selecciona los idiomas activos...", min_values=0, max_values=len(options), options=options)
|
||||
|
||||
async def callback(self, interaction: discord.Interaction):
|
||||
guild_id = interaction.guild_id
|
||||
selected_codes = [lang_mapping[val] for val in self.values]
|
||||
set_active_languages(guild_id, selected_codes)
|
||||
await interaction.response.send_message(f"Configuración actualizada: {', '.join(self.values)}", ephemeral=True)
|
||||
|
||||
class ConfigView(discord.ui.View):
|
||||
def __init__(self, guild_id):
|
||||
super().__init__()
|
||||
self.add_item(ConfigSelect(guild_id))
|
||||
|
||||
intents = discord.Intents.default()
|
||||
intents.message_content = True
|
||||
bot = commands.Bot(command_prefix="!", intents=intents)
|
||||
|
||||
@bot.event
|
||||
async def on_ready():
|
||||
init_db()
|
||||
print(f"Bot conectado como {bot.user}")
|
||||
try:
|
||||
synced = await bot.tree.sync()
|
||||
print(f"Sincronizados {len(synced)} comandos.")
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
@bot.event
|
||||
async def on_message(message):
|
||||
if message.author.bot:
|
||||
return
|
||||
|
||||
text_content = message.content.strip()
|
||||
if not text_content:
|
||||
return
|
||||
|
||||
import re
|
||||
is_only_emoji = re.fullmatch(r'<(a?):[a-zA-Z0-9_]+:[0-9]+>', text_content)
|
||||
if is_only_emoji:
|
||||
return
|
||||
|
||||
if not text_content and message.stickers:
|
||||
return
|
||||
|
||||
active_langs = get_active_languages(message.guild.id)
|
||||
if not active_langs:
|
||||
return
|
||||
|
||||
text_to_translate = message.clean_content
|
||||
|
||||
reverse_mapping = {v: k for k, v in lang_mapping.items()}
|
||||
langs_to_show = [reverse_mapping[l] for l in active_langs if l in reverse_mapping]
|
||||
|
||||
if langs_to_show:
|
||||
view = TranslationView(text_to_translate, langs_to_show, message)
|
||||
await message.reply("¿Traducir este mensaje?", view=view, mention_author=False)
|
||||
|
||||
@bot.tree.command(name="configurar", description="Configura los idiomas de traducción para este servidor")
|
||||
@app_commands.checks.has_permissions(administrator=True)
|
||||
async def configurar(interaction: discord.Interaction):
|
||||
view = ConfigView(interaction.guild_id)
|
||||
await interaction.response.send_message("Selecciona los idiomas que quieres habilitar para los botones de traducción:", view=view, ephemeral=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
from botdiscord.config import get_discord_token
|
||||
token = get_discord_token()
|
||||
if token:
|
||||
bot.run(token)
|
||||
else:
|
||||
print("Error: No se ha configurado el token de Discord")
|
||||
Reference in New Issue
Block a user