promotional bannermobile promotional banner

Broker: Midnight Events

A compact world-event timer & associated mini weekly checklist for WoW Midnight, served through any LibDataBroker host

File Details

v0.9.1-beta

  • B
  • May 24, 2026
  • 78.88 KB
  • 26
  • 12.0.5
  • Retail

File Name

Broker_MidnightEvents-v0.9.1-beta.zip

Supported Versions

  • 12.0.5

Broker: MidnightEvents

v0.9.1-beta (2026-05-24)

Full Changelog Previous Releases

  • docs: changelog entry for v0.9.1-beta bugfix refresh
  • feat(diag): /meprobe POI quirk probe for ad-hoc investigation
    Generic POI-by-name probe. Sweeps continent + MIDNIGHT_ZONE_IDS with
    GetEventsForMap, GetDelvesForMap, GetAreaPOIForMap and reports every
    match for a case-insensitive name fragment, capturing IsAreaPOITimed,
    GetAreaPOISecondsLeft, atlas, tooltipWidgetSet, iconWidgetSet, plus
    the corresponding ns.Events.GetActive() entry after dedup.
    Result saved to Broker_MidnightEventsDB._probe with a chat summary.
    Default fragment 'voidburrow'; retarget via /meprobe <fragment> for
    the next POI anomaly. Marked throwaway in the header comment.
  • fix(events): widget-text timer fallback for POIs reporting isTimed without secondsLeft
    Mining Voidburrow (poiIDs 8675, 8526) reports IsAreaPOITimed=true but
    GetAreaPOISecondsLeft returns nil. The map-tooltip countdown is rendered
    from a TextWithState widget in the POI's tooltipWidgetSet as a localized
    'Time Left: X Hr Y Min' string with Blizzard chat-escape codes embedded.
    Adds ParseTimeLeftSeconds + StripEscapes + SecondsFromWidgetSet, wired
    into ResolvePoi and BuildMapEntry as a fallback when isTimed=true and
    the standard seconds-left getter returns nil. enUS locale assumption
    documented; non-English clients degrade silently to current 'active'
    rendering (no regression).
    Escape-stripping handles |c color spans, |r reset, |4SINGULAR:PLURAL;
    plural escapes (critical — |4Hr:Hr; contains a literal '4' digit the
    parser would otherwise lift as the hours value), |n newlines, and
    |H...|h hyperlinks.
  • fix(picks): clear cached pick on abandon, not just turn-in
    User flagged two follow-up cases on the lifetime-flag picks fix:
    1. What if the player drops/abandons the weekly? The cached pick
      should clear, but the previous logic only cleared when
      IsQuestFlaggedCompleted(prev) returned false. Given lifetime-
      persistent flags (the Liadrin pool case), that check returns true
      permanently for any prior-week completion of the same pool member,
      so abandoning a re-accepted previously-completed pick would falsely
      preserve the cache.
    2. Bonus Event Weekly uses the same picks mechanism, so it suffers
      from the same potential issue (not yet verified but architecturally
      identical).
      Fix distinguishes "removed via turn-in" from "removed via abandon" at
      the event level rather than relying on the unreliable flag check:
    • QUEST_TURNED_IN handler stamps recentTurnIn[questID] = GetTime()
      * QUEST_REMOVED handler checks for a recent (≤5s) turn-in:
      • paired with QUEST_TURNED_IN → real turn-in, preserve cache
      • bare QUEST_REMOVED → abandon, clear matching picks
        Session-local recentTurnIn map; doesn't need to persist (any /reload
        guarantees there's no in-flight transition to track).
        5s window is generous — QUEST_REMOVED typically fires within a frame
        of QUEST_TURNED_IN. Wider than needed but safe; the worst case is a
        QUEST_REMOVED arriving ≥5s after its QUEST_TURNED_IN, which would
        falsely clear the cache and downgrade the row to no-annotation —
        strictly less wrong than the previous behavior.
        Applies uniformly to all picks pools: Liadrin, Bonus Event Weekly,
        Void Assault zone, and any future picks-flagged rows.
  • fix(picks): drop "any pool flagged" fallback; restore cache preservation
    Probe on Artherio (2026-05-24) returned IsQuestFlaggedCompleted = true
    for ALL 9 Liadrin pool member quest IDs simultaneously. Conclusion:
    these completion flags are achievement-style and persist across
    weekly resets — once you've ever picked a pool member, its flag is
    true forever. So "any pool member flagged" is meaningless as a signal
    for "which one did you pick THIS week," and pairs()-iteration order
    arbitrarily picks the wrong one.
    Two-pass detection now reduced to:
    1. Active quest log scan (definitive — if it's in the log, it's
    the pick).
    2. Cached-and-still-flagged preservation (covers post-turn-in,
    where the quest leaves the log but its flag stays true).
    The "any pool flagged" pass is gone.
    Cold-start consequence: a character who completed a Liadrin pick
    before the feature was deployed AND never opens the addon while the
    quest is in their log will see the row marked done but without the
    "(<choice> picked)" annotation. Acceptable trade — IsWeeklySlotDone
    still flags the row done from the slot's own pool-OR semantics, and
    choosing-no-annotation is better than choosing-wrong-annotation.
    Weekly reset hook in Settings.lua now also clears char.picks. Without
    this, the cached pick would carry from week to week since the
    underlying flags don't clear — last week's pick would persist into
    the new cycle until the player accepts a new one (which might never
    happen on alts that skip Liadrin this week).
    For Artherio's current bug state (picks.liadrin = 94457 Battlegrounds,
    should be 93910 Prey): the new logic keeps the wrong value this week
    because all 9 are flagged and the cached one passes the preservation
    check. Manual recovery this week = SV edit OR /reload past next weekly
    reset (which now clears picks automatically with this commit).