PersonalShopper

An addon to post purchase requests to the community.

File Details

PersonalShopper-v0.6.2

  • R
  • Apr 15, 2026
  • 928.79 KB
  • 20
  • 12.0.1+10
  • Classic + 4

File Name

PersonalShopper-PersonalShopper-v0.6.2.zip

Supported Versions

  • 12.0.1
  • 12.0.0
  • 11.2.7
  • 5.5.3
  • 5.5.2
  • 4.4.2
  • 3.80.0
  • 3.4.5
  • 2.5.5
  • 1.15.8
  • 1.15.7

PersonalShopper Changelog

[v0.6.2] (2026-04-14) - Collector Bug Fix

Bug Fixes

  • Collector → Missing Recipes works without opening the profession window first_ShowMissingRecipesForProfession previously guarded on addon.knownRecipes[profID] being non-nil, which is only populated when the profession window fires CRAFT_SHOW/TRADE_SKILL_SHOW. For Enchanting (Classic Craft window API) this meant the feature was inaccessible unless the player manually opened their Enchanting window before clicking Collector. The hard guard has been replaced with an on-demand fallback: if the window was never opened this session, iterates recipeDB[profID] and calls IsSpellKnown(spellID, false) for each entry to build the known-recipes set in place. The result is cached in addon.knownRecipes[profID]; if the player later opens their profession window, CRAFT_SHOW/TRADE_SKILL_SHOW overwrites the cache with the more precise window-scanned data. Affects all professions on all game versions, but was most visible for Enchanting on Classic Era. (GUI/ShoppingListTab.lua)

[v0.6.1] (2026-04-14) - GFM Guild-Only, GreenWall, Announce Buttons & Multi-Version WoW Support

New Features

  • GoldFundMe guild-only campaigns — new "Guild Only" checkbox in the Create Campaign dialog (disabled when not in a guild; label shows guild name); guild-only campaigns are broadcast over the shared PersonalShopper channel with guildOnly = true and ownerGuild fields in the payload; GetActive() hides campaigns whose ownerGuild does not match the viewer's guild; campaign rows show a [g] guild badge for guild-only entries (Core/GoldFundMe.lua, GUI/GoldFundMeTab.lua)
  • GreenWall confederation forwardingCommunication:AnnounceToChannels(msg) now forwards announce messages through GreenWall's confederation channel (gw.config.channel.guild:send(GW_MTYPE_CHAT, msg)) when GreenWall is installed and connected; enabled by default, capped at 240 chars (GW wire limit); respects addon.db.profile.announce.greenwall = false opt-out (Core/Communication.lua)
  • [Announce] buttons — gold [Announce] button added to GoldFundMe campaigns, Shopping List items, and My Orders rows; sends a lore-flavoured message to configured chat channels with one click
  • Shared announce frameworkCommunication:AnnounceToChannels(msg) centralises all channel send logic; reads addon.db.profile.announce (guild toggle + per-channel multiselect); channel choices persist in SavedVariables via AceDB-3.0
  • Announcements settings page — unified ESC → Interface → AddOns → Personal Shopper → Announcements page replaces the old GoldFundMe-only channel settings; covers all three tabs
  • Channel spam filter — addon-owned and merge channels (personalshopper, grouper, greenwall, guildmerge) are always hidden from the channel multiselect
  • Multi-version WoW support.toc updated to declare compatibility with Classic Era, TBC, WotLK, Cata, MoP, and Retail (The War Within); three new Compat/ shims abstract the diverging APIs for each game version

Compatibility Shims (Compat/)

  • TradeSkillCompat.luaPS_TradeSkill.GetAdapters() unifies the Classic dual-window API (GetTradeSkillLine + GetCraftLine) and retail C_TradeSkillUI behind a single iterator interface; ScanOpenProfessionWindow() in ShoppingListTab.lua migrated to use it
  • MailCODCompat.luaPS_MailCOD.SetCOD(copper) handles Classic Era frame manipulation, Cata+ SetSendMailCOD(), and retail (COD removed — documented no-op with chat warning); MailHandler.lua COD block migrated
  • AHCompat.luaPS_AHCompat unifies Classic (QueryAuctionItems / AUCTION_ITEM_LIST_UPDATE / GetAuctionItemInfo) and retail two-phase flow (SendBrowseQuerySendCommoditySearchQuery / SendSearchQuery, with commodity vs. equipment branching); callback-based API (RegisterQueryHandler / UnregisterQueryHandler) replaces raw event wiring; AHScanner.lua and AHScannerFrame.lua migrated

