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 —
_ShowMissingRecipesForProfessionpreviously guarded onaddon.knownRecipes[profID]being non-nil, which is only populated when the profession window firesCRAFT_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, iteratesrecipeDB[profID]and callsIsSpellKnown(spellID, false)for each entry to build the known-recipes set in place. The result is cached inaddon.knownRecipes[profID]; if the player later opens their profession window,CRAFT_SHOW/TRADE_SKILL_SHOWoverwrites 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 = trueandownerGuildfields in the payload;GetActive()hides campaigns whoseownerGuilddoes 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 forwarding —
Communication: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); respectsaddon.db.profile.announce.greenwall = falseopt-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 framework —
Communication:AnnounceToChannels(msg)centralises all channel send logic; readsaddon.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 —
.tocupdated to declare compatibility with Classic Era, TBC, WotLK, Cata, MoP, and Retail (The War Within); three newCompat/shims abstract the diverging APIs for each game version
Compatibility Shims (Compat/)
TradeSkillCompat.lua—PS_TradeSkill.GetAdapters()unifies the Classic dual-window API (GetTradeSkillLine+GetCraftLine) and retailC_TradeSkillUIbehind a single iterator interface;ScanOpenProfessionWindow()inShoppingListTab.luamigrated to use itMailCODCompat.lua—PS_MailCOD.SetCOD(copper)handles Classic Era frame manipulation, Cata+SetSendMailCOD(), and retail (COD removed — documented no-op with chat warning);MailHandler.luaCOD block migratedAHCompat.lua—PS_AHCompatunifies Classic (QueryAuctionItems/AUCTION_ITEM_LIST_UPDATE/GetAuctionItemInfo) and retail two-phase flow (SendBrowseQuery→SendCommoditySearchQuery/SendSearchQuery, with commodity vs. equipment branching); callback-based API (RegisterQueryHandler/UnregisterQueryHandler) replaces raw event wiring;AHScanner.luaandAHScannerFrame.luamigrated
Bug Fixes
- Lint:
AddTooltipundefined inShoppingListTab.lua— added local definition mirroringMainFrame.luaandGoldFundMeTab.lua - Lint:
resultsLabelforward reference inShoppingListTab.lua— declaration hoisted above hover-to-fill closure, assignment left at original site - Lint:
@returnannotation inMailCODCompat.lua— splitboolean, string|nilinto two separate@returnlines to satisfy the language server - Lint:
sortsmissing fromAHCompat.luaSendBrowseQuery— addedsorts = {}to satisfy the requiredAuctionHouseBrowseQueryfields - Lint: five missing globals in
.luarc.json— addedPersonalShopperDB_Items_Retail,GetAuctionItemLink,GreenWallAPI,gw,GW_MTYPE_CHAT C_AddOns.GetAddOnMetadatacrash on Classic Era — guarded with(C_AddOns and C_AddOns.GetAddOnMetadata) or GetAddOnMetadataininit.luaC_Container.*crash on Classic Era —MailHandler.luauses 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, andOnGuildMessageReceivedall removed (Core/Communication.lua,Core/GoldFundMe.lua) .pkgmetacleaned up — removed YAML#comment lines that were triggering markdownlint; added.markdownlint.json,.markdownlintignore, and.vscode/settings.jsonto the ignore list.markdownlint.jsonupdated — added MD007/MD022/MD041 disable rules to silence false positives from non-markdown config files.vscode/settings.jsonadded — associates.pkgmetawith 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 removed —
customChannelsettings block and the three never-called Communication functions (JoinCustomChannel,LeaveCustomChannel,IsInCustomChannel) removed frominit.lua,GUI/Options.lua, andCore/Communication.lua goldFundMeAnnounceDB key renamed toannounce— generic key shared by all tabs; existing SavedVariables will reset to defaults on first load after upgradePS_OrderTombstonesadded to.luarc.jsonglobals;SendChatMessagechannel 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
/reloadviaframePositions.donorListSavedVariable (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_REQUESTback to the sender whenever an incoming campaign has a newer version, triggering a fullGFM_RESPONSEwhisper (no size limit) that includes all pledges - Available orders leaking into GFM tab — stale
availableOrdersScrollAceGUI widget reference was reused after switching away from the Available tab; fixed by niling both scroll refs on tab leave and adding acurrentTab ~= "available"early-exit guard inRefreshOrderList - Donor dialog double-release error — AceGUI
FramefiresOnCloseonHide(), causing a double-release when the dialog was also explicitly released; fixed by niling theOnClosecallback before every programmaticRelease()call - Donor dialog always centering on screen — AceGUI
OnAcquireauto-shows the frame atCENTERandApplyStatusre-centers wheneverstatus.left/topare nil; fixed by hiding before snapping, positioning relative to the main window, then writing resolved pixel coords back into the AceGUI status table soApplyStatuspreserves the position - GFM donation recipient double-realm —
playerNamereceived over a cross-realm channel already contained a-Realmsuffix; the name is now stripped to base before appending the campaign'splayerRealm
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.luaandModules/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 inShoppingList:GetAll - AHScanner sort crash on nil priority —
table.sortcrashed whenitem.prioritywas nil; guarded withor 99fallback - nil priority on item add —
PS_ShoppingListSettings.defaultPriorityabsent in old saves; triple fallbackor 2added inShoppingList: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 row —
itemLink = ""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 dumpsldiagnostic slash command: dumps allPS_ShoppingListentries 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 viaPS_ShoppingListSavedVariable; 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.professionSpectable tracks the player's active sub-specialization per profession
Bug Fixes
- Crash on "Add to Shopping List" �
attempt to compare table with numberatShoppingList.lua:83; caller was passing one table argument instead of a numericitemIdfollowed by an options table - Lint errors in
GUI/ShoppingListTab.lua� undefined WoW globals, protected AceGUI field access,IsSpellKnownwrong arg count - Lint errors in
Modules/AHScanner.lua� undefinedGetNumAuctionItemsandGetAuctionItemInfo - Lint errors in
GUI/AHScannerFrame.lua� undefined AH globals and protected AceGUI.framefield 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
RequestOrdersthrottle 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
SendChatMessageblock error � Blizzard blocksSendChatMessagecalls 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;
MailHandlerscans 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, andCANCELLEDstates persisted in SavedVariables; mailbox option added to open the mail tab directly from the fulfill dialog
Bug Fixes
- Classic Era COD API �
SetSendMailCOD()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 callsSetChecked(false)onSendMailMoneyButtonbefore 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
SendCommMessagechannel index � must pass an integer channel index for CHANNEL distribution; was incorrectly passing a string channel name- AceComm-3.0 registration �
RegisterComm/SendCommMessagemust be called on the host addon's mixin, not the standalone library; fixed by usingaddon:RegisterComm() - DeltaSync
%zgsub pattern � Lua 5.1 treats a literal\0as end-of-string inside character classes; replaced with%zto fix "malformed pattern (missing ']')" on everyCHAT_MSG_CHANNELevent - DeltaSync debug buffer unification �
lib.debugMessageBufferandaddon.debugMessageBufferwere separate tables;RedrawDebugMessageswiped lib messages on tab switch; unified to a single shared reference DeltaSync.debugEnabledlive sync �/ps debugnow also setsDeltaSync.debugEnabledso COMMS.RECEIVE logs appear immediately without/reload
[v0.0.3-alpha] (2026-01-21) - Embedded Libraries
Internal
- Embed external libraries �
LibDataBroker-1.1andLibDBIcon-1.0moved intoLibs/folder and loaded directly; removed from.pkgmetaexternals - Switch externals to GitHub �
.pkgmetaexternal 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 model �
BuyOrder.luadefines the order schema (itemId, quantity, maxPrice, requester, status, timestamp) - Communication system � AceComm-3.0 based message bus; guild and whisper distribution; server-wide hidden
PersonalShopperchannel for cross-guild reach; custom user-configurable announcement channel - Mail system integration �
MailHandler.luadetects 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 Panel �
LibDBIcon-1.0minimap icon;LibDataBroker-1.1data source for Titan Panel; single shared dataobj between both - Options panel � AceConfig options: debug toggle, minimap show/hide, notifications, custom channel name, profile management
- Localization �
enUSbase locale loaded viaLocale.xml; all user-facing strings keyed throughL[...]
Bug Fixes
- Addon load failure �
LibDataBroker-1.1andLibDBIcon-1.0were declared as.pkgmetaexternals but not embedded; addon failed to load; resolved by embedding both libs - LibDBIcon
lib.xml�LibDBIcon-1.0.luamust be loaded directly; loading vialib.xmlcaused a nil error on init AddToBlizzardOptionsdeprecated � removed deprecated call fromOptions:Init(); options panel now opened viaAceConfigDialog:Open()- TitanPanel nil
dataObj�MinimapButtonandTitanPaneleach created a separateLibDataBrokerobject; second creation returned nil; fixed by sharing one object RegisterCommmethod not found �RegisterCommmust be called inCommunication:Init(), not at file load time before the addon is initializedtabGroupnil onSelectTab�self.tabGroupmust be assigned before callingSelectTab; moved assignment earlier inMainFrame:Open()- Duplicate button code � duplicate widget block referenced undefined
contentvariable; 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 SetStatusTablefor 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_Timerdelay withPLAYER_ENTERING_WORLDevent to ensure the channel exists before attempting to join