diff --git a/eve_rock_watcher.py b/eve_rock_watcher.py index 4fcd99e..0f0323f 100644 --- a/eve_rock_watcher.py +++ b/eve_rock_watcher.py @@ -179,9 +179,11 @@ def main(): _snip_to_rock(cp) return - poll = cp.getint("rock", "poll_secs", fallback=5) if cp.has_section("rock") else 5 - switch_secs = cp.getint("rock", "switch_secs", fallback=45) if cp.has_section("rock") else 45 - cooldown = cp.getint("rock", "cooldown_secs", fallback=60) if cp.has_section("rock") else 60 + sec = cp.has_section("rock") + poll = cp.getint("rock", "poll_secs", fallback=5) if sec else 5 + switch_secs = cp.getint("rock", "switch_secs", fallback=45) if sec else 45 + cooldown = cp.getint("rock", "cooldown_secs", fallback=60) if sec else 60 + status_secs = cp.getint("rock", "status_secs", fallback=90) if sec else 90 if "--test" in sys.argv: import pytesseract @@ -205,6 +207,7 @@ def main(): print(f"[rock] started; switch<{switch_secs}s, poll {poll}s (waits for !mining on)") tracker = Tracker() last_alert = {} + last_status = 0.0 region = None while True: if not w.bot_mining(cp): # only during a mining session @@ -228,23 +231,38 @@ def main(): now = time.time() keyed = tracker.update(rows, now) hr = hold_rate() + actives = [] # (key, ore, units, tleft) for key, ore, units in keyed: r = tracker.rate(key) # measured units/sec if r <= 0 and len(keyed) == 1 and hr > 0 and ORE_VOL.get(ore): r = hr / 60.0 / ORE_VOL[ore] # single-rock hold-fill fallback if r <= 0: continue - tleft = units / r + actives.append((key, ore, units, units / r)) + # the rock you're emptying = the one with the least time left + actives.sort(key=lambda x: x[3]) + for key, ore, units, tleft in actives: if tleft <= switch_secs and now - last_alert.get(key, 0) > cooldown: last_alert[key] = now others = [(o, u) for (k, o, u) in keyed if k != key] nxt = max(others, key=lambda x: x[1]) if others else None - msg = (f"{ore.title()} rock ~{int(tleft)}s from empty " - f"({units:,} u left).") + empty_at = int(now + tleft) + msg = f"{ore.title()} rock empties ({units:,} u left)." if nxt: - msg += f" Next: {nxt[0].title()} ({nxt[1]:,} u)." + msg += f" Switch to {nxt[0].title()} ({nxt[1]:,} u)." w.notify(cp, "Switch rocks", msg, priority="high", tags="pick,gem") print(f"[rock] ALERT {msg}") + # periodic live readout of the rock you're on (so you see the countdown) + if actives and not w.bot_muted(cp) and now - last_status >= status_secs: + key, ore, units, tleft = actives[0] + empty_at = int(now + tleft) + others = [(o, u) for (k, o, u) in keyed if k != key] + nxt = max(others, key=lambda x: x[1]) if others else None + line = f"🪨 {ore.title()} {units:,} u · empties " + if nxt: + line += f" · next: {nxt[0].title()} ({nxt[1]:,} u)" + w._discord(cp, "Mining — current rock", line) + last_status = now except Exception as e: print(f"[rock] error: {e}") time.sleep(poll)