promotional bannermobile promotional banner

Guild Mate

A guild bank donation tracker and goal management tool.

File Details

v0.4.4-bcc

  • R
  • Apr 12, 2026
  • 214.17 KB
  • 18
  • 2.5.5
  • Classic TBC

File Name

GuildMate-v0.4.4-bcc.zip

Supported Versions

  • 2.5.5

GuildMate

v0.4.4 (2026-04-12)

Full Changelog Previous Releases

  • Vendor libs: drop externals block from .pkgmeta
    repos.curseforge.com has been returning 503s during release builds,
    blocking CI. Switch to vendored libraries (already present in Libs/)
    so builds work regardless of CurseForge availability.
    Includes an inline note explaining the tradeoff and when to revert
    (ideally we re-enable externals once CF stabilizes or we switch to
    GitHub-hosted lib mirrors).
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Silence repeat scan messages while tradeskill window stays open
    If the user keeps the tradeskill or craft window open, WoW periodically
    re-fires TRADE_SKILL_UPDATE / CRAFT_UPDATE (for level changes, recipe
    learns, etc.). Each burst got coalesced into a single scan, but the
    "Scanning..." + "Synced" messages printed every time the 5s in-scan
    debounce expired — spamming the chat frame every ~5s forever.
    Now announce only the first scan of each window session. Subsequent
    re-scans stay silent unless they actually find new data (changed=true).
    Announced-flag resets on TRADE_SKILL_CLOSE / CRAFT_CLOSE (plus OnHide
    fallback) so the next window open gets a fresh message.
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Show goal in grey for off-rank users, with guild-wide progress bar
    When a reroll/alt rank opens the Donations view, show the active
    donation goal in a greyed-out status card instead of hiding it.
    Alts can now see what the main ranks are expected to donate without
    confusion.
    Progress bar stays visible but switches meaning:
    • On-rank: personal donated / goal amount (current behavior)
    • Off-rank: guild-wide "N / M members met" across all target ranks
      Status summary below the bar shows GOAL_NOT_APPLICABLE when off-rank,
      and the card appends a grey "Applies to: Officer, Raider" hint so
      the user understands who the goal is for. Last-deposit timestamp
      hidden when off-rank (nothing to report).
      Added GOAL_APPLIES_TO locale string (enUS + frFR).
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Accept data from unknown senders; trigger HELLO back
    After a DB flush, addonUsers is empty and IsSenderCompatible rejected
    everyone — the version gate was too aggressive. Fix: accept messages
    from unknown senders (current wire formats are backward-compatible so
    accepting is safe) and trigger our HELLO back so we learn their
    version on the next round-trip.
    Known-outdated senders are still rejected. Only previously-unknown
    senders now get the benefit of the doubt.
    The opportunistic HELLO is debounced to 10s to avoid a burst when
    multiple unknown guildies message us at once (common right after a
    flush or first login after install).
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Coalesce tradeskill/craft scan triggers into a single run
    Opening a tradeskill or enchanting window fires multiple events in
    quick succession (TRADE_SKILL_SHOW, TRADE_SKILL_UPDATE × N, our
    HookScript OnShow). Each one used to schedule its own deferred
    C_Timer.After(0.5, ScanRecipes), so the user saw 3+ "Scanning..."
    chat messages per window open.
    Replace all stacked timers with a single cancel-and-reschedule
    NewTimer per scan type (tradeskill vs craft). Events still wake
    the queue, but only the last one wins — one scan runs 0.6s after
    the event burst settles. Delay bumped slightly to let CRAFT_UPDATE
    pulses collapse cleanly.
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Group enchanting recipes by slot instead of generic category
    Blizzard's Craft window for enchanting only has one top-level category
    ("Enchant") which is useless for browsing. Replace it with slot-based
    grouping derived from recipe names: Helm, Shoulder, Cloak, Chest,
    Bracer, Gloves, Boots, 2H Weapon, Weapon, Shield, Ring.
    Slot detection matches localized keywords (English + French) against
    the recipe name. Unslotted recipes (e.g. "Runed Arcanite Rod") fall
    back to the window's native category, sorted below slotted ones.
    _NeedsRecategorize now also force-rescans when existing enchants have
    category values outside the known slot set — handles the one-time
    migration from v0.4.4's generic "Enchant" categorization to this one
    without requiring any manual action.
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Scan status via chat; fully-white triangle in comm feed
    Replace the floating scan-status toast (anchored below tradeskill /
    craft window) with a simple chat-frame print. Less intrusive, still
    gives the player confirmation that GuildMate scanned + broadcast
    their recipes, and no more orphan frames when the window closes.
    The live comm feed arrow was rendered via ChatFrameExpandArrow +
    SetDesaturated, which leaves mid-tone greys baked into the texture.
    Replace with a true-white triangle built from stacked 1px WHITE8X8
    strips — crisp, zero greyscale, identical size.
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Fix enchanting categories not being captured
    Three bugs in the Craft (enchanting) scanner:
    1. Headers weren't being expanded before scanning, so recipes inside
      collapsed sub-sections were invisible. Now calls
      ExpandCraftSkillLine on every header before iterating (matches the
      TradeSkill scanner behavior).
    2. Header detection was too strict. TBC Anniversary can return nil or
      empty craftType for enchanting category dividers instead of
      "header". Added a fallback: entries with no reagents and no item
      link are treated as headers.
    3. Existing stored recipes scanned before v0.4.4 had no category
      data, and the 5-second debounce was blocking the fresh re-scan.
      Added a one-time force-rescan path that triggers whenever the
      current player's recipes for a profession are missing categories.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • HELLO handshake is now bidirectional
    When we receive HELLO from a previously-unknown sender, reply with our
    own HELLO so they also learn our version. Without this, HELLO was
    one-way: whoever logged in last told everyone their version, but
    older-online players never told the newcomer theirs, so the newcomer
    would drop their broadcasts.
    Debounced to 10s so two newcomers greeting each other don't ping-pong.
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Sync recipe categories + gate comm by addon version
    Two fixes users asked for:
    1. Recipe categories now sync across the guild. RECIPE_UPDATE wire
      format extended from "spellID<sub>icon</sub>reagents" to
      "spellID<sub>icon</sub>catOrder<sub>category</sub>reagents". Receiver accepts both
      old (3-field) and new (5-field) layouts for backward compat.
      Strings encoded with backslash-escapes so category and reagent
      names survive pipes / colons / commas / tildes / semicolons.
    2. Minimum compatible version gate. GM.MIN_COMPAT_VERSION = "0.4.4".
      All incoming messages except HELLO are dropped if the sender's
      tracked version is below this. Prevents outdated clients (e.g. a
      guildie still on v0.4.1) from writing stale-format data into the
      local DB. Gate is centralized in GM:OnCommReceived and runs
      before per-module handlers.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Show scan-status toast below tradeskill/craft window
    Small floating indicator anchored to the bottom of TradeSkillFrame or
    CraftFrame, telling the user we're scanning + broadcasting recipes
    and to keep the window open. Shows "Scanning..." in white, then
    "Synced N Alchemy recipes to the guild" in green on completion.
    Auto-hides 4 seconds after the scan finishes. If the window is closed
    before the toast is anchored, it simply doesn't appear (no floating
    orphan frame).
    Scanning itself is synchronous so the message pops in briefly, but
    the completion toast reassures the user that sync happened — and the
    4s linger gives them time to see it.
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Fix tradeskill-open freeze: debounce + stop touching user filters
    Two causes of the lag / freeze when opening tradeskill:
    1. Filter-reset (SetTradeSkillSubClassFilter / InvSlot / Makeable /
      SkillUps) each fired TRADE_SKILL_UPDATE, queueing 10+ deferred
      ScanRecipes() calls. Each call iterated 100+ recipes and made
      expensive API calls. Removed — we only expand headers now, which
      is enough to see categories.
    2. Re-entrancy guard stopped synchronous loops but didn't help the
      stacked C_Timer.After(0.5, ...) handlers. Added a 5-second
      time-based debounce per scanner (ScanRecipes, ScanCraftRecipes).
      Tradeoff: if the user has a tradeskill filter active, scanned recipes
      miss their category. They can remove the filter and re-open.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Fix PROF_UPDATE broadcast flood (61k+ messages per session)
    Three bugs combining into a runaway loop:
    1. ScanRecipes reset filters / expanded headers, each of which fires
      TRADE_SKILL_UPDATE. The handler called ScanRecipes again, looping
      forever. Added a _scanningRecipes re-entrancy guard (same for the
      Craft/enchanting scanner).
    2. ScanSelf broadcast PROF_UPDATE on every call without checking if
      skill data actually changed. TRADE_SKILL_UPDATE fires constantly
      during a scan, so we flooded comm. Now deduped: only broadcast
      when profession count, rank, or maxRank differs from stored data.
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • Reset tradeskill filters and expand headers before scanning
    Fixes category info being missing when users have sub-class, slot, or
    "have materials" filters active — GetTradeSkillInfo omits header rows
    under any filter, so all recipes landed under "Other".
    Snapshot-and-restore proved unreliable (TBC filter APIs are flaky), so
    we just reset to show-all. Side effect: user's tradeskill filter is
    cleared when GuildMate scans. Acceptable tradeoff to fix category sync.
    Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
  • v0.4.4: Enchanting recipes, category ordering, white comm arrow
    • Add Enchanting scanner using the Craft API (CraftFrame, GetNumCrafts, CRAFT_SHOW/UPDATE) — TBC quirk where enchanting predates the tradeskill system
    • Capture in-game category headers during scan; sort + display recipes grouped by category matching the tradeskill/craft window order
    • Desaturate ChatFrameExpandArrow in comm feed so the triangle renders white instead of yellow
      Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com