Bug Fixes

  • Lint: AddTooltip undefined in ShoppingListTab.lua — added local definition mirroring MainFrame.lua and GoldFundMeTab.lua
  • Lint: resultsLabel forward reference in ShoppingListTab.lua — declaration hoisted above hover-to-fill closure, assignment left at original site
  • Lint: @return annotation in MailCODCompat.lua — split boolean, string|nil into two separate @return lines to satisfy the language server
  • Lint: sorts missing from AHCompat.lua SendBrowseQuery — added sorts = {} to satisfy the required AuctionHouseBrowseQuery fields
  • Lint: five missing globals in .luarc.json — added PersonalShopperDB_Items_Retail, GetAuctionItemLink, GreenWallAPI, gw, GW_MTYPE_CHAT
  • C_AddOns.GetAddOnMetadata crash on Classic Era — guarded with (C_AddOns and C_AddOns.GetAddOnMetadata) or GetAddOnMetadata in init.lua
  • C_Container.* crash on Classic EraMailHandler.lua uses a local compat table that falls back to Classic globals (GetContainerNumSlots, GetContainerItemInfo, etc.)

Changes

  • GFM guild-only routing simplified to single channel — initial implementation used a second AceComm prefix (PSGfmG) and GUILD distribution in parallel with the PersonalShopper channel; refactored so guild-only campaigns travel over the same channel with payload flags; MSG_GFM_GCAMPAIGN/GCANCEL/GREQUEST, GFM_GUILD_PREFIX, SendGuildMessage, and OnGuildMessageReceived all removed (Core/Communication.lua, Core/GoldFundMe.lua)
  • .pkgmeta cleaned up — removed YAML # comment lines that were triggering markdownlint; added .markdownlint.json, .markdownlintignore, and .vscode/settings.json to the ignore list
  • .markdownlint.json updated — added MD007/MD022/MD041 disable rules to silence false positives from non-markdown config files
  • .vscode/settings.json added — associates .pkgmeta with YAML language mode
  • Settings tree simplified — Notifications page removed; all notification toggles merged into the General page under a "Notifications" header
  • Dead Custom Channel feature removedcustomChannel settings block and the three never-called Communication functions (JoinCustomChannel, LeaveCustomChannel, IsInCustomChannel) removed from init.lua, GUI/Options.lua, and Core/Communication.lua
  • goldFundMeAnnounce DB key renamed to announce — generic key shared by all tabs; existing SavedVariables will reset to defaults on first load after upgrade
  • PS_OrderTombstones added to .luarc.json globals; SendChatMessage channel arg corrected from numeric id to channel name string

[v0.6.0] (2026-04-13) - GoldFundMe Crowdfunding

New Features

  • GoldFundMe tab — create community gold-goal campaigns visible server-wide to all Personal Shopper users; set a title, gold goal, and optional linked item; progress bar shows current savings + pledges vs. goal with donor count
  • Donor List dialog — opens to the right of the main window and lists each backer's contribution with a mail-confirmed badge; owner gets a "Sync" button to push authoritative campaign data to all online peers; dialog size persists across redraws and /reload via framePositions.donorList SavedVariable (default 380 × 400)
  • Automatic mail donation detection — when a campaign owner clicks "Take Money" on a GFM:<campaignId> mail the addon records the donation and updates the donor list instantly with no manual input
  • "Donate via Mail" shortcut — non-owners can pre-fill the mail compose window (recipient, subject, optional gold amount) with one click from any campaign row or the Donor List dialog

