Noxie is not a neutral bot. Every response — hunt results, cooldown messages, donation confirmations, errors — passes through a personality engine that picks a tone based on the current context. The system lives inDocumentation 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.
utils/personality.py and exposes three public functions: active_tone(), get_line(), and vibe_status(). Tone shifts are entirely stateless and derived at call time from two numeric inputs: the user’s hunt streak and a floating-point luck value.
The Four Tones
| Tone | Triggers | Character |
|---|---|---|
| Deadpan | Default state, low streak | Dry, flat delivery. Acknowledges events without emotion. |
| Cozy | High luck rolls, warm events | Warm and gentle. Uses exclamation marks, heart emojis, and soft reassurances. |
| Chaotic | Long streaks (15+), rare finds | Wild and unhinged. All-caps outbursts, rhetorical questions, barely contained energy. |
| Sarcastic | Low luck, empty inventory | Sardonic and dismissive. Technically responds but makes you feel slightly judged. |
How Tone Is Determined
Tone is derived byactive_tone(streak, luck) in utils/personality.py:
luck value used in the hunt flow is computed directly from the streak:
1.0, which is well above the 0.85 cozy threshold — but the streak >= 15 chaotic check fires first, so a long streak always resolves to chaotic regardless.
The rarity of the caught creature provides an independent luck signal:
get_line() is called after a hunt, the rarity luck value is passed in directly, letting a mythic catch push toward cozy even when the streak is low.
Getting Personality Lines
get_line(event, streak, luck) returns one context-appropriate string from a pre-written bank of lines in the LINES dict:
!!, ?, OH). Low luck or a fresh start biases away from them. If neither filter produces results, the function falls back to a fully random pick from the pool, so every event always returns something.
Event Keys
| Event Key | When It Fires |
|---|---|
hunt_success | Successful hunt (common, uncommon, rare) |
hunt_rare | Successful hunt (epic, legendary, mythic) |
hunt_fail | Hunt failure; also used for the empty-inventory banner |
cooldown | Hunt attempted while on cooldown |
error | Unhandled exception in a command |
inventory_empty | /inventory called with no caught creatures |
donate_thanks | Donation confirmed via OxaPay webhook |
greeting | Bot joins a new server |
profile_low_level | /profile on a user with very few hunts |
To add new event keys, append an entry to the
LINES dict in utils/personality.py and call personality.get_line("your_event_key") wherever you want the line to appear. No other changes are needed.Vibe Status
vibe_status(streak, luck) wraps active_tone() and returns a human-readable status string displayed on the /vibe and /profile commands:
How Personality Affects CV2 Containers
The personality line is the last piece assembled before a CV2 container is sent. Incogs/hunt.py the call chain is:
line string is rendered in italics at the bottom of the hunt card, just above the mood banner:
| Container | Line event used |
|---|---|
| Hunt result | hunt_success or hunt_rare |
| Cooldown response | cooldown |
| Error response | error |
| Empty inventory | inventory_empty |
| Vibe card | hunt_success (with live streak/luck) |
| Donation confirmation | donate_thanks |
| Guild join | greeting |
streak and luck context that shapes the line also drives which face image the face_manager picks for the container.