- **Fixed** Sales history spamming `Item not found for log ID` warnings in console - logs migrated from V3 are created with `item_id = 0` (no direct mapping to V4 items), causing the history service to log a warning for every V3 entry. The history now filters out logs with invalid item references at the SQL level
- **Added** History configuration in `config.yml` - `history.max-entries` limits the number of history entries displayed per player (default: 500, 0 = unlimited), `history.expire-after-days` hides entries older than the specified number of days (default: 0 = never expire). Useful for servers with large transaction volumes to reduce database load and improve history loading times
- **Added** Admin log management commands - `/ah admin logs purge <days>` deletes all logs older than the specified number of days, `/ah admin logs player <player>` deletes all logs for a specific player, `/ah admin logs clear-migrated` deletes all V3 migrated logs (entries with `item_id = 0`). All operations run asynchronously and report the number of deleted entries
- **Fixed** Ghost items in `/ah selling` on multi-server (Redis) setups - when a player removed a selling item on server #1 and switched to server #2, the item could still appear with "being purchased" lore and could not be removed, blocking selling slots. Three fixes applied: (1) `ItemRemovedListener` now removes the item from in-memory storage immediately on message receipt instead of waiting for an async DB query, (2) `RemoveService` no longer restores the item status via Redis when the local removal already completed (preventing ghost items from reappearing as AVAILABLE on other servers after a cluster notification timeout), (3) `getPlayerSellingItems` now filters out items with `DELETED` status as defense-in-depth
- **Changed** Discord webhook `%expires_at%` placeholder now outputs a Discord [dynamic timestamp](https://discord.com/developers/docs/reference#message-formatting-timestamp-styles) (`<t:unix_seconds:f>`) instead of a pre-formatted date string. Discord renders it in each viewer's own local timezone (e.g. `12 June 2026 18:55`), making it easier to read and timezone-agnostic. Items with no expiration still fall back to the formatted date
- **Added** Per-item custom images for Discord webhooks - a new `custom-images` section in `discord.yml` lets you override the `%item_image_url%` for specific items. Each entry pairs a `rule` (same format as `categories.yml`/`rules.yml`: `material`, `name`, `lore`, `custom-model-data`, `oraxen`, `itemsadder`, `nexo`, `mmoitems`, etc.) with an image URL. The first matching rule wins; items matching no rule fall back to the material-based `item-image-url` pattern. Ideal for custom items whose generic material does not represent the real item. Dominant color extraction caches the color per image URL so custom items sharing a material no longer collide
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }