PersonalShopper

An addon to post purchase requests to the community.

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 = 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