Features
- ⏰ Added an order cooldown system to the live scraper that prevents rapid-fire Warframe Market order updates: a 20-minute cooldown when re-posting at the same price and a 5-minute cooldown after a price change. Cooldown state is persisted per item and surfaced in the UI (clock icon on row actions and a live countdown in the price history popover). Currently disabled by default behind a
ORDER_COOLDOWN_ENABLEDflag. - ✨ Added a minimum profit threshold logic to the live scraper, allowing users to set a minimum profit percentage or flat profit amount for their trades.
- ✨ Added a full Syndicate trading pipeline: a new
syndicate_itemdatabase table and API, a redesigned WTS settings panel with per-syndicate standing tracking and an "ignore standing" toggle, importing syndicate items from Warframe Market, and a live scraper Syndicate tab with sell/edit/delete/export operations. - ✨ Reworked WF Inventory to support pluggable sources — Warframe profile or AlecaFrame (
lastData.datwatcher) — selectable in Settings → Advanced → WF Inventory, with a manual refresh button and syndicate standing import. - ✨ Extended bulk trading to stock items:
is_bulkis now a valid stock item property, the selling pipeline uses it when computing the per-trade quantity, and the live scraper's item table shows the list price with a per-trade badge. - ✨ Added a
Fileinventory source to WF Inventory that reads a plain JSON inventory file (lastData/InventoryJson format) from a configurable path and watches it for changes, selectable alongside Profile and AlecaFrame in Settings → Advanced → WF Inventory. - ✨ Added List/Chart view modes to the Trading Analytics Transaction tab. The chart view plots daily Revenue and Expenses (bars) with a cumulative Profit line, and has a date-range dropdown (Last 7/30/90/365 days or All time, defaulting to 90 days) independent of the list filters.
Fixes
- 🛠️ Fixed the unit price being recorded as the total trade price instead of the per-item unit price (closes #124).
- 🛠️ Fixed a crash ("unexpected value for StockStatus enum") caused by stale status values in the database (e.g.
cooldown_price_change); the stock status now falls back toUnknowninstead of erroring. - 🛠️ Fixed
nullify_zeroed_propertieserroring on non-numeric properties by supportingf64,i64,i32,u64,String, and array types instead of assuming everything is a float. - 🛠️ Fixed syndicate items failing to post when the standing check errored; the check now degrades gracefully instead of aborting the pipeline.
- 🛠️ Fixed the users activity linking to to thw wrong endpoint
- 🛠️ Fixed
stock_riven_selllogging to the wrong file (stock_riven_create.log). - 🛠️ Fixed the live scraper's global knapsack budget pass deleting wish-list buy orders; wish-list items are now excluded from the knapsack check.
- 🛠️ Fixed the ban screen never showing: the banned route was unreachable because
IsUserBanned()required acleanURL while its render condition required the opposite, so QF/WFM bans detected by the backend were not surfaced in the UI. The ban screen now also takes precedence over the generic error page.
Refactors
- ♻️ Reworked analytics from a single
add_metriccall into a structured, batched event system. Events are now named (ApplicationEvent, e.g.app_start,stock_item_create,page_view,switch_theme) and carry structured string properties such assuccess,error_type, andcount. Events are queued in memory and flushed to the backend every 10 seconds in batches of up to 50, andtrack_eventinstrumentation was added across commands, the live scraper, the log parser, and theme switching. - ♻️ Reworked the live scraper's selling, wishlist, and syndicate pipelines so the order summary is only logged after a successful Warframe Market order update, and moved the "mark as live" persistence to run only on success.
- ♻️ Items are now marked as Live before the order update is attempted (so a cooldown-skipped update no longer flips them to Error), and cooldown state is tracked per item via a new
cooldownproperty. - ♻️ Reworked wishlist change tracking to use a list of changed fields (
Vec<String>) instead of a single value. - ♻️ Reworked the stock riven pipeline (create/delete/sell) to use
OperationSetflags instead of&[&str], tagged operations with aStockRiven_prefix, and added a unified logging helper that respects per-call disable flags (DisableCreatedLog,DisableDeletedLog,DisableUpdatedLog,DisableCompleteLog,DisableNotFoundLog) plusReturnOn:early-exit handling. Renamed theboughtparameter topricein thestock_riven_sellcommand.