DUXPLIMA Documentation

Analytics and the audit trail

Every trade event recorded, queryable in chat, a menu, or a CSV export.

Every trade outcome is written to the database. Nothing is sampled and nothing expires on its own.

The event types

EventWhen
TRADE_STARTEDRequirements taken, slot filled
TRADE_COMPLETEDFinished and rewarded
TRADE_BURNEDFailed its success roll
TRADE_FAILEDCould not complete — a missing hook, an invalid reward
TRADE_CANCELLEDThe player cancelled it
ADMIN_CANCELLEDStaff cancelled it
ADMIN_FORCE_COMPLETEDStaff completed it
INSTANT_COMPLETEDAn instantCraft trade succeeded
INSTANT_BURNEDAn instantCraft trade burned
INSTANT_FAILEDAn instantCraft trade could not complete
REFUND_PENDINGA refund was owed but not delivered
REFUND_DELIVEREDThe refund reached the player
REFUND_FAILEDThe refund could not be delivered

Each row records the event type, the player, the trade id, the slot, the acting staff member if any, the refund mode, whether a full refund was even possible, and a timestamp.

Daily rollups

Alongside the raw events, counts are aggregated per day per trade in trade_daily_stats: started, completed, burned, cancelled and failed. That is what the summary commands read, so a total query does not scan the event log.

Dates are UTC, so "today" rolls over at 00:00 UTC regardless of where the server is.

In chat

/blacksmith admin analytics <today|week|month|total>

Prints the five counts for the period, then the top trades by volume with their own breakdown. Use it to answer the two questions that actually matter: which recipes people use, and which ones burn so often that nobody starts them twice.

In a menu

/blacksmith admin analytics gui [period]

Defaults to today. The same figures with the period switchable in-place.

One player's history

/blacksmith admin history <player> [limit]

Newest first. limit defaults to 10 and is capped at 50. Each line is the event type, the trade, the slot, who did it, and the time — which is the answer to "my legendary sword disappeared".

Export

/blacksmith admin export <csv|json> [today]

Writes today's events to a file in the plugin folder and prints the absolute path. CSV for a spreadsheet, JSON for anything else.

The export runs off the main thread and reports back when it lands, so it does not stall the server on a busy day.

The pending queue

/blacksmith admin queue list [player]
/blacksmith admin queue gui
/blacksmith admin queue cancel <player> <slot> [refund|no-refund]
/blacksmith admin queue complete <player> <slot>

The live view of what is running, and the tools to intervene. cancel refunds by default; pass no-refund to take the materials.

A refund the player cannot receive — offline, full inventory — becomes a row in pending_refunds and is delivered on their next login. REFUND_PENDING then REFUND_DELIVERED in the event log is the normal, healthy sequence, not an error.

A command reward is not refundable

refundComplete on an event records whether everything could be returned. A trade whose reward ran commands, or whose requirement was consumed by a hook that has since been disabled, cannot be made whole. Check that flag before telling a player they got everything back.

Placeholders

%uxmblacksmith_analytics_today_started%
%uxmblacksmith_analytics_today_completed%
%uxmblacksmith_analytics_today_burned%
%uxmblacksmith_analytics_today_cancelled%
%uxmblacksmith_analytics_today_failed%

Server-wide, cached, safe on a scoreboard.

Retention

Nothing prunes trade_events or progression_events. On a busy server they grow steadily. They are indexed by player, trade and timestamp, so queries stay fast, but the file does not shrink — plan a periodic archive if you run for years.