Bug Fixes

  • GFM sync not propagating pledges — WoW channel messages are capped at 255 bytes so pledges were always stripped; fixed by whispering a GFM_REQUEST back to the sender whenever an incoming campaign has a newer version, triggering a full GFM_RESPONSE whisper (no size limit) that includes all pledges
  • Available orders leaking into GFM tab — stale availableOrdersScroll AceGUI widget reference was reused after switching away from the Available tab; fixed by niling both scroll refs on tab leave and adding a currentTab ~= "available" early-exit guard in RefreshOrderList
  • Donor dialog double-release error — AceGUI Frame fires OnClose on Hide(), causing a double-release when the dialog was also explicitly released; fixed by niling the OnClose callback before every programmatic Release() call
  • Donor dialog always centering on screen — AceGUI OnAcquire auto-shows the frame at CENTER and ApplyStatus re-centers whenever status.left/top are nil; fixed by hiding before snapping, positioning relative to the main window, then writing resolved pixel coords back into the AceGUI status table so ApplyStatus preserves the position
  • GFM donation recipient double-realmplayerName received over a cross-realm channel already contained a -Realm suffix; the name is now stripped to base before appending the campaign's playerRealm

Changes

  • DESIGN.md consolidated: full GoldFundMe section added; full Shopping List section added; four obsolete pre-implementation planning docs deleted (SHOPPING_LIST_FEATURE.md, SHOPPING_LIST_ARCHITECTURE.md, SHOPPING_LIST_SUMMARY.md, PHASE1_COMPLETE.md)
  • Lint fixes in GUI/GoldFundMeTab.lua and Modules/MailHandler.lua

[v0.5.0] (2026-04-04) - Settings Panel & Auto-Cancel on Obtain

New Features

  • Settings in ESC > Interface > AddOns — Personal Shopper options are now embedded in the Blizzard Interface Options panel with an expandable tree (General, Notifications, Custom Channel, Profiles, Debugging); the old floating AceConfigDialog window is gone
  • Auto-cancel buy orders on obtain — the "Auto-Remove When Obtained" feature now also cancels active buy orders when your bags contain enough of the item; previously only Shopping List entries were removed
  • Right-click minimap button toggles settings — right-clicking now opens or closes the options panel; previously it always opened

Changes

  • "Auto-Remove When Obtained" tooltip updated to describe both Shopping List removal and buy order cancellation

[v0.4.1] (2026-04-04) - Shopping List Fixes & Inline Scan Options

Bug Fixes

  • Shopping List last row clipped — final item in the list was always invisible, cut off by the scroll frame edge; fixed with a trailing spacer after the render loop
  • Priority filter type mismatch — AceGUI dropdown returns string keys but priority is stored as a number; tonumber() applied to both sides in ShoppingList:GetAll
  • AHScanner sort crash on nil prioritytable.sort crashed when item.priority was nil; guarded with or 99 fallback
  • nil priority on item addPS_ShoppingListSettings.defaultPriority absent in old saves; triple fallback or 2 added in ShoppingList:Add
  • Stale category filter hiding items — filter reset to ALL when saved category no longer exists in the list
  • New item hidden by active filter — both filters reset to ALL on successful ShoppingList:Add
  • Empty itemLink produces invisible rowitemLink = "" now treated same as nil
  • Row crash silently suppressed — pcall errors now print to chat instead of only to debug log
  • Shopping List title truncated — title label changed to full width so (N filtered) indicator is always visible

Changes

  • Scan Options moved into AH Scan tab — removed the Shopping List group from the Settings/Options panel; scan settings (Scan Mode, Min Priority, Delay, Hide over budget, Skip fully stocked) now render inline in the AH Scan tab via AddScanOptionsPanel
  • Clear Filters link added to Shopping List filter bar; shown in red when a filter is active
  • /ps dumpsl diagnostic slash command: dumps all PS_ShoppingList entries to chat

[v0.4.0] (2026-04-03) - AH Scanner, Shopping List & Missing Recipe Tracker

