init repo Python Telegram Bots
This commit is contained in:
commit
b98f430561
115
01-blasterbot/README.md
Normal file
115
01-blasterbot/README.md
Normal file
@ -0,0 +1,115 @@
|
||||
## Bot Telegram
|
||||
Funcionalidad:
|
||||
- */huhuu* Responde con wav
|
||||
- */allyb* Responde con png
|
||||
- */caps* Responde con texto capitalizado, lo pasado como argumento
|
||||
- */desconocido* Responde con frase aleateoria, a cualquier comando desconocido
|
||||
- */echo* Devuelve el texto recibido
|
||||
- */timer_minuto* Activa el trabajo alarma, para ser ejecutado en 1 minuto.
|
||||
- */alarma* Envia msg a modo de alarma
|
||||
- **func. ip_alert**: Tarea cada 30 minutos, avisa con MSG si la ip del servidor a cambiado
|
||||
- Otros trabajos de ejemplo
|
||||
|
||||
|
||||
Libreria [python-telegram-bot](https://pypi.org/project/python-telegram-bot/)
|
||||
|
||||
```
|
||||
pip3 install python-telegram-bot
|
||||
pip3 install fetchip
|
||||
```
|
||||
|
||||
## Clases Principales, Updater, Dispatcher, Handler
|
||||
*Extracto de [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot/wiki/Extensions-%E2%80%93-Your-first-Bot)*
|
||||
```
|
||||
telegram.ext.Updater
|
||||
telegram.ext.Dispatcher
|
||||
```
|
||||
La clase **Updater** continuamente consulta y obtiene nuevas actualizaciones
|
||||
desde telegram. Las pasa a la clase **Dispatcher**
|
||||
Al crear un objeto Updater, este crea un objeto Dispatcher.
|
||||
Estos son vinculados entre si en una **Queue**
|
||||
|
||||
Ahora se pueden Registrar **handlers** de diferentes tipos en el Dispatcher,
|
||||
este último ordenará las actualizaciones obtenidas por Updater,
|
||||
según los **handlers** registrados.
|
||||
Estos handlers son entregados a las ***funciones callback*** definidas.
|
||||
|
||||
```
|
||||
telegram.ext.Handler
|
||||
```
|
||||
Esta libreria ofrece ***manejadores*** para casi todos los casos de uso comúnes.
|
||||
En caso de necesitar algo especifico, se puede crear una subclase Handler.
|
||||
|
||||
## Crear Bot en Telegram
|
||||
*[telegram bot](https://core.telegram.org/bots)*
|
||||
```
|
||||
@BotFather
|
||||
/newbot
|
||||
/setname
|
||||
/setdescription
|
||||
/setabouttext
|
||||
/setuserpic
|
||||
```
|
||||
|
||||
## Estructura del directorio
|
||||
```
|
||||
.
|
||||
├── conf
|
||||
│ ├── config.cfg
|
||||
│ └── last_ipp
|
||||
├── media
|
||||
│ ├── allyb.png
|
||||
│ └── huhuu.wav
|
||||
├── blasterbot.py
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Token desde config.cfg
|
||||
Archivo de configuración ***/conf/config.cfg***
|
||||
```
|
||||
[creds]
|
||||
token = <TOKEN>
|
||||
user = <ID>
|
||||
```
|
||||
|
||||
## User bajo el que correrá el servicio
|
||||
User sin home ni login
|
||||
```
|
||||
sudo useradd --system --no-create-home --shell=/sbin/nologin my-user-service
|
||||
```
|
||||
### Conf de permisos comúnmente utilizados
|
||||
```
|
||||
sudo chown -R root:my-user-service /path/to/change
|
||||
sudo chmod -R 775 /path/to/change
|
||||
```
|
||||
### Agregar usuario administrador al grupo del usuario bajo el que corre el servicio
|
||||
```
|
||||
usermod -a -G service-group-user admin-user
|
||||
```
|
||||
|
||||
## Servicio Linux
|
||||
**/etc/systemd/system/bot_telegram.service**
|
||||
```
|
||||
[Unit]
|
||||
Description = Python Telegram Bot Service
|
||||
Wants = network.target
|
||||
After = network.target
|
||||
|
||||
[Service]
|
||||
User = my-user-service
|
||||
Grout = group-my-user-service
|
||||
WorkingDirectory = /path/to/botelegram
|
||||
ExecStart = /pat/to/.vitEnv/bin/python3 /path/to/botelegram/bot.py
|
||||
Restart = always
|
||||
|
||||
[Install]
|
||||
WantedBy = multi-user.target
|
||||
```
|
||||
### Probar y acticar servicio
|
||||
```
|
||||
sudo systemctl start bot_telegram
|
||||
|
||||
Si todo va bien 👌️ :
|
||||
sudo systemctl enable bot_telegram
|
||||
```
|
||||
|
136
01-blasterbot/blasterbot.py
Executable file
136
01-blasterbot/blasterbot.py
Executable file
@ -0,0 +1,136 @@
|
||||
""" Implementación Bot Telegram API """
|
||||
import configparser as cfg
|
||||
import logging
|
||||
#import os
|
||||
import fetchip
|
||||
import random
|
||||
import telegram.ext
|
||||
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
|
||||
|
||||
|
||||
# Credenciales desde archivo de configuración
|
||||
parser = cfg.ConfigParser()
|
||||
parser.read('./conf/config.cfg')
|
||||
token = parser.get('creds', 'token')
|
||||
user = parser.get('creds', 'user')
|
||||
|
||||
# Creación objeto Updater
|
||||
updater = Updater(token=token, use_context=True)
|
||||
dispatcher = updater.dispatcher
|
||||
|
||||
# Config. modulo de logging
|
||||
logging.basicConfig(
|
||||
filename='./conf/bot.log',
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||
level=logging.INFO)
|
||||
|
||||
# Funciónes 'callback'
|
||||
def start(update, context):
|
||||
""" Envía respuesta de texto (text=string) """
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text="Hola hola pianola!!")
|
||||
|
||||
def echo(update, context):
|
||||
""" Envía como respuesta el texto recibido """
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text=update.message.text)
|
||||
|
||||
def caps(update, context):
|
||||
""" Envia como respuesta el texto recibido, capitalizado """
|
||||
text_caps = ' '.join(context.args).upper()
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text=text_caps)
|
||||
|
||||
def huhuu(update, context):
|
||||
""" Envia respuesta de audio (archivo) """
|
||||
context.bot.send_audio(chat_id=update.effective_chat.id, audio=open('./media/huhuu.wav', 'rb'))
|
||||
|
||||
def desconocido(update, context):
|
||||
""" Envía respuesta de texto si no reconoce el comando recibido """
|
||||
respuestas = [
|
||||
'No puedo ayudarte!',
|
||||
'No entiendo lo que dices!',
|
||||
'Mucho no bueno!',
|
||||
'Un gran poder, conlleva una gran resposabilidad',
|
||||
'QUITAN TRABAOhjOJOoOHHH!',
|
||||
'For great justice',
|
||||
'No siempre lloverá',
|
||||
'mamá dice q la vida es como una caja de bombones ...',
|
||||
'Mucho agradezco'
|
||||
]
|
||||
resp_desc = random.choice(respuestas)
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text=resp_desc)
|
||||
|
||||
def allyb(update, context):
|
||||
""" Envia img como respuesta """
|
||||
context.bot.send_photo(chat_id=update.effective_chat.id, photo=open('./media/allyb.png', 'rb'))
|
||||
|
||||
# Trabajo activado a petición
|
||||
def alarma(context: telegram.ext.CallbackContext):
|
||||
""" Envia txt como alarma """
|
||||
context.bot.send_message(chat_id=context.job.context, text='BEEEEP!!')
|
||||
|
||||
def timer_minuto(update: telegram.Update, context: telegram.ext.CallbackContext):
|
||||
""" Tarea corre un minuto despues de llamarla """
|
||||
context.bot.send_message(chat_id=update.message.chat_id, text='TIMER Activado: ⏰️ 1 minuto')
|
||||
context.job_queue.run_once(alarma, 60, context=update.message.chat_id)
|
||||
|
||||
|
||||
# Creación de manejadores de funciones CallBack
|
||||
start_handler = CommandHandler('start', start)
|
||||
echo_handler = MessageHandler(Filters.text & (~Filters.command), echo)
|
||||
caps_handler = CommandHandler('caps', caps)
|
||||
huhuu_handler = CommandHandler('huhuu', huhuu)
|
||||
allyb_handler = CommandHandler('allyb', allyb)
|
||||
timer_handler = CommandHandler('timer', timer_minuto)
|
||||
descon_handler = MessageHandler(Filters.command, desconocido)
|
||||
|
||||
# Agregar manejadores a dispatcher
|
||||
dispatcher.add_handler(start_handler)
|
||||
dispatcher.add_handler(echo_handler)
|
||||
dispatcher.add_handler(caps_handler)
|
||||
dispatcher.add_handler(huhuu_handler)
|
||||
dispatcher.add_handler(allyb_handler)
|
||||
dispatcher.add_handler(timer_handler)
|
||||
dispatcher.add_handler(descon_handler)
|
||||
|
||||
# Cola de trabajos
|
||||
jobs = updater.job_queue
|
||||
|
||||
# Trabajo cada minuto
|
||||
def cada_minuto(context: telegram.ext.CallbackContext):
|
||||
""" Ejemplo job cada 1 minuto """
|
||||
context.bot.send_message(chat_id=user, text='test msg cada minuto')
|
||||
|
||||
job_minuto = jobs.run_repeating(cada_minuto, interval=60, first=0)
|
||||
|
||||
# Solo una vez, con desfase de 5 seg.
|
||||
def callback_5(context: telegram.ext.CallbackContext):
|
||||
""" Aviso inicio bot pasado 5 segundos """
|
||||
context.bot.send_message(chat_id=user, text='BastardBot Iniciado')
|
||||
|
||||
jobs.run_once(callback_5, 5)
|
||||
|
||||
# Alerta cambio ip pública, cada 30 minutos
|
||||
def ip_alert(context: telegram.ext.CallbackContext):
|
||||
""" Alerta, registra e informa cambio de ip pública """
|
||||
try:
|
||||
with open('./conf/last_ipp', 'r') as last_ipp_file:
|
||||
last_ipp = last_ipp_file.read()
|
||||
# No shell user
|
||||
# real_ipp = os.popen('curl -s ifconfig.me').readline()
|
||||
real_ipp = fetchip.get_public_ip()
|
||||
if real_ipp != last_ipp:
|
||||
context.bot.send_message(chat_id=user, text=real_ipp)
|
||||
with open('./conf/last_ipp', 'w') as archivo:
|
||||
archivo.write(real_ipp)
|
||||
except Exception as ex:
|
||||
report = 'Error IP-alert :' + ex
|
||||
context.bot.send_message(chat_id=user, text=report)
|
||||
|
||||
job_ipp = jobs.run_repeating(ip_alert, interval=1800, first=0)
|
||||
|
||||
# Deshabilitar tarea
|
||||
job_minuto.enabled = False
|
||||
# Remover tarea
|
||||
#job_minuto.schedule_removal()
|
||||
|
||||
# Iniciar Bot
|
||||
updater.start_polling()
|
BIN
01-blasterbot/media/allyb.png
Normal file
BIN
01-blasterbot/media/allyb.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
BIN
01-blasterbot/media/huhuu.wav
Normal file
BIN
01-blasterbot/media/huhuu.wav
Normal file
Binary file not shown.
17
02-colgado_bot/README.md
Normal file
17
02-colgado_bot/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
## Telegram Python Bot + juego 'El Colgado'
|
||||
|
||||
Fusion de proyectos compartidos en:
|
||||
- [youtube/CodinEric](https://www.youtube.com/watch?v=dIEdeRGyWFg)
|
||||
- [youtube/freeCodeCamp.org](https://www.youtube.com/watch?v=8ext9G7xspg&t=1465s)
|
||||
|
||||
Crear archivo de configuración
|
||||
./*config.py*
|
||||
```
|
||||
"""
|
||||
Almacenamiento de secretos
|
||||
"""
|
||||
|
||||
TOKEN = 'bot-token'
|
||||
ADMIN = 'user_id'
|
||||
```
|
||||
|
86
02-colgado_bot/anim_colgado.py
Normal file
86
02-colgado_bot/anim_colgado.py
Normal file
@ -0,0 +1,86 @@
|
||||
vida6 = """
|
||||
__________
|
||||
| |
|
||||
| 🧐️
|
||||
| _/|\\_
|
||||
| |
|
||||
| / \\
|
||||
| _| |_
|
||||
|
|
||||
| |﹌﹌﹌﹌|
|
||||
| | ☠️ ☠️ |
|
||||
"""
|
||||
vida5 = """
|
||||
__________
|
||||
| |
|
||||
| |
|
||||
| 🙄️
|
||||
| _/|\\_
|
||||
| |_
|
||||
| | |_
|
||||
| |
|
||||
| |﹌﹌﹌﹌|
|
||||
| | ☠️ ☠️ |
|
||||
"""
|
||||
vida4 = """
|
||||
__________
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| 😣️
|
||||
| _/|\\_
|
||||
| |_
|
||||
| | \\_
|
||||
| |﹌﹌﹌﹌|
|
||||
| | ☠️ ☠️ |
|
||||
"""
|
||||
vida3 = """
|
||||
__________
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| 😖️
|
||||
| ৲/|\\৴
|
||||
| |
|
||||
| |﹌﹌﹌﹌|
|
||||
| | ☠️ ☠️ |
|
||||
"""
|
||||
vida2 = """
|
||||
__________
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| 😫️
|
||||
| ‒‒|‒‒
|
||||
| |﹌﹌﹌﹌|
|
||||
| | ☠️ ☠️ |
|
||||
"""
|
||||
vida1 = """
|
||||
__________
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| 🤬️
|
||||
| |﹌﹌﹌﹌|
|
||||
| | ☠️ ☠️ |
|
||||
"""
|
||||
vida0 = """
|
||||
__________
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| |
|
||||
| | 👻️
|
||||
| |
|
||||
| |
|
||||
| |﹌﹌﹌﹌|
|
||||
| | ☠️ ☠️ |
|
||||
"""
|
||||
|
||||
anim = [vida0, vida1, vida2, vida3, vida4, vida5, vida6]
|
101
02-colgado_bot/colgabot.py
Executable file
101
02-colgado_bot/colgabot.py
Executable file
@ -0,0 +1,101 @@
|
||||
""" Implementación Bot Telegram API """
|
||||
import logging
|
||||
import random
|
||||
from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters)
|
||||
import fetchip
|
||||
import config
|
||||
import constantes
|
||||
from sesion_colgado import SesionUsuario
|
||||
|
||||
# Credenciales desde archivo de configuración
|
||||
TOKEN = config.TOKEN
|
||||
ADMIN = config.ADMIN
|
||||
MSG_INICIO = ' 🦀 @BlastardBot iniciado 🤖 '
|
||||
LOG_FILE = 'bot.log'
|
||||
|
||||
user_ses = SesionUsuario()
|
||||
# Creación objeto Updater
|
||||
updater = Updater(token=TOKEN, use_context=True)
|
||||
|
||||
def main():
|
||||
"""
|
||||
Agrega maneadores de funciones callback a updater, inicia log y bot.
|
||||
Bot queda a la espera de recibir algun mensaje.
|
||||
"""
|
||||
# Ejecuta start al recibir cualquier mensaje del usuario
|
||||
#updater.dispatcher.add_handler(MessageHandler(Filters.regex('.*'),start))
|
||||
# Ejecuta start al iniciar chat con bot, al recibir comando '/start'
|
||||
updater.dispatcher.add_handler(CommandHandler('start', start))
|
||||
# Ejecuta start al recibir cualquier mensaje, excepto '/comandos'
|
||||
#updater.dispatcher.add_handler(MessageHandler(Filters.text & (~Filters.command), start))
|
||||
updater.dispatcher.add_handler(CommandHandler('huhuu', huhuu))
|
||||
updater.dispatcher.add_handler(CommandHandler('allyb', allyb))
|
||||
# Ejecuta desconocido la recibir un comando desconocido '/comando_desconocido'
|
||||
updater.dispatcher.add_handler(MessageHandler(Filters.command, desconocido))
|
||||
inicia_log()
|
||||
updater.start_polling() # Iniciar Bot
|
||||
updater.bot.send_message(chat_id=ADMIN, text=MSG_INICIO)
|
||||
updater.idle() # En espera
|
||||
|
||||
def start(update, context):
|
||||
"""
|
||||
Crea diccionario usuario, registro en log y envía mensaje de inicio
|
||||
"""
|
||||
user_id = update.message.from_user.id
|
||||
user_name = update.message.from_user.username
|
||||
user_log = f"USER [{user_name}] - ID [{user_id}] ha inicado el bot"
|
||||
logging.info(user_log)
|
||||
# Manejador para start con cualquier palabra que no empiece con "/"
|
||||
updater.dispatcher.add_handler(MessageHandler(Filters.text & (~Filters.command), jugar))
|
||||
jugar(update, context)
|
||||
|
||||
def jugar(update, context):
|
||||
reply = user_ses.accion(update.message.text)
|
||||
update.message.reply_text(reply["msg"], reply_markup=reply["reply_markup"])
|
||||
|
||||
def huhuu(update, context):
|
||||
""" Envia respuesta de audio (archivo) """
|
||||
context.bot.send_audio(chat_id=update.effective_chat.id, audio=open('./media/huhuu.wav', 'rb'))
|
||||
|
||||
def allyb(update, context):
|
||||
""" Envia img como respuesta """
|
||||
context.bot.send_photo(chat_id=update.effective_chat.id, photo=open('./media/allyb.png', 'rb'))
|
||||
|
||||
def desconocido(update, context):
|
||||
""" Envía respuesta de texto si no reconoce el comando recibido """
|
||||
resp_desc = random.choice(constantes.RANDOM_RESP)
|
||||
context.bot.send_message(chat_id=update.effective_chat.id, text=resp_desc)
|
||||
|
||||
def inicia_log():
|
||||
""" Config. modulo de logging """
|
||||
logging.basicConfig(
|
||||
filename = LOG_FILE,
|
||||
format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||
level = logging.INFO
|
||||
)
|
||||
logging.info(MSG_INICIO)
|
||||
|
||||
# Cola de trabajos
|
||||
jobs = updater.job_queue
|
||||
# Alerta cambio ip pública, cada 30 minutos
|
||||
def ip_alert(context: telegram.ext.CallbackContext):
|
||||
""" Alerta, registra e informa cambio de ip pública """
|
||||
try:
|
||||
with open('./conf/last_ipp', 'r') as last_ipp_file:
|
||||
last_ipp = last_ipp_file.read()
|
||||
# No shell user
|
||||
# real_ipp = os.popen('curl -s ifconfig.me').readline()
|
||||
real_ipp = fetchip.get_public_ip()
|
||||
if real_ipp != last_ipp:
|
||||
context.bot.send_message(chat_id=ADMIN, text=real_ipp)
|
||||
with open('./conf/last_ipp', 'w') as archivo:
|
||||
archivo.write(real_ipp)
|
||||
except ConnectionError as ex:
|
||||
report = 'Error IP-alert :' + ex
|
||||
context.bot.send_message(chat_id=ADMIN, text=report)
|
||||
|
||||
job_ipp = jobs.run_repeating(ip_alert, interval=1800, first=0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
58
02-colgado_bot/constantes.py
Normal file
58
02-colgado_bot/constantes.py
Normal file
@ -0,0 +1,58 @@
|
||||
"""
|
||||
Constantes
|
||||
"""
|
||||
|
||||
BOTONES = [
|
||||
['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'],
|
||||
['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Ñ'],
|
||||
['Z', 'X', 'C', 'V', 'B', 'N', 'M']
|
||||
]
|
||||
|
||||
RANDOM_RESP = [
|
||||
'No puedo ayudarte!',
|
||||
'No entiendo lo que dices!',
|
||||
'Mucho no bueno!',
|
||||
'Un gran poder, conlleva una gran resposabilidad',
|
||||
'QUITAN TRABAOhjOJOoOHHH!',
|
||||
'For great justice',
|
||||
'No siempre lloverá',
|
||||
'mamá dice q la vida es como una caja de bombones ...',
|
||||
'Mucho agradezco'
|
||||
]
|
||||
|
||||
CLASES_RPG = [
|
||||
"Barbaro",
|
||||
"Bardo",
|
||||
"Clerigo",
|
||||
"Duida",
|
||||
"Luchador",
|
||||
"Monje",
|
||||
"Paladin",
|
||||
"Soldado",
|
||||
"Embustero",
|
||||
"Brujo",
|
||||
"Hechizero"
|
||||
]
|
||||
|
||||
RAZAS = [
|
||||
"Humano-SemiOrco",
|
||||
"MitadElfo-Elfo",
|
||||
"Enano-Humano",
|
||||
"Elfo",
|
||||
"Humano",
|
||||
"Draco",
|
||||
"Elfo-Humano",
|
||||
"Humano-Demonio",
|
||||
"Demonio",
|
||||
"MitadElfo",
|
||||
"Duende"
|
||||
]
|
||||
|
||||
STAT_NAME = [
|
||||
"str",
|
||||
"dex",
|
||||
"int",
|
||||
"wis",
|
||||
"con",
|
||||
"cha"
|
||||
]
|
146
02-colgado_bot/estados_colgado.py
Normal file
146
02-colgado_bot/estados_colgado.py
Normal file
@ -0,0 +1,146 @@
|
||||
"""
|
||||
Implementacion juego colgado usando estados
|
||||
"""
|
||||
import random
|
||||
from telegram import ReplyKeyboardMarkup
|
||||
from palabras import instrumentos, verbos, alfabeto
|
||||
from anim_colgado import anim
|
||||
from constantes import BOTONES
|
||||
|
||||
class EstadoSelec:
|
||||
"""
|
||||
Seleciona lista de palabras
|
||||
"""
|
||||
def accion(self, msg, user_data):
|
||||
user_data.vidas = 0
|
||||
user_data.tipo_palabra = ""
|
||||
user_data.palabra_juego = ""
|
||||
user_data.letras_palabra = set()
|
||||
user_data.letras_usadas = set()
|
||||
teclado = ReplyKeyboardMarkup([["verbos"], ["instrumentos"]], one_time_keyboard=True)
|
||||
self.next = EstadoJugar()
|
||||
info = "Inciando juego 🤹 \n\n - - \'El Colgado\' - -\n\nElige la palabra a encontrar:\n Verbos o Instrumentos Musicales."
|
||||
ret = {
|
||||
"msg": info,
|
||||
"reply_markup": teclado
|
||||
}
|
||||
return ret
|
||||
|
||||
class EstadoJugar:
|
||||
"""
|
||||
Asignación variables de juego
|
||||
"""
|
||||
def accion(self, msg, user_data):
|
||||
if msg == "verbos" or msg == "instrumentos":
|
||||
user_data.tipo_palabra = msg
|
||||
user_data.vidas = 6
|
||||
palabra = get_palabra(msg)
|
||||
user_data.palabra_juego = palabra
|
||||
user_data.letras_palabra = set(palabra)
|
||||
lista_palabra = [letra if letra in user_data.letras_usadas else '_' for letra in user_data.palabra_juego]
|
||||
if user_data.tipo_palabra == "instrumentos":
|
||||
palabra_en_pantalla = '\nInstrumento Musical: ' + ' '.join(lista_palabra)
|
||||
elif user_data.tipo_palabra == "verbos":
|
||||
palabra_en_pantalla = '\nVerbo : ' + ' '.join(lista_palabra)
|
||||
estatus = '\nIntentos restantes ['+ str(user_data.vidas) +']'+' - Letras usadas: '+''.join(user_data.letras_usadas)
|
||||
info = anim[6] + estatus + palabra_en_pantalla + "\nEnviame una letra"
|
||||
self.next = EstadoValidaLetra()
|
||||
teclado = ReplyKeyboardMarkup(BOTONES, one_time_keyboard=True)
|
||||
ret = {
|
||||
"msg": info,
|
||||
"reply_markup": teclado
|
||||
}
|
||||
else:
|
||||
teclado = ReplyKeyboardMarkup([["verbos"], ["instrumentos"]], one_time_keyboard=True)
|
||||
self.next = EstadoJugar()
|
||||
ret = {
|
||||
"msg": f"\'{msg}\' no es una opción válida.\nEscoge Verbos o Instrumentos Musicales",
|
||||
"reply_markup": teclado
|
||||
}
|
||||
return ret
|
||||
|
||||
class EstadoValidaLetra:
|
||||
def accion(self, msg, user_data):
|
||||
resp = msg
|
||||
resultado = ""
|
||||
final = ""
|
||||
if len(user_data.letras_palabra) > 0 and user_data.vidas > 0:
|
||||
self.next = EstadoValidaLetra()
|
||||
invalida = False
|
||||
letra_user = resp.upper()
|
||||
if letra_user in alfabeto - user_data.letras_usadas:
|
||||
user_data.letras_usadas.add(letra_user)
|
||||
if letra_user in user_data.letras_palabra:
|
||||
user_data.letras_palabra.remove(letra_user)
|
||||
else:
|
||||
user_data.vidas -= 1
|
||||
resultado = f'\n\'{letra_user}\' no es parte del nombre'
|
||||
invalida = True
|
||||
elif letra_user in user_data.letras_usadas:
|
||||
resultado = '\nYa usaste esta letra, prueba con otra'
|
||||
invalida = True
|
||||
else:
|
||||
resultado = '\nCaracter inválido'
|
||||
invalida = True
|
||||
if invalida:
|
||||
self.next = EstadoValidaLetra()
|
||||
final = "\nEnviame una letra"
|
||||
if user_data.vidas == 0:
|
||||
final = '\n\n--- Perdiste 😓️ \n--- la palabra era ' + user_data.palabra_juego.upper() + '\n (enviame un msg para continuar)'
|
||||
self.next = EstadoFinal()
|
||||
elif len(user_data.letras_palabra) == 0:
|
||||
final = '\n\n--- 🎊️🎉️ Felicitaciones 🎊️🎉️ \n--- encontraste la palabra\n'+ '\n (enviame un msg para continuar)'
|
||||
self.next = EstadoFinal()
|
||||
lista_palabra = [letra if letra in user_data.letras_usadas else '_' for letra in user_data.palabra_juego]
|
||||
if user_data.tipo_palabra == "instrumentos":
|
||||
palabra_en_pantalla = '\nInstrumento Musical: ' + ' '.join(lista_palabra)
|
||||
elif user_data.tipo_palabra == "verbos":
|
||||
palabra_en_pantalla = '\nVerbo : ' + ' '.join(lista_palabra)
|
||||
estatus = '\nIntentos restantes ['+ str(user_data.vidas) +']'+' - Letras usadas: '+''.join(user_data.letras_usadas)
|
||||
info = resultado + anim[user_data.vidas] + estatus + palabra_en_pantalla + final
|
||||
#botones = [[letra.upper()] for letra in alfabeto - user_data.letras_usadas]
|
||||
teclado = ReplyKeyboardMarkup(BOTONES, one_time_keyboard=True)
|
||||
ret = {
|
||||
"msg": info,
|
||||
"reply_markup": teclado
|
||||
}
|
||||
return ret
|
||||
|
||||
|
||||
class EstadoFinal:
|
||||
"""
|
||||
Fin del juego
|
||||
"""
|
||||
def accion(self, msg, user_data):
|
||||
teclado = ReplyKeyboardMarkup([["Jugar"]], one_time_keyboard=True)
|
||||
self.next = EstadoSalto()
|
||||
ret = {
|
||||
"msg": "Quieres volver a jugar?",
|
||||
"reply_markup": teclado
|
||||
}
|
||||
return ret
|
||||
|
||||
|
||||
class EstadoSalto:
|
||||
"""
|
||||
Registra respuesta y salta a otro estado.
|
||||
"""
|
||||
def accion(self, msg, user_data):
|
||||
if msg == "Jugar":
|
||||
estado = EstadoSelec()
|
||||
else:
|
||||
estado = EstadoFinal()
|
||||
ret = estado.accion(msg, user_data)
|
||||
self.next = estado.next
|
||||
return ret
|
||||
|
||||
def get_palabra(tipo_palabra):
|
||||
""" Selecciona un string de la lista pasada como argumento """
|
||||
if tipo_palabra == "verbos":
|
||||
palabra = random.choice(verbos)
|
||||
elif tipo_palabra == "instrumentos":
|
||||
palabra = random.choice(instrumentos)
|
||||
while '_' in palabra or ' ' in palabra:
|
||||
palabra = random.choice(instrumentos)
|
||||
tipo_palabra = "instrumentos"
|
||||
return palabra.upper()
|
10852
02-colgado_bot/palabras.py
Normal file
10852
02-colgado_bot/palabras.py
Normal file
File diff suppressed because it is too large
Load Diff
28
02-colgado_bot/sesion_colgado.py
Normal file
28
02-colgado_bot/sesion_colgado.py
Normal file
@ -0,0 +1,28 @@
|
||||
"""
|
||||
Clase sessiones de usuario:
|
||||
Nombre, Clase, Atributos
|
||||
"""
|
||||
from estados_colgado import EstadoSelec
|
||||
|
||||
class SesionUsuario():
|
||||
def __init__(self):
|
||||
self.user_data = UserData()
|
||||
self.state = EstadoSelec()
|
||||
|
||||
def accion(self, msg):
|
||||
ret = self.state.accion(msg, self.user_data)
|
||||
self.state = self.state.next
|
||||
return ret
|
||||
|
||||
class UserData:
|
||||
def __init__(self):
|
||||
self.id = ""
|
||||
self.username = ""
|
||||
self.nombre = ""
|
||||
self.apellido = ""
|
||||
self.es_bot = False
|
||||
self.vidas = 0
|
||||
self.tipo_palabra = ""
|
||||
self.palabra_juego = ""
|
||||
self.letras_palabra = set()
|
||||
self.letras_usadas = set()
|
Loading…
Reference in New Issue
Block a user