Files
miku-discord/readmes/PROFILE_PICTURE_FEATURE.md

5.6 KiB

Profile Picture Update Feature

Overview

Miku can now autonomously update her Discord profile picture by searching for Hatsune Miku artwork on Danbooru and intelligently cropping it for profile use.

How It Works

1. Autonomous Trigger

  • Miku's autonomous engine can decide to update her profile picture once per day
  • The decision is influenced by:
    • Time since last update: Must be at least 24 hours
    • Current mood: More likely in creative moods (bubbly, excited, curious, flirty, romantic, silly)
    • Server activity: Prefers quiet times (< 5 messages in past hour)
    • Cooldown: At least 30 minutes since last autonomous action
    • Impulsiveness: Based on current mood's impulsiveness trait

When triggered, Miku searches Danbooru with the following criteria:

  • Tags: hatsune_miku solo rating:g,s score:>10
    • solo: Single character for better profile pictures
    • rating:g,s: General and Sensitive ratings only (SFW content)
    • score:>10: Quality filter to get well-received artwork
  • Mood-based tags: Additional tags based on current mood
    • bubbly/happy/excited → adds "smile happy"
    • sleepy/asleep → adds "closed_eyes sleepy"
    • serious → adds "serious"
    • melancholy → adds "sad"
    • flirty → adds "smile wink"
    • romantic → adds "heart blush"
    • shy → adds "blush embarrassed"
    • angry/irritated → adds "angry frown"

3. Image Filtering

Posts are filtered for suitability:

  • Must be JPG or PNG format (no videos/GIFs)
  • Minimum 300x300 pixels
  • Aspect ratio between 0.7 and 1.5 (portrait or square)
  • Not used in the last 100 profile updates
  • Must have a valid file URL

4. Intelligent Cropping

The selected image is cropped using smart algorithms:

Portrait Images (taller than wide):

  • Crops a square from the upper portion (top 60%)
  • Centers horizontally
  • Starts 10% from top to avoid cutting off the head

Landscape Images (wider than tall):

  • Crops a centered square

Square Images:

  • Uses the full image

The cropped image is then resized to 512x512 pixels (Discord's recommended size) using high-quality LANCZOS resampling.

5. Announcement

When successful, Miku announces the change in her autonomous channel with messages like:

  • "updates profile picture What do you think? Does it suit me?"
  • "I found a new look! twirls Do you like it? 💚"
  • "changes profile picture Felt like switching things up today~ "
  • "New profile pic! I thought this one was really cute 💚"
  • "updates avatar Time for a fresh look! "

Files Modified/Created

New Files

  1. bot/utils/profile_picture_manager.py
    • Core functionality for searching, downloading, and cropping images
    • State management to track last update time and used posts
    • Danbooru API integration

Modified Files

  1. bot/utils/autonomous_v1_legacy.py

    • Added miku_update_profile_picture_for_server() function
  2. bot/utils/autonomous.py

    • Added "update_profile" action type to autonomous_tick_v2()
    • Imports the new profile picture function
  3. bot/utils/autonomous_engine.py

    • Added _should_update_profile() decision method
    • Integrated profile picture update into the decision flow
  4. bot/commands/actions.py

    • Added update_profile_picture() function for manual testing

State File

  • bot/memory/profile_picture_state.json
    • Tracks last update timestamp
    • Stores list of recently used post IDs (last 100)

Rate Limits

Discord Limits

  • Discord allows ~2 profile picture changes per 10 minutes globally
  • Our implementation: Maximum 1 change per 24 hours
  • This conservative limit prevents any rate limit issues

Danbooru Limits

  • No authentication required for basic searches
  • Rate limit: ~1 request per second
  • Our usage: 1 search request per 24+ hours (well within limits)

Manual Testing

To manually trigger a profile picture update (for testing):

# In bot code or via command:
from commands.actions import update_profile_picture

# Update with current mood
success = await update_profile_picture()

# Update with specific mood
success = await update_profile_picture(mood="excited")

Dependencies

Already included in requirements.txt:

  • aiohttp - For async HTTP requests to Danbooru
  • Pillow - For image processing and cropping
  • discord.py - For updating the bot's avatar

No additional dependencies needed!

Potential Enhancements

Future improvements could include:

  1. Artist attribution: Store and display artist information
  2. User voting: Let server members vote on profile pictures
  3. Seasonal themes: Special searches for holidays/events
  4. Custom image sources: Support for other art platforms
  5. Advanced face detection: Use OpenCV or face_recognition library for better cropping
  6. Vision model validation: Use MiniCPM-V to verify the crop looks good before applying

Safety & Ethics

  • Only searches SFW content (general/sensitive ratings)
  • Respects Danbooru's terms of service
  • Conservatively rate-limited to avoid abuse
  • ⚠️ Uses publicly available artwork (consider attribution in future)
  • Maintains history to avoid repeating same images

Testing Checklist

  • Verify profile picture updates successfully
  • Check cropping quality on various image types
  • Confirm mood-based tag selection works
  • Test rate limiting (shouldn't update if < 24 hours)
  • Verify announcement messages appear
  • Check state persistence across bot restarts
  • Confirm Danbooru API responses are handled correctly
  • Test failure cases (network errors, invalid images, etc.)