feat: complete DirtyLeague autonomous FSM bot with fast derank and chest handling

This commit is contained in:
VolandSZ
2026-09-08 13:38:42 +03:00
parent d9953407e0
commit 5777748abe
103 changed files with 1618 additions and 0 deletions

92
run.py Normal file
View File

@ -0,0 +1,92 @@
"""
Entry point for DirtyLeague Bot.
Handles configuration loading, logging initialization, and global Kill Switch.
"""
import json
import logging
import os
import sys
import threading
import time
import keyboard
CONFIG_FILE = "config.json"
def setup_logging(log_level_str: str = "INFO"):
os.makedirs("logs", exist_ok=True)
log_file = os.path.join("logs", f"bot_{time.strftime('%Y%m%d_%H%M%S')}.log")
# Ensure stdout handles unicode properly on Windows
if hasattr(sys.stdout, "reconfigure"):
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
except Exception:
pass
level = getattr(logging, log_level_str.upper(), logging.INFO)
logging.basicConfig(
level=level,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler(log_file, encoding="utf-8"),
logging.StreamHandler(sys.stdout)
]
)
logging.info(f"Logging initialized. Log file: {log_file}")
def load_config():
if not os.path.exists(CONFIG_FILE):
raise FileNotFoundError(f"Configuration file '{CONFIG_FILE}' not found.")
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
return json.load(f)
def main():
import argparse
parser = argparse.ArgumentParser(description="DirtyLeague Autonomous FSM Bot")
parser.add_argument("--duration", type=int, default=None, help="Stop after N seconds")
parser.add_argument("--cycles", type=int, default=None, help="Stop after N battles/cycles")
args = parser.parse_args()
config = load_config()
bot_conf = config.get("bot", {})
setup_logging(config.get("log_level", "INFO"))
kill_key = bot_conf.get("kill_switch_key", "q")
logging.info(f"Starting DirtyLeague Bot. Press '{kill_key.upper()}' at ANY time for Emergency Stop (Kill Switch).")
from bot_core import DirtyLeagueBot
bot = DirtyLeagueBot(config=config)
stop_event = threading.Event()
def kill_switch_listener():
while not stop_event.is_set():
if keyboard.is_pressed(kill_key):
logging.warning(f"!!! KILL SWITCH '{kill_key.upper()}' PRESSED! Stopping bot immediately... !!!")
bot.stop()
stop_event.set()
break
time.sleep(0.05)
listener_thread = threading.Thread(target=kill_switch_listener, daemon=True)
listener_thread.start()
try:
bot.start(max_duration_sec=args.duration, max_cycles=args.cycles)
except KeyboardInterrupt:
logging.info("Bot interrupted by User (Ctrl+C).")
except Exception as e:
logging.exception(f"Unexpected error in bot execution: {e}")
finally:
stop_event.set()
bot.stop()
logging.info("Bot stopped successfully.")
if __name__ == "__main__":
main()