import json import os import random import asyncio import logging from dataclasses import dataclass 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 global ──────────────────────────────────────────────────────────── 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")) # ─── Config por tipo de envio ───────────────────────────────────────────────── @dataclass class ConfigEnvio: numero: int ativo: bool intervalo_minutos: int arquivo_ordens: str quantidade_ordens: int # 0 = sem limite hora_inicio: str hora_fim: str ia_mode: bool = False def carregar_config_envio(numero: int) -> ConfigEnvio: prefixo = f"ENVIAR{numero}_" ativo_raw = os.getenv(f"{prefixo}ATIVO", "s").strip().lower() ativo = ativo_raw == "s" intervalo = int(os.getenv(f"{prefixo}INTERVALO_MINUTOS", "1")) arquivo = os.getenv(f"{prefixo}ARQUIVO_ORDENS", f"ordens{numero}.json").strip() quantidade = int(os.getenv(f"{prefixo}QUANTIDADE_ORDENS", "0")) hora_inicio = os.getenv(f"{prefixo}HORA_INICIO", "00:00").strip() hora_fim = os.getenv(f"{prefixo}HORA_FIM", "23:59").strip() ia_raw = os.getenv(f"{prefixo}IA", "n").strip().lower() ia_mode = ia_raw == "s" return ConfigEnvio( numero=numero, ativo=ativo, intervalo_minutos=intervalo, arquivo_ordens=arquivo, quantidade_ordens=quantidade, hora_inicio=hora_inicio, hora_fim=hora_fim, ia_mode=ia_mode, ) # ─── 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(arquivo: str) -> list: caminho = os.path.join(os.path.dirname(__file__), arquivo) with open(caminho, "r", encoding="utf-8") as f: ordens = json.load(f) if not ordens: raise ValueError(f"Nenhuma ordem encontrada em {arquivo}") return ordens # ─── Envio Telegram ─────────────────────────────────────────────────────────── async def enviar_mensagem(bot: Bot, texto: str) -> None: 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) # ─── Verificação de horário ─────────────────────────────────────────────────── def dentro_do_horario(hora_inicio: str, hora_fim: str) -> bool: agora = datetime.now().strftime("%H:%M") return hora_inicio <= agora <= hora_fim # ─── Loop individual de envio ───────────────────────────────────────────────── async def loop_envio(config: ConfigEnvio) -> None: if not config.ativo: log.info("Envio automático %d desativado no .env (ENVIAR%d_ATIVO != 's'). Pulando.", config.numero, config.numero) return if not TOKEN or not CHAT_ID: log.error("TELEGRAM_TOKEN e TELEGRAM_CHAT_ID devem estar configurados no .env") return bot = Bot(token=TOKEN) usando_ia = config.ia_mode if usando_ia: from dados_ia import gerar_ordem_ia log.info("Modo IA ativado para envio automático %d. Gerando ordens via %s...", config.numero, os.getenv("OPENROUTER_MODEL", "modelo padrao")) msg_start = ( f"🚀 Envio Automático {config.numero} — MODO IA ativado.\n" f"Sexo: {SEXO} | Idade: {IDADE}\n" f"Intervalo: {config.intervalo_minutos} minuto(s)\n" f"Ordens por ciclo: {config.quantidade_ordens}\n" f"Modelo de IA: {os.getenv('OPENROUTER_MODEL', 'desconhecido')}\n" f"Horário de funcionamento: {config.hora_inicio} - {config.hora_fim}\n\n" f"DeepSeek está online e vai gerar cada ordem em tempo real.\n" f"Prepare-se para obedecer a IA." ) await enviar_mensagem(bot, msg_start) else: log.info("Carregando ordens de %s para envio automático %d...", config.arquivo_ordens, config.numero) ordens = carregar_ordens(config.arquivo_ordens) random.shuffle(ordens) msg_start = ( f"🚀 Envio Automático {config.numero} ativado.\n" f"Sexo: {SEXO} | Idade: {IDADE}\n" f"Intervalo: {config.intervalo_minutos} minuto(s)\n" f"Ordens por ciclo: {config.quantidade_ordens}\n" f"Arquivo de ordens: {config.arquivo_ordens}\n" f"Total de ordens disponíveis: {len(ordens)}\n" f"Horário de funcionamento: {config.hora_inicio} - {config.hora_fim}\n\n" f"A(s) primeira(s) ordem(ns) será(ão) enviada(s) imediatamente.\n" f"Prepare-se para cumprir todas as ordens." ) await enviar_mensagem(bot, msg_start) agora = datetime.now().strftime("%H:%M") if not dentro_do_horario(config.hora_inicio, config.hora_fim): log.info("Horário atual %s fora da janela %s-%s. Aguardando...", agora, config.hora_inicio, config.hora_fim) await bot.send_message( chat_id=CHAT_ID, text=f"Horário atual ({agora}) fora da janela de ordens ({config.hora_inicio}-{config.hora_fim}).\n" f"As ordens (envio {config.numero}) serão retomadas automaticamente às {config.hora_inicio}.", ) ordem_index = 0 while True: if not dentro_do_horario(config.hora_inicio, config.hora_fim): log.info("Fora do horário de funcionamento (%s-%s). Aguardando...", config.hora_inicio, config.hora_fim) await asyncio.sleep(60) continue # Quantidade de ordens a enviar neste ciclo qtd = config.quantidade_ordens if config.quantidade_ordens > 0 else 1 # Envia lote de ordens for i in range(qtd): if usando_ia: ordem = await gerar_ordem_ia() else: ordem = ordens[(ordem_index + i) % len(ordens)] ordem_adaptada = adaptar_ordem(ordem) agora = datetime.now().strftime("%d/%m/%Y %H:%M") texto = ( f"ORDEM #{ordem_index + i + 1} [Env. {config.numero}]\n" f"{agora}\n\n" f"{ordem_adaptada}\n\n" f"Próxima ordem em {config.intervalo_minutos} minuto(s)." f"\n\nCumpra agora." ) await enviar_mensagem(bot, texto) ordem_index += qtd await asyncio.sleep(config.intervalo_minutos * 60) # ─── Entry point ────────────────────────────────────────────────────────────── async def _executar_todos_envios(configs: list) -> None: await asyncio.gather(*(loop_envio(c) for c in configs)) def main(): try: configs = [ carregar_config_envio(1), carregar_config_envio(2), carregar_config_envio(3), carregar_config_envio(4), carregar_config_envio(5), carregar_config_envio(6), carregar_config_envio(7), carregar_config_envio(8), carregar_config_envio(9), carregar_config_envio(10), carregar_config_envio(11), ] asyncio.run(_executar_todos_envios(configs)) except KeyboardInterrupt: log.info("Sistema encerrado pelo usuário.") except Exception as e: log.error("Erro fatal: %s", e) if __name__ == "__main__": main()