New Features

  • Shopping List (Core/ShoppingList.lua, GUI/ShoppingListTab.lua) � new "Shopping List" tab in the main window; add/edit/remove items with quantity, max price, priority (High/Medium/Low), category, and notes; color-coded priority rows; per-account persistence via PS_ShoppingList SavedVariable; BoP and quest item validation
  • AH Scanner (Modules/AHScanner.lua, GUI/AHScannerFrame.lua) � one-click scan at the Auction House for every item on your shopping list; results frame shows current buyout, quantity available, and green/red budget indicators; configurable scan delay and skip-fully-stocked option; enabled/disabled automatically when AH opens/closes
  • Missing Recipe Tracker � "Add Missing Recipes" button scans open profession windows and adds all missing tradeable recipe scrolls to the shopping list in one click
  • Specialization filtering � recipes locked to a different sub-spec (Dragonscale/Elemental/Tribal Leatherworking, Gnomish/Goblin Engineering, Armorsmith/Weaponsmith Blacksmithing) are hidden when the player's spec doesn't match; detected via IsSpellKnown() when the tradeskill window opens
  • addon.professionSpec table tracks the player's active sub-specialization per profession

Bug Fixes

  • Crash on "Add to Shopping List"attempt to compare table with number at ShoppingList.lua:83; caller was passing one table argument instead of a numeric itemId followed by an options table
  • Lint errors in GUI/ShoppingListTab.lua � undefined WoW globals, protected AceGUI field access, IsSpellKnown wrong arg count
  • Lint errors in Modules/AHScanner.lua � undefined GetNumAuctionItems and GetAuctionItemInfo
  • Lint errors in GUI/AHScannerFrame.lua � undefined AH globals and protected AceGUI .frame field access

[v0.3.0] (2026-03-24) - Item Filters, Tooltips & History Filters

New Features

  • Item type/subtype filters � filter the Available Orders list by item type and subtype to narrow results when browsing orders
  • Item tooltips � hover any item name in Available Orders or History to see the full WoW item tooltip
  • History filters � filter Order History by date range, item name, or fulfillment status

[v0.2.0] (2026-03-20) - Session 3 Bug Fixes

Bug Fixes

  • Session 3 bug fixes and improvements � resolved multiple issues found during session 3 testing including order propagation, MailHandler syntax errors, mailbox tab key navigation, and RequestOrders throttle bypass

[v0.1.2] (2026-03-18) - BoP & Quest Item Blocking

New Features

  • Block Bind on Pickup and quest item orders � orders for BoP or quest items are now rejected at creation time with an error message; prevents unfulfillable orders from being broadcast to the server

[v0.1.1] (2026-03-18) - Fulfillment Tracking Fix

Bug Fixes

  • Correct fulfillment tracking � orders were not being marked fulfilled correctly after the mailbox attach sequence completed; now tracked reliably via order state
  • Suppress SendChatMessage block error � Blizzard blocks SendChatMessage calls during certain protected frames; error is now caught and suppressed rather than surfacing to the user

[v0.1.0] (2026-03-18) - COD, DeltaSync & Mailbox Fulfillment

New Features

  • Auto-attach items and COD on fulfill � ported TOGBank's greedy algorithm; MailHandler scans bags, calculates a fulfillment plan (full stacks largest-first, small-stack skip, split candidate fallback), then auto-attaches items and sets COD without manual interaction
  • DeltaSyncChannel (DeltaSyncChannel.lua) � optional CHANNEL transport module; routes order broadcasts through a hidden addon-owned channel instead of GUILD/WHISPER for server-wide reach
  • Order state tracking � orders now track PENDING, FULFILLED, and CANCELLED states persisted in SavedVariables; mailbox option added to open the mail tab directly from the fulfill dialog

