From 09fd2c85d5b270d49ba3b6ed85aaca8d0601297e Mon Sep 17 00:00:00 2001 From: DanKa Date: Thu, 14 May 2026 18:10:12 -0300 Subject: [PATCH] feat: add /infleta slash command with native Discord poll MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agrega el comando /infleta que genera una encuesta nativa de Discord ("Valor de la infleta") con 10 opciones equidistantes y duración de 8h, a partir de un rango numérico (ej: /infleta 2 3 → 2, 2,1, ..., 2,9). La lógica se aisló en src/infleta.py siguiendo el patrón existente (src/caucho.py, etc.). Se eliminó el comando !infleta por ser slash-only. Se bumpeó discord.py 2.3.2 → 2.4.0 porque la API discord.Poll (encuestas nativas) no existe en versiones anteriores a 2.4. --- main.py | 21 +++++++++++++++ requirements.txt | 4 +-- src/infleta.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/infleta.py diff --git a/main.py b/main.py index 10ef5f8..f609b8f 100644 --- a/main.py +++ b/main.py @@ -31,6 +31,7 @@ from src.nerdearla import nerdearlacharlasfunc from src.shithappens import ShitHappens from src.f1 import f1func +from src.infleta import infletafun #IMPORT DE FUNCIONES PARA SISTEMA DE JOBS from src.jobsearch import jobsearchfunc @@ -772,6 +773,7 @@ async def jobs(ctx, texto): async def f1(ctx, texto): await formula1ctxfunc(ctx, texto) + ######################################################################################### ################### LLAMADAS DE COMANDOS SLASH NATIVOS DISCORD (TREE) ################### @@ -979,6 +981,25 @@ async def formula1(interaction: discord.Interaction, opcion: app_commands.Choice else: await interaction.followup.send("Hubo un error o el mensaje estaba vacío.", ephemeral=True) + +# COMANDO INFLETA (SLASH) +@bot.tree.command(name="infleta", description="Crea encuesta de infleta (10 opciones / 8h)") +@app_commands.describe(rango="Rango inicio-fin. Ej: 2 3 o 2,3") +async def infleta_slash(interaction: discord.Interaction, rango: str): + try: + poll = await infletafun(interaction, rango) + await interaction.response.send_message(poll=poll) + except RuntimeError: + await interaction.response.send_message( + "Tu version de discord.py no soporta encuestas nativas. Actualiza a 2.4+ para usar /infleta.", + ephemeral=True, + ) + except ValueError: + await interaction.response.send_message( + "Rango invalido. Usa: /infleta rango:'2 3' o /infleta rango:'2,3'", + ephemeral=True, + ) + # COMANDO JOB POST (NATIVO DISCORD) @bot.tree.command(name="jobpost", description="Postear un job (solo rol recruiter)") async def jobpost(interaction: discord.Interaction): diff --git a/requirements.txt b/requirements.txt index 6701224..0fbf678 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,9 +17,9 @@ click==8.1.8 colorama==0.4.6 contourpy==1.3.0 cycler==0.12.1 -discord==2.3.2 +discord==2.4.0 discord-ui==5.1.6 -discord.py==2.3.2 +discord.py==2.4.0 dotenv-python==0.0.1 et_xmlfile==2.0.0 exceptiongroup==1.3.0 diff --git a/src/infleta.py b/src/infleta.py new file mode 100644 index 0000000..08f17b7 --- /dev/null +++ b/src/infleta.py @@ -0,0 +1,67 @@ +import discord +from datetime import datetime, timedelta +from decimal import Decimal, InvalidOperation + + +def _parse_infleta_range(raw_input: str) -> tuple[Decimal, Decimal]: + cleaned = raw_input.strip() + + # Soporta "2 3", "2,3" (como separador) y decimales con coma. + if " " in cleaned: + parts = [p.strip() for p in cleaned.split() if p.strip()] + else: + parts = [p.strip() for p in cleaned.split(",") if p.strip()] + + if len(parts) != 2: + raise ValueError("Formato invalido") + + try: + first = Decimal(parts[0].replace(",", ".")) + second = Decimal(parts[1].replace(",", ".")) + except InvalidOperation: + raise ValueError("Formato invalido") + + if first >= second: + raise ValueError("Rango invalido") + + return first, second + + +def _format_decimal_spanish(value: Decimal) -> str: + normalized = value.quantize(Decimal("0.1")) + as_str = f"{normalized}" + if as_str.endswith(".0"): + as_str = as_str[:-2] + return as_str.replace(".", ",") + + +def _build_infleta_options(start: Decimal, end: Decimal) -> list[str]: + step = (end - start) / Decimal("10") + if step <= 0: + raise ValueError("Rango invalido") + + options = [] + for index in range(10): + value = start + (step * Decimal(index)) + options.append(_format_decimal_spanish(value)) + + return options + + +async def infletafun(interaction: discord.Interaction, rango: str) -> discord.Poll: + if not hasattr(discord, "Poll"): + raise RuntimeError("discord.py sin soporte de Poll") + + start, end = _parse_infleta_range(rango) + options = _build_infleta_options(start, end) + + poll = discord.Poll(question="Valor de la infleta", duration=timedelta(hours=8)) + for option in options: + poll.add_answer(text=option) + + # Log + fecha_actual = datetime.now() + print(fecha_actual) + print(f"Se ha ejecutado el comando /infleta por {interaction.user}") + + return poll