ba-auto-daily/ba_daily.py
Nik Afiq 511010b6d6 feat: Implement arena task with OCR and auto-fight capabilities
- Added `find_template` and `template_visible` functions for template matching in screenshots.
- Introduced `read_int_white_on_dark` for OCR of bright text on dark backgrounds.
- Ported arena functionality from reference, including ticket management, opponent selection, and reward collection.
- Implemented safety checks for modal visibility and result confirmation to prevent unintended ticket spends.
- Live-tested the arena task, confirming functionality across multiple tickets with real fight outcomes.
- Updated mapping documentation to reflect new arena task implementation and its unique navigation requirements.
2026-07-09 02:38:41 +09:00

56 lines
1.8 KiB
Python

#!/usr/bin/env python3
"""Python CLI entry point: ba_dailies.sh -> ba_daily.py -> ba_auto/tasks/*.py"""
import sys
from ba_auto import config, driver
from ba_auto.tasks import arena, cafe, lesson, mailbox, shop_common, shop_tactical, stamina, story_sweep
TASKS = {
"mailbox": mailbox.run,
"cafe": cafe.run,
"stamina": stamina.run,
"story_sweep": story_sweep.run,
"shop_common": shop_common.run,
"shop_tactical": shop_tactical.run,
"lesson": lesson.run,
"arena": arena.run,
}
# story_sweep, both shop tasks, lesson, and arena are opt-in only (not in
# the default flow): they spend AP/credits/tactical coin/lesson tickets/an
# arena ticket on an automated choice rather than reclaiming something
# free, which is a real resource decision the default unattended run
# shouldn't make blindly. Arena specifically fights a real ranked PvP
# battle each run -- see ba_auto/tasks/arena.py's module docstring.
DEFAULT_ORDER = ["mailbox", "cafe", "stamina"]
def main(argv):
args = argv[1:]
if args and args[0] == "--list-commands":
# Machine-readable command list for shell completion (see
# completions/ba_dailies.bash) -- kept as a thin read of TASKS
# itself so the completion list can never drift from what's
# actually dispatchable.
print(" ".join(TASKS.keys()))
return 0
if not args:
for name in DEFAULT_ORDER:
TASKS[name](driver, config)
print("All done.")
return 0
command = args[0]
if command not in TASKS:
print(f"Unknown phase: {command}", file=sys.stderr)
print(f"Valid phases: {' '.join(TASKS.keys())}", file=sys.stderr)
return 1
TASKS[command](driver, config)
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))