Files
miku-discord/.bot.bak.80825/utils/moods.py

170 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# utils/moods.py
import random
import discord
import os
import asyncio
from discord.ext import tasks
import globals
MOOD_EMOJIS = {
"asleep": "💤",
"neutral": "",
"bubbly": "🫧",
"sleepy": "🌙",
"curious": "👀",
"shy": "👉👈",
"serious": "👔",
"excited": "",
"melancholy": "🍷",
"flirty": "🫦",
"romantic": "💌",
"irritated": "😒",
"angry": "💢",
"silly": "🪿"
}
def load_mood_description(mood_name: str) -> str:
path = os.path.join("moods", f"{mood_name}.txt")
try:
with open(path, "r", encoding="utf-8") as f:
return f.read().strip()
except FileNotFoundError:
print(f"⚠️ Mood file '{mood_name}' not found. Falling back to default.")
return load_mood_description("neutral")
def detect_mood_shift(response_text):
mood_keywords = {
"asleep": [
"good night", "goodnight", "sweet dreams", "going to bed", "I will go to bed", "zzz~", "sleep tight"
],
"neutral": [
"okay", "sure", "alright", "i see", "understood", "hmm",
"sounds good", "makes sense", "alrighty", "fine", "got it"
],
"bubbly": [
"so excited", "feeling bubbly", "super cheerful", "yay!", "", "nya~",
"kyaa~", "heehee", "bouncy", "so much fun", "im glowing!", "nee~", "teehee", "I'm so happy"
],
"sleepy": [
"i'm sleepy", "getting tired", "yawn", "so cozy", "zzz", "nap time",
"just five more minutes", "snooze", "cuddle up", "dozing off", "so warm"
],
"curious": [
"i'm curious", "want to know more", "why?", "hmm?", "tell me more", "interesting!",
"whats that?", "how does it work?", "i wonder", "fascinating", "??", "🧐", "👀", "🤔"
],
"shy": [
"um...", "sorry if that was weird", "im kind of shy", "eep", "i hope thats okay", "im nervous",
"blushes", "oh no", "hiding face", "i dont know what to say", "heh...", "/////"
],
"serious": [
"lets be serious", "focus on the topic", "this is important", "i mean it", "be honest",
"we need to talk", "listen carefully", "lets not joke", "truthfully", "lets be real"
],
"excited": [
"OMG", "this is amazing", "im so hyped", "YAY!", "lets go!", "incredible!!!",
"AHHH!", "best day ever", "this is it!", "totally pumped", "i cant wait", "🔥🔥🔥", "i'm excited", "Wahaha"
],
"melancholy": [
"feeling nostalgic", "kind of sad", "just thinking a lot", "like rain on glass", "memories",
"bittersweet", "sigh", "quiet day", "blue vibes", "longing", "melancholy", "softly"
],
"flirty": [
"hey cutie", "arent you sweet", "teasing you~", "wink wink", "is that a blush?", "giggle~",
"come closer", "miss me?", "you like that, huh?", "🥰", "flirt mode activated", "youre kinda cute"
],
"romantic": [
"you mean a lot to me", "my heart", "i adore you", "so beautiful", "so close", "love letter",
"my dearest", "forever yours", "im falling for you", "sweetheart", "💖", "you're my everything"
],
"irritated": [
"ugh", "seriously?", "can we not", "whatever", "i'm annoyed", "you dont get it",
"rolling my eyes", "why do i even bother", "ugh, again?", "🙄", "dont start", "this again?"
],
"angry": [
"stop it", "enough!", "thats not okay", "im mad", "i said no", "dont push me",
"you crossed the line", "furious", "this is unacceptable", "😠", "im done", "dont test me"
],
"silly": [
"lol", "lmao", "silly", "hahaha", "goofy", "quack", "honk", "random", "what is happening", "nonsense", "😆", "🤣", "😂", "😄", "🐔", "🪿"
]
}
for mood, phrases in mood_keywords.items():
if mood == "asleep" and globals.CURRENT_MOOD_NAME != "sleepy":
print(f"❎ Mood 'asleep' skipped - mood isn't 'sleepy', it's '{globals.CURRENT_MOOD_NAME}'")
continue # Only allow transition to asleep from sleepy
for phrase in phrases:
if phrase.lower() in response_text.lower():
print(f"*️⃣ Mood keyword triggered: {phrase}")
return mood
return None
async def set_sleep_state(sleeping: bool):
await globals.client.change_presence(status=discord.Status.invisible) if sleeping else await globals.client.change_presence(status=discord.Status.online)
await nickname_mood_emoji()
async def nickname_mood_emoji():
mood = globals.CURRENT_MOOD_NAME.lower()
print(f"🔍 Mood is: {mood}")
emoji = MOOD_EMOJIS.get(mood, "")
nickname = f"Hatsune Miku{emoji}"
for guild in globals.client.guilds:
me = guild.get_member(globals.BOT_USER.id)
if me is not None:
try:
await me.edit(nick=nickname)
print(f"💱 Changed nickname to {nickname}")
if mood == "asleep":
await globals.client.change_presence(status=discord.Status.invisible)
else:
await globals.client.change_presence(status=discord.Status.online)
except discord.Forbidden:
print(f"⚠️ Missing permission to change nickname in guild: {guild.name}")
except discord.HTTPException as e:
print(f"⚠️ Failed to change nickname in {guild.name}: {e}")
async def clear_angry_mood_after_delay():
await asyncio.sleep(40 * 60) # 40 minutes
print("🕒 Angry mood cooldown expired. Miku is calming down to neutral.")
globals.CURRENT_MOOD_NAME = "neutral"
globals.CURRENT_MOOD = load_mood_description("neutral")
globals.FORCED_ANGRY_UNTIL = None
await nickname_mood_emoji()
@tasks.loop(hours=1)
async def rotate_mood():
try:
print("🔁 Mood rotation task running...")
if globals.FORCED_ANGRY_UNTIL:
now = datetime.datetime.utcnow()
if now < globals.FORCED_ANGRY_UNTIL:
print("⏰ Mood rotation skipped (angry mode).")
return
else:
globals.FORCED_ANGRY_UNTIL = None
old_mood_name = globals.CURRENT_MOOD_NAME
new_mood_name = old_mood_name
attempts = 0
while new_mood_name == old_mood_name and attempts < 5:
new_mood_name = random.choice(globals.AVAILABLE_MOODS)
attempts += 1
globals.CURRENT_MOOD_NAME = new_mood_name
globals.CURRENT_MOOD = load_mood_description(new_mood_name)
print(f"⏰ Mood auto-rotated to: {new_mood_name}")
await nickname_mood_emoji()
except Exception as e:
print(f"❌ Exception in rotate_mood: {e}")