Skip to main content

Documentation 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.

Mood banners are the visual personality layer of every Noxie response. They are JPEG images of Noxie’s face in different emotional states — sleepy during cooldowns, love-struck after a legendary pull, full evil for a mythic catch. Banners live in the mood_banners/ directory, and the entire selection pipeline is handled by utils/face_manager.py, which maps events, rarities, and creature moods to the correct file path.

How Banners Work

Every CV2 container that carries a mood banner uses the same render pattern: a discord.ui.MediaGallery component placed at the bottom of the discord.ui.Container, after a hidden separator. The image is sent as a discord.File attachment, and the gallery references it via attachment://filename. The low-level helper in utils/cv2_helpers.py:
def _media(attachment_name: str) -> discord.ui.MediaGallery:
    return discord.ui.MediaGallery(
        discord.MediaGalleryItem(media=f"attachment://{attachment_name}")
    )
And the banner is appended to the container before it is sent:
if banner_path:
    banner_filename = f"banner_{rarity}.jpeg"
    container.add_item(_sep(visible=False))
    container.add_item(_media(banner_filename))
    files.append(_make_file(banner_path, banner_filename))
Banners are always sent as Discord File attachments. The attachment://filename URI in the MediaGallery must exactly match the filename argument passed to discord.File. Mismatches silently result in a broken image in the container.

All 14 Banners

File NameMood KeyUsed For
neutral.jpegneutralDefault state, common hunts
happy.jpeghappyPull success
evil.jpegevilMythic hunts, chaos reactions
dizzy.jpegdizzyErrors, donation failure
deadpan.jpegdeadpanSarcastic personality, pull failure
cozy.jpegcozyUncommon hunts, cozy tone
chaotic.jpegchaoticChaotic personality
sarcastic.jpegsarcasticSarcastic responses
carinha.jpegcarinhaSoft reactions
melancholy.jpegmelancholyHunt failures, sad events, guild leave
sleepy.jpegsleepyHunt cooldowns
excited.jpegexcitedEpic hunts, donation start
love.jpegloveLegendary hunts, donation confirmed, guild join
rare.jpegrareRare hunts
The mood_banner_path() function in utils/helpers.py holds the authoritative filename mapping and checks that the file actually exists on disk before returning a path:
def mood_banner_path(mood: str) -> str | None:
    banner_dir = ROOT / "mood_banners"
    mapping = {
        "neutral": "neutral.jpeg", "happy": "happy.jpeg",
        "evil": "evil.jpeg",       "dizzy": "dizzy.jpeg",
        "deadpan": "deadpan.jpeg", "cozy": "cozy.jpeg",
        "chaotic": "chaotic.jpeg", "sarcastic": "sarcastic.jpeg",
        "carinha": "carinha.jpeg", "melancholy": "melancholy.jpeg",
        "sleepy": "sleepy.jpeg",   "excited": "excited.jpeg",
        "love": "love.jpeg",       "rare": "rare.jpeg",
    }
    filename = mapping.get(mood)
    if filename:
        full = banner_dir / filename
        if full.exists():
            return str(full)
    return None

Rarity → Banner Mapping

When a hunt result is ready, face_manager.get_face_for_rarity(rarity) selects the default banner based on the rarity rolled. This mapping is defined in utils/helpers.py as RARITY_MOOD:
RarityMood KeyBanner File
commonneutralneutral.jpeg
uncommoncozycozy.jpeg
rarerarerare.jpeg
epicexcitedexcited.jpeg
legendarylovelove.jpeg
mythicevilevil.jpeg
RARITY_MOOD = {
    "common":    "neutral",
    "uncommon":  "cozy",
    "rare":      "rare",
    "epic":      "excited",
    "legendary": "love",
    "mythic":    "evil",
}

Event → Banner Mapping

For non-hunt contexts, face_manager.get_face_for_event(event) resolves the banner through the EVENT_MOOD dict in utils/face_manager.py:
Event KeyMood KeyBanner File
cooldownsleepysleepy.jpeg
errordizzydizzy.jpeg
guild_joinlovelove.jpeg
guild_leavemelancholymelancholy.jpeg
donate_startexcitedexcited.jpeg
donate_donelovelove.jpeg
donate_faildizzydizzy.jpeg
pull_successhappyhappy.jpeg
pull_faildeadpandeadpan.jpeg
hunt_failmelancholymelancholy.jpeg
reaction_uwulovelove.jpeg
reaction_evilevilevil.jpeg
reaction_cozycozycozy.jpeg
If an unknown event key is passed, get_face_for_event() falls back to neutral:
def get_face_for_event(event: str) -> str | None:
    mood = EVENT_MOOD.get(event, "neutral")
    return mood_banner_path(mood)

Creature Mood Override

During a hunt, the caught creature’s own mood can override the rarity-based banner. face_manager.get_face_for_creature_mood() maps creature moods through the mood_* event family:
Creature MoodEvent KeyBanner File
melancholymood_melancholymelancholy.jpeg
chaoticmood_chaoticchaotic.jpeg
cozymood_cozycozy.jpeg
neutralmood_neutralneutral.jpeg
sarcasticmood_sarcasticsarcastic.jpeg
The resolution order in cogs/hunt.py ensures the creature’s mood always takes priority:
banner_path = face_manager.get_face_for_rarity(rarity)
creature_mood_banner = face_manager.get_face_for_creature_mood(creature.get("mood", "neutral"))
final_banner = creature_mood_banner or banner_path
So catching a melancholy Gloomfox always shows the melancholy.jpeg banner — even though Gloomfox is common and the rarity default would be neutral.jpeg.

Adding a New Banner

  1. Drop the .jpeg file into mood_banners/.
  2. Add the mood key → filename entry to the mapping dict in utils/helpers.py::mood_banner_path().
  3. Add the event key → mood key entry to EVENT_MOOD in utils/face_manager.py (if the new mood will be triggered by an event).
  4. Call face_manager.get_face_for_event("your_event") wherever you want the banner to appear.
No schema changes or bot restarts beyond a normal reload are required.
The mood_banner_path() function checks that the file exists on disk and returns None if it doesn’t. A None banner path is safe — the container will render without a banner — but the missing file will go silently unnoticed. Verify filenames carefully when adding new assets.

Build docs developers (and LLMs) love