Adds HORA_INICIO and HORA_FIM environment variables to define the daily operating window for order sending. Implements dentro_do_horario() function to validate if current time falls within the configured range. The bot now pauses order sending outside the operating window and sends a notification to the chat, resuming automatically at HORA_INICIO. Includes DEPLOY.md documentation with Debian 12 deployment instructions and systemd service configuration for auto-start and auto-restart.
166 lines
5.8 KiB
Python
Executable File
166 lines
5.8 KiB
Python
Executable File
import json
|
|
import os
|
|
import random
|
|
import asyncio
|
|
import logging
|
|
from datetime import datetime
|
|
|
|
from dotenv import load_dotenv
|
|
from telegram import Bot
|
|
from telegram.error import TelegramError
|
|
|
|
load_dotenv()
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s [%(levelname)s] %(message)s",
|
|
)
|
|
log = logging.getLogger(__name__)
|
|
|
|
# ─── Config ───────────────────────────────────────────────────────────────────
|
|
TOKEN = os.getenv("TELEGRAM_TOKEN", "")
|
|
CHAT_ID = os.getenv("TELEGRAM_CHAT_ID", "")
|
|
SEXO = os.getenv("SEXO", "masculino").strip().lower()
|
|
IDADE = int(os.getenv("IDADE", "30"))
|
|
INTERVALO = int(os.getenv("INTERVALO_MINUTOS", "5"))
|
|
|
|
HORA_INICIO = os.getenv("HORA_INICIO", "00:00").strip()
|
|
HORA_FIM = os.getenv("HORA_FIM", "23:59").strip()
|
|
|
|
def dentro_do_horario() -> bool:
|
|
agora = datetime.now().strftime("%H:%M")
|
|
return HORA_INICIO <= agora <= HORA_FIM
|
|
|
|
ORDENS_PATH = os.path.join(os.path.dirname(__file__), "ordens.json")
|
|
|
|
# ─── Substituições para sexo feminino ──────────────────────────────────────────
|
|
# Ordem importa: mais específicas primeiro
|
|
SUBSTITUICOES_FEMININO = [
|
|
("a cabeça do pau", "o clitóris"),
|
|
("cabeça do pau", "clitóris"),
|
|
("da cabeça do pau", "do clitóris"),
|
|
("a glande", "o clitóris"),
|
|
("da glande", "do clitóris"),
|
|
("glande", "clitóris"),
|
|
("do pau", "da buceta"),
|
|
("no pau", "na buceta"),
|
|
("o pau", "a buceta"),
|
|
("um pau", "uma buceta"),
|
|
("pau", "buceta"),
|
|
("o saco", "a xota"),
|
|
("do saco", "da xota"),
|
|
("no saco", "na xota"),
|
|
("saco", "xota"),
|
|
("a cueca", "a calcinha"),
|
|
("da cueca", "da calcinha"),
|
|
("na cueca", "na calcinha"),
|
|
("cueca", "calcinha"),
|
|
("punheta", "siririca"),
|
|
("porra", "gozo"),
|
|
("próstata", "ponto G"),
|
|
]
|
|
|
|
|
|
def adaptar_ordem(ordem: str) -> str:
|
|
if SEXO == "feminino":
|
|
for masculino, feminino in SUBSTITUICOES_FEMININO:
|
|
ordem = ordem.replace(masculino, feminino)
|
|
return ordem
|
|
|
|
|
|
# ─── Carregar ordens ──────────────────────────────────────────────────────────
|
|
def carregar_ordens():
|
|
with open(ORDENS_PATH, "r", encoding="utf-8") as f:
|
|
ordens = json.load(f)
|
|
if not ordens:
|
|
raise ValueError("Nenhuma ordem encontrada em ordens.json")
|
|
return ordens
|
|
|
|
|
|
# ─── Envio Telegram ───────────────────────────────────────────────────────────
|
|
async def enviar_mensagem(bot: Bot, texto: str):
|
|
try:
|
|
await bot.send_message(chat_id=CHAT_ID, text=texto)
|
|
log.info("Ordem enviada com sucesso.")
|
|
except TelegramError as e:
|
|
log.error("Erro ao enviar mensagem: %s", e)
|
|
|
|
|
|
# ─── Comando /start ───────────────────────────────────────────────────────────
|
|
async def cmd_start(ordens: list):
|
|
bot = Bot(token=TOKEN)
|
|
|
|
artigo = "o" if SEXO == "masculino" else "a"
|
|
msg_start = (
|
|
f"Olá {artigo} usuário!\n\n"
|
|
f"O sistema de ordens automáticas foi ativado.\n"
|
|
f"Sexo: {SEXO} | Idade: {IDADE}\n"
|
|
f"Intervalo: {INTERVALO} minuto(s)\n"
|
|
f"Total de ordens disponíveis: {len(ordens)}\n\n"
|
|
f"A primeira ordem será enviada em {INTERVALO} minuto(s).\n"
|
|
f"Prepare-se para cumprir todas as ordens."
|
|
)
|
|
await enviar_mensagem(bot, msg_start)
|
|
|
|
|
|
# ─── Loop principal ────────────────────────────────────────────────────────────
|
|
async def loop_principal():
|
|
if not TOKEN or not CHAT_ID:
|
|
log.error("TELEGRAM_TOKEN e TELEGRAM_CHAT_ID devem estar configurados no .env")
|
|
return
|
|
|
|
ordens = carregar_ordens()
|
|
random.shuffle(ordens)
|
|
|
|
bot = Bot(token=TOKEN)
|
|
|
|
await cmd_start(ordens)
|
|
|
|
agora = datetime.now().strftime("%H:%M")
|
|
if not dentro_do_horario():
|
|
log.info("Horário atual %s fora da janela %s-%s. Aguardando...", agora, HORA_INICIO, HORA_FIM)
|
|
await bot.send_message(
|
|
chat_id=CHAT_ID,
|
|
text=f"Horário atual ({agora}) fora da janela de ordens ({HORA_INICIO}-{HORA_FIM}).\n"
|
|
f"As ordens serão retomadas automaticamente às {HORA_INICIO}."
|
|
)
|
|
|
|
await asyncio.sleep(INTERVALO * 60)
|
|
|
|
ordem_index = 0
|
|
while True:
|
|
if not dentro_do_horario():
|
|
log.info("Fora do horário de funcionamento (%s-%s). Aguardando...", HORA_INICIO, HORA_FIM)
|
|
await asyncio.sleep(60)
|
|
continue
|
|
|
|
ordem = ordens[ordem_index % len(ordens)]
|
|
ordem_adaptada = adaptar_ordem(ordem)
|
|
|
|
agora = datetime.now().strftime("%d/%m/%Y %H:%M")
|
|
texto = (
|
|
f"ORDEM #{ordem_index + 1}\n"
|
|
f"{agora}\n\n"
|
|
f"{ordem_adaptada}\n\n"
|
|
f"Proxima ordem em {INTERVALO} minuto(s)."
|
|
f"\n\nCumpra agora."
|
|
)
|
|
|
|
await enviar_mensagem(bot, texto)
|
|
|
|
ordem_index += 1
|
|
await asyncio.sleep(INTERVALO * 60)
|
|
|
|
|
|
# ─── Entry point ──────────────────────────────────────────────────────────────
|
|
def main():
|
|
try:
|
|
asyncio.run(loop_principal())
|
|
except KeyboardInterrupt:
|
|
log.info("Sistema encerrado pelo usuário.")
|
|
except Exception as e:
|
|
log.error("Erro fatal: %s", e)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |