Initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.env
|
||||
11
docker-compose.yml
Normal file
11
docker-compose.yml
Normal file
@@ -0,0 +1,11 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
tesla-raffle:
|
||||
build: tesla-raffle
|
||||
image: tesla-raffle:latest
|
||||
container_name: tesla-raffle
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- TELEGRAM_TOKEN=${TELEGRAM_TOKEN}
|
||||
- ADMINISTRADORES=${ADMINISTRADORES}
|
||||
9
tesla-raffle/Dockerfile
Normal file
9
tesla-raffle/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
||||
FROM python:3.7
|
||||
|
||||
RUN mkdir /app
|
||||
ADD . /app
|
||||
RUN pip install -r /app/requirements.txt
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
CMD [ "python", "/app/tesla-raffle.py" ]
|
||||
1
tesla-raffle/requirements.txt
Normal file
1
tesla-raffle/requirements.txt
Normal file
@@ -0,0 +1 @@
|
||||
python-telegram-bot==20.1
|
||||
105
tesla-raffle/tesla-raffle.py
Normal file
105
tesla-raffle/tesla-raffle.py
Normal file
@@ -0,0 +1,105 @@
|
||||
import logging
|
||||
import random
|
||||
import os
|
||||
|
||||
from telegram import Update
|
||||
from telegram.ext import (
|
||||
Application,
|
||||
CommandHandler,
|
||||
ContextTypes,
|
||||
MessageHandler,
|
||||
filters
|
||||
)
|
||||
|
||||
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
|
||||
LISTA_ADMINISTRADORES = os.getenv("ADMINISTRADORES")
|
||||
ADMINISTRADORES = []
|
||||
for admin in LISTA_ADMINISTRADORES.split(','):
|
||||
ADMINISTRADORES.append(int(admin))
|
||||
SORTEO_ACTIVO = False
|
||||
|
||||
# Enable logging
|
||||
logging.basicConfig(
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
async def finaliza_sorteo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
# Solo hacemos caso si el usuario es válido
|
||||
if update.message.from_user.id not in ADMINISTRADORES:
|
||||
logging.info(f"{update.message.from_user} no está validado")
|
||||
return
|
||||
|
||||
global SORTEO_ACTIVO
|
||||
# Dejamos de leer mensajes
|
||||
SORTEO_ACTIVO = False
|
||||
logging.info("Sorteo finalizado, dejando de leer mensajes.")
|
||||
logging.info("Escogiendo ganador al azar.")
|
||||
await context.bot.send_message(chat_id=update.effective_chat.id, text="El sorteo ha finalizado, escogiendo un ganador...")
|
||||
# Escoge un ganador al azar
|
||||
if "participantes" in context.chat_data:
|
||||
if len(context.chat_data["participantes"]) > 0:
|
||||
ganador = random.choice(context.chat_data["participantes"])
|
||||
logging.info(f"Ganador: @{ganador}")
|
||||
await context.bot.send_message(chat_id=update.effective_chat.id, text=f"¡Felicidades @{ganador}! Eres el ganador del sorteo.")
|
||||
else:
|
||||
logging.info("Nadie ha participado.")
|
||||
await context.bot.send_message(chat_id=update.effective_chat.id, text="Nadie ha participado en el sorteo.")
|
||||
else:
|
||||
logging.info("Nadie ha participado.")
|
||||
await context.bot.send_message(chat_id=update.effective_chat.id, text="Nadie ha participado en el sorteo.")
|
||||
# Se borra la lista de participantes para la próxima
|
||||
if "participantes" in context.chat_data:
|
||||
del context.chat_data["participantes"]
|
||||
|
||||
async def sorteo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
# Solo hacemos caso si el usuario es válido
|
||||
if update.message.from_user.id not in ADMINISTRADORES:
|
||||
logging.info(f"{update.message.from_user} no está validado")
|
||||
return
|
||||
|
||||
logging.info("Empezando sorteo")
|
||||
global SORTEO_ACTIVO
|
||||
# Empezamos a leer mensajes
|
||||
SORTEO_ACTIVO = True
|
||||
# Si ya existía una lista de participantes, nos aseguramos de borrarla
|
||||
if "participantes" in context.chat_data:
|
||||
del context.chat_data["participantes"]
|
||||
logging.info("Sorteo activo, leyendo mensajes")
|
||||
await context.bot.send_message(chat_id=update.effective_chat.id, text="¡Empieza el sorteo! Escribe 'Tengo un Tesla y quiero un referido' para participar.")
|
||||
|
||||
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
global SORTEO_ACTIVO
|
||||
# Leemos mensajes solo si el sorteo está activo
|
||||
if SORTEO_ACTIVO:
|
||||
logging.info(f"Mensaje recibido de '@{update.message.from_user.username}' con el siguiente texto: '{update.message.text}'")
|
||||
# Inicializamos lista de participantes vacía
|
||||
if "participantes" not in context.chat_data:
|
||||
context.chat_data["participantes"] = []
|
||||
# Solo le hacemos caso a los mensajes que contengan la frase del concurso
|
||||
if "tengo un tesla y quiero un referido" in update.message.text.lower():
|
||||
# Si el usuario ya está participando, no lo volvemos a añadir
|
||||
if update.message.from_user.username not in context.chat_data["participantes"]:
|
||||
context.chat_data["participantes"].append(update.message.from_user.username)
|
||||
await update.message.reply_text(f"¡@{update.message.from_user.username} has sido añadido al sorteo!")
|
||||
else:
|
||||
await update.message.reply_text(f"¡@{update.message.from_user.username} ya estabas añadido en el sorteo!")
|
||||
|
||||
async def id(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||||
logging.info(f"@{update.message.from_user.username} : {update.message.from_user.id}")
|
||||
|
||||
def main()->None:
|
||||
logging.info(ADMINISTRADORES)
|
||||
"""Start the bot."""
|
||||
application = Application.builder().get_updates_http_version('1.1').http_version('1.1').token(TELEGRAM_TOKEN).build()
|
||||
|
||||
application.add_handler(CommandHandler("sorteo", sorteo))
|
||||
application.add_handler(CommandHandler("finaliza", finaliza_sorteo))
|
||||
application.add_handler(CommandHandler("id", id))
|
||||
application.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), handle_message))
|
||||
|
||||
application.run_polling()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user