File Details
PersonalShopper-v0.6.1
- R
- Apr 14, 2026
- 927.89 KB
- 16
- 12.0.1+10
- Classic + 4
File Name
PersonalShopper-PersonalShopper-v0.6.1.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.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