Bug Fixes

  • Classic Era COD APISetSendMailCOD() does not exist in Classic Era 1.15; replaced with direct frame manipulation (SendMailCODButton:Click() + MoneyInputFrame_SetCopper)
  • Uncheck send-money button before COD � previous Click() approach could leave both radio buttons active; now calls SetChecked(false) on SendMailMoneyButton before activating COD
  • COD nil guard, recipient realm dedup, 7-day order TTL � guards against nil COD amount; deduplicates realm suffix on recipient name; orders older than 7 days are pruned automatically
  • Available orders overlap and history stats layout � fixed row overlap in the Available Orders list and misaligned stat labels in the Order History statistics panel
  • SendCommMessage channel index � must pass an integer channel index for CHANNEL distribution; was incorrectly passing a string channel name
  • AceComm-3.0 registrationRegisterComm/SendCommMessage must be called on the host addon's mixin, not the standalone library; fixed by using addon:RegisterComm()
  • DeltaSync %z gsub pattern � Lua 5.1 treats a literal \0 as end-of-string inside character classes; replaced with %z to fix "malformed pattern (missing ']')" on every CHAT_MSG_CHANNEL event
  • DeltaSync debug buffer unificationlib.debugMessageBuffer and addon.debugMessageBuffer were separate tables; RedrawDebugMessages wiped lib messages on tab switch; unified to a single shared reference
  • DeltaSync.debugEnabled live sync/ps debug now also sets DeltaSync.debugEnabled so COMMS.RECEIVE logs appear immediately without /reload

[v0.0.3-alpha] (2026-01-21) - Embedded Libraries

Internal

  • Embed external librariesLibDataBroker-1.1 and LibDBIcon-1.0 moved into Libs/ folder and loaded directly; removed from .pkgmeta externals
  • Switch externals to GitHub.pkgmeta external references updated from WoWAce SVN to GitHub repository URLs

[v0.0.2-alpha] (2026-01-21) - TOC & MainFrame Fixes

Bug Fixes

  • TOC version bump and MainFrame bug fixes � corrected interface version in PersonalShopper.toc; fixed several nil-error crashes in the main window on first open

[v0.0.1-alpha] (2026-01-16) - Initial Alpha Release

New Features

  • Core addon framework � AceAddon/AceDB/AceGUI skeleton; namespace initialization; multi-version TOC support; VersionCheck system; debug logging system
  • BuyOrder data modelBuyOrder.lua defines the order schema (itemId, quantity, maxPrice, requester, status, timestamp)
  • Communication system � AceComm-3.0 based message bus; guild and whisper distribution; server-wide hidden PersonalShopper channel for cross-guild reach; custom user-configurable announcement channel
  • Mail system integrationMailHandler.lua detects inbox messages, parses order CODs, and surfaces fulfill prompts when the mailbox is open
  • Main window GUI � tabbed AceGUI window (Available Orders, Order History, Mail); sortable orders list with search bar; order statistics panel
  • Create Order dialog � item name auto-complete, quantity/max-price inputs, validation; popup positions to the left of the main window
  • Minimap button & Titan PanelLibDBIcon-1.0 minimap icon; LibDataBroker-1.1 data source for Titan Panel; single shared dataobj between both
  • Options panel � AceConfig options: debug toggle, minimap show/hide, notifications, custom channel name, profile management
  • LocalizationenUS base locale loaded via Locale.xml; all user-facing strings keyed through L[...]

Bug Fixes

  • Addon load failureLibDataBroker-1.1 and LibDBIcon-1.0 were declared as .pkgmeta externals but not embedded; addon failed to load; resolved by embedding both libs
  • LibDBIcon lib.xmlLibDBIcon-1.0.lua must be loaded directly; loading via lib.xml caused a nil error on init
  • AddToBlizzardOptions deprecated � removed deprecated call from Options:Init(); options panel now opened via AceConfigDialog:Open()
  • TitanPanel nil dataObjMinimapButton and TitanPanel each created a separate LibDataBroker object; second creation returned nil; fixed by sharing one object
  • RegisterComm method not foundRegisterComm must be called in Communication:Init(), not at file load time before the addon is initialized
  • tabGroup nil on SelectTabself.tabGroup must be assigned before calling SelectTab; moved assignment earlier in MainFrame:Open()
  • Duplicate button code � duplicate widget block referenced undefined content variable; removed
  • Keybindings firing in edit boxes � main window keybindings now check GetCurrentKeyBoardFocus() and no-op when an edit box is focused
  • Window position not saving � switched to AceGUI SetStatusTable for automatic position/size persistence across sessions
  • Window not centered on first open � when no saved position exists, main window now centers on screen instead of spawning at 0,0
  • Custom channel auto-join timing � replaced C_Timer delay with PLAYER_ENTERING_WORLD event to ensure the channel exists before attempting to join