Noxie tracks seven earnable badges that recognize player milestones — from making a first donation to witnessing a mythic hunt. Badges are stored once per user regardless of which Discord server they were earned in, they appear automatically on theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/developer51709/Noxie/llms.txt
Use this file to discover all available pages before exploring further.
/profile card, and they can never be lost or reset. This page documents every badge, its internal ID, the exact trigger that awards it, and implementation details for developers extending the system.
All Badges
| Badge ID | Display Name | Requirement | How Awarded |
|---|---|---|---|
donor | 💎 Donor | Make a first successful donation | Auto-awarded inside the OxaPay confirmation flow |
hunter_10 | 🏹 Hunter I | Reach 10 total hunts | Auto-awarded during the hunt flow on the 10th hunt |
hunter_50 | 🏹 Hunter II | Reach 50 total hunts | Auto-awarded during the hunt flow on the 50th hunt |
hunter_100 | 🏹 Hunter III | Reach 100 total hunts | Auto-awarded during the hunt flow on the 100th hunt |
legendary | 🌟 Legendary Finder | Catch any Legendary creature | Auto-awarded on first legendary rarity drop |
mythic | 🌌 Mythic Witness | Catch any Mythic creature | Auto-awarded on first mythic rarity drop |
streak_25 | 🔥 Hot Streak | Maintain a 25-hunt streak | Defined and display-ready; award trigger reserved for future use |
How Badges Are Stored
Badges live in thebadges table in db/noxie.db (SQLite). The schema is:
UNIQUE(user_id, badge_name) constraint is what prevents duplicate awards — if award_badge() is called a second time for the same user and badge name, SQLite raises an IntegrityError that the function catches silently. Badges are stored by user_id only, with no guild_id column, making them cross-guild by design. A badge earned on one server is visible on /profile in every server.
The award_badge() Function
award_badge() in utils/economy.py is the single entry point for all badge grants:
award_badge() returns True, the badge is freshly awarded and the flow surfaces a confirmation message. When it returns False, the badge was already held and the flow skips the notification silently.
How Badges Display on /profile
get_badges() returns a list of badge_name strings ordered by awarded_at ASC. The profile renderer maps each string through the BADGE_DISPLAY dictionary defined in utils/economy.py to produce the emoji + label shown on the card:
badge_name not present in BADGE_DISPLAY is rendered as the raw ID string, so custom badges added to the database without a display entry will still appear — just without a friendly label.
Hunt Milestone Logic
The three Hunter badges share a single conditional block indo_hunt() inside cogs/hunt.py. After record_hunt() updates total_hunts, the block checks thresholds in descending order so a user who jumps straight to 100 hunts only triggers hunter_100, not all three at once:
legendary, mythic) are checked in the same function immediately after, using the rolled rarity string as the condition.