Skip to content

Commit bb7e44b

Browse files
committed
version 1.3.0
1 parent 9d51d2f commit bb7e44b

30 files changed

Lines changed: 1006 additions & 840 deletions

README.md

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,15 @@ de la Facultad de Ingeniería de la UBA, aunque puede utilizarse para cualquier
1818

1919
<hr/>
2020

21-
* [**Enlace de Invitación**](https://discord.com/api/oauth2/authorize?client_id=889312376036425810&permissions=292057984064&scope=bot)
21+
* [**Enlace de Invitación**](https://discord.com/api/oauth2/authorize?client_id=889312376036425810&permissions=294205467712&scope=bot%20applications.commands)
22+
23+
* **[Dependencias](requirements.txt)**
24+
- [python-dotenv](https://pypi.org/project/python-dotenv/)
25+
- [discord.py](https://pypi.org/project/discord.py/) (rama `master`)
26+
- [imgur-python](https://pypi.org/project/imgur-python/)
27+
28+
* **[Licencia MIT](LICENSE)**
29+
2230
* **índice**
2331
- [Cómo Ejecutar](#cómo-ejecutar)
2432
- [Changelog](#changelog)
@@ -48,8 +56,9 @@ cd run
4856

4957
| Version |
5058
| :---------: |
51-
|**[v1.2.1](#v121)**|
52-
| [v1.2.0](#v120) |
59+
|**[v1.3.0](#v130)**|
60+
| [v1.2.1](#v121) |
61+
| [v1.2.0](#v120) |
5362
| [v1.1.0](#v110) |
5463
| [v1.0.4](#v104) |
5564
| [v1.0.3](#v103) |
@@ -59,6 +68,16 @@ cd run
5968

6069
<hr/>
6170

71+
## v1.3.0
72+
73+
* Puesto que [discord.py](https://github.com/Rapptz/discord.py) ha continuado su mantenimiento, y las *features* que promete traer son preferidas, **se ha decidido en buena fe volver a usar esta librería.**
74+
75+
* **Agregados los *slash commands*.**
76+
77+
* **Agregado nuevo comando `reboot`.** Ahora se puede reiniciar el bot sin tener que apagarlo manualmente.
78+
79+
<hr style="height:4px" />
80+
6281
### v1.2.1
6382

6483
* **Simplificados algunos imports en las pruebas y en el main.** No deberían tener nombres redundantes.

guia/2c2019/guia_2.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@
121121
"campos": {
122122

123123
},
124-
"pie": "Nota: Hacerlo usando y sin usar la ecuación Σ 𝑛 𝑖=1 𝑖 = 𝑛 (𝑛 + 1)/2. ¿Cuál realiza más operaciones?"
124+
"pie": [
125+
"Nota: Hacerlo usando y sin usar la ecuación Σ 𝑛 𝑖=1 𝑖 = 𝑛 (𝑛 + 1)/2. ¿Cuál realiza más operaciones?"
126+
]
125127
},
126128
"8": {
127129
"titulo": [

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
python-dotenv
2-
py-cord<=2.0.0b4
2+
git+https://github.com/Rapptz/discord.py
33
imgur-python

src/main/ahorcado/ahorcado.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,19 @@ def cargar_palabras(nombre_archivo: str) -> list[str]:
3030
return lineas
3131

3232

33-
def __init__(self, frase: Optional[str]=None, **opciones) -> None:
33+
def __init__(self,
34+
*,
35+
frase: Optional[str]=None,
36+
vidas_maximas: int=7,
37+
id_mensaje_padre: int = int) -> None:
3438
"""
3539
Inicializa una instancia de tipo 'Ahorcado'.
3640
"""
3741

3842
frase_magica = (frase if frase else choice(Ahorcado.cargar_palabras(WORDS_PATH)))
39-
self.maximos_intentos = opciones.get("vidas_maximas", 7)
43+
self.maximos_intentos = vidas_maximas
4044
self.intentos = self.maximos_intentos
45+
self.id_mensaje_padre: int = id_mensaje_padre
4146

4247
self.display_id = 0 # Es inicializado después con el primer mensaje
4348

src/main/archivos/archivos.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from json import dump, load
66
from os import listdir
77
from os.path import isdir, isfile, join, splitext
8-
from typing import Optional
8+
from typing import List, Optional
99

1010
from ..constantes import EXT, GUIA_PATH, PROPERTIES_PATH
1111

@@ -47,14 +47,27 @@ def actualizar_guia(nueva_version: str, guild_id: str) -> None:
4747
guardar_json(propiedades, PROPERTIES_PATH)
4848

4949

50-
def lista_carpetas(carpeta: str=GUIA_PATH) -> list[str]:
50+
def lista_carpetas(carpeta: str) -> list[str]:
5151
"""
5252
Devuelve una lista de todas las carpetas que se encuentran en un
5353
directorio dado.
5454
"""
5555
return [dir for dir in listdir(carpeta) if isdir(join(carpeta, dir))]
5656

5757

58+
def lista_archivos(ruta: str, ext: Optional[str]=None) -> List[str]:
59+
"""
60+
Busca en la ruta especificada si hay archivos, y devuelve una lista
61+
con los nombres de los que encuentre.
62+
63+
Si `ext` no es `None`, entonces probará buscando archivos con esa extensión.
64+
`ext` NO debe tener un punto (`.`) adelante, es decir que `"py"` será automáticamente
65+
tratado como `.py`.
66+
"""
67+
68+
return [file for file in listdir(ruta) if (file.endswith(f".{ext}") if ext else True)]
69+
70+
5871
def version_es_valida(version: str, carpeta: str=GUIA_PATH) -> bool:
5972
"""
6073
Verifica que la versión especificada existe dentro del directorio de
@@ -85,7 +98,7 @@ def cargar_guia(version: str, carpeta: str=GUIA_PATH) -> Optional[DiccionarioGui
8598
sub-diccionario tiene los pares clave valor en donde la clave es el numero
8699
de ejercicio y el valor el enunciado del mismo, ya formateado.
87100
88-
Lanza una excepción si la versión pasada no es válida.
101+
Devuelve `None` si la versión pasada no es válida.
89102
"""
90103

91104
if not version_es_valida(version, carpeta):

src/main/auxiliar/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
"""
44

55
from .auxiliar import *
6+
from .singleton import *

src/main/auxiliar/auxiliar.py

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,66 @@
22
Módulo para funciones auxiliares
33
"""
44

5-
from typing import Optional
5+
from typing import TYPE_CHECKING
66

7-
from discord import Embed, Message
8-
from discord.ext.commands import Bot, Context
9-
from discord.ui import View
7+
from discord import Interaction, Message, Thread
8+
from discord.app_commands import check as appcheck
109

1110
from ..archivos import cargar_json
1211
from ..constantes import (ALGORITMOS_ESSAYA_ID, DEFAULT_PREFIX,
1312
PROPERTIES_PATH, ROL_DIEGO_ID, ROL_DOCENTE_ID)
1413

14+
if TYPE_CHECKING:
1515

16-
def es_rol_valido(ctx: Context) -> bool:
16+
from ..lector import Lector
17+
18+
19+
def es_rol_valido():
1720
"""
1821
Verifica si está en el servidor del curso, y si es así,
1922
si se tienen los roles correspondientes.
2023
"""
2124

22-
return not all((ctx.guild.id == ALGORITMOS_ESSAYA_ID,
23-
all([role.id not in (ROL_DIEGO_ID, ROL_DOCENTE_ID) for role in ctx.author.roles])))
25+
def predicado(interaction: Interaction) -> bool:
26+
"""
27+
Crea el check correspondiente.
28+
"""
29+
30+
return not all((interaction.guild.id == ALGORITMOS_ESSAYA_ID,
31+
all([role.id not in (ROL_DIEGO_ID, ROL_DOCENTE_ID)
32+
for role in interaction.user.roles])))
33+
34+
return appcheck(predicado)
35+
36+
37+
def es_hilo():
38+
"""
39+
Verifica si la interacción ocurrió en un hilo.
40+
"""
41+
42+
def predicado(interaction: Interaction) -> bool:
43+
"""
44+
Crea el check correspondiente.
45+
"""
46+
47+
return isinstance(interaction.channel, Thread)
48+
49+
return appcheck(predicado)
2450

2551

26-
async def mandar_dm(ctx: Context,
27-
contenido: Optional[str]=None,
28-
vista: Optional[View]=None,
29-
embed: Optional[Embed]=None) -> None:
52+
def get_prefijo_por_id(guild_id: int) -> str:
3053
"""
31-
Manda un mensaje por privado.
54+
Devuelve el prefijo de invocación de comandos dependiendo
55+
del guild donde se esté.
3256
"""
3357

34-
await ctx.author.create_dm()
35-
mensaje_enviado = await ctx.author.dm_channel.send(content=contenido, view=vista, embed=embed)
36-
vista.msg = mensaje_enviado
37-
await ctx.message.delete()
58+
return cargar_json(PROPERTIES_PATH)["prefijos"].get(str(guild_id), DEFAULT_PREFIX)
3859

3960

40-
def get_prefijo(_bot: Bot, mensaje: Message) -> str:
61+
def get_prefijo(_bot: "Lector", mensaje: Message) -> str:
4162
"""
4263
Se fija en el diccionario de prefijos y devuelve el que
4364
corresponda al servidor de donde se convoca el comando.
4465
"""
4566

46-
return cargar_json(PROPERTIES_PATH)["prefijos"].get(str(mensaje.guild.id), DEFAULT_PREFIX)
67+
return get_prefijo_por_id(mensaje.guild.id)

src/main/auxiliar/singleton.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""
2+
Módulo que contiene la metaclase para objetos con patrón singleton.
3+
"""
4+
5+
class Singleton(type):
6+
"""
7+
Metaclase 'Singleton'.
8+
"""
9+
10+
_instancias = {}
11+
12+
def __call__(cls, *args, **kwargs):
13+
"""
14+
Llama a este objeto como si fuera una función.
15+
"""
16+
17+
if cls not in cls._instancias:
18+
19+
cls._instancias[cls] = super(Singleton, cls).__call__(*args, **kwargs)
20+
21+
return cls._instancias[cls]

0 commit comments

Comments
 (0)