a
    w^iÀ>  ã                   @   sv   d Z ddlZddlZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Zddd„Z	dd„ Z
ddd„Zdd„ Zdd„ ZdS )a,  
Messaging Style System

This module provides dynamic, personality-driven messaging styles for NPC conversations.
Characters have base messaging traits that are modified per-relationship and by mood states.

See docs/plans/2025-11-13-dynamic-messaging-styles-design.md for full design documentation.
é    Nc                   C   sV   t  dd¡t  dd¡t  dd¡t  dd¡t  dd¡t  dd¡t  dd¡t  dd	¡d
œS )z„
    Generate random base messaging traits for a new character.

    Returns:
        dict: Base messaging traits (0-100 scale)
    é   éF   é   éP   é(   é<   é
   éZ   éU   )Ú	verbosityÚinquisitivenessÚexpressivenessÚresponsivenessÚopennessÚemoji_usageÚ	formalityÚresponse_timing)ÚrandomÚrandint© r   r   ú0/var/www/lichun.app/lichun/ws/messaging_style.pyÚinitialize_messaging_traits   s    







ør   c                   C   s(   t  g d¢¡t  dd¡t  g d¢¡dœS )z—
    Generate random messaging patterns for a new character.

    Returns:
        dict: Messaging patterns (time preferences, typing style, etc.)
    )ÚmorningÚnightÚneutralr   r	   )ZproperÚcasualZchaotic)Ztime_of_day_preferenceZweekend_availabilityZtyping_style)r   Úchoicer   r   r   r   r   Úinitialize_messaging_patterns!   s    
ýr   c                 C   sÜ   dddddddddddœ
}|rØt |dƒrØ|jrØ|jd  ¡ }|dv rv|d  d7  < |d  d	8  < |d
  d8  < nb|dv r°|d  d	7  < |d  d7  < |d
  d7  < n(|dv rØ|d  d	8  < |d
  d7  < |S )aW  
    Initialize messaging modifiers for a new relationship.
    Can apply relationship-type-specific starting modifiers.

    Args:
        relationship: relationshipClass instance (optional)
        character: personClass instance (optional, needed for relationship-type modifiers)

    Returns:
        dict: Initial messaging modifiers
    r   r   )
r   r   r   r   r   r   r   r   Ú
mood_stateÚcurrent_topic_engagementÚrelationships)ÚbossÚteacherÚcoworkerr   r   r   é   r   r   )ÚpartnerZ
girlfriendZ	boyfriendZspouser   )ÚmotherÚfatherÚsiblingé   )Úhasattrr    Úlower)ÚrelationshipÚ	characterÚ	modifiersZprimary_relationshipr   r   r   Ú!initialize_relationship_modifiers/   s2    ór/   c           
      C   sª   t | dƒstƒ S | j}i }i }d}|rBt |dƒrB|j}| dd¡}| ¡ D ]Z}t| |d¡ttfƒrp| |d¡nd}t	| ||ƒ}|| | | }	t
dtd|	ƒƒ||< qJ|S )a6  
    Calculate final trait values: base + relationship modifier + mood modifier.

    Args:
        character: personClass instance with messaging_traits
        relationship: relationshipClass instance with messaging_modifiers (or None)

    Returns:
        dict: Effective trait values (0-100, clamped)
    Úmessaging_traitsr   Úmessaging_modifiersr   r   éd   )r*   r   r0   r1   ÚgetÚkeysÚ
isinstanceÚintÚfloatÚget_mood_modifierÚmaxÚmin)
r-   r,   ÚbaseÚ	effectiveZrel_modsr   ÚtraitZrelationship_modifierZmood_modifierZeffective_valuer   r   r   Úcalculate_effective_traitsc   s    
&r>   c                 C   sD   ddddddœddddddœd	dddd
œi dœ}|  |i ¡  |d¡S )a  
    Get temporary mood-based adjustment for a specific trait.

    Args:
        character: personClass instance
        mood_state: str - 'great', 'bad', 'stressed', or 'neutral'
        trait: str - trait name

    Returns:
        int: Modifier value (-50 to +50)
    r$   r   r   )r   r   r   r   r   éìÿÿÿéñÿÿÿéöÿÿÿ)r   r   r   r   r   éçÿÿÿ)r   r   r   r   )ÚgreatÚbadÚstressedr   r   )r3   )r-   r   r=   Zmood_effectsr   r   r   r8   ˆ   s(    ûûüër8   c                 C   sŽ  t | |ƒ}g }|d dk r&| d¡ n|d dkr<| d¡ |d dk rT| d¡ n|d dkrj| d¡ |d	 dk r‚| d
¡ n|d	 dkr˜| d¡ |d dk r°| d¡ n|d dkrÆ| d¡ |d dk rÞ| d¡ n|d dkrô| d¡ |d dk �r| d¡ nDd|d   k�r*dk �r:n n| d¡ n|d dk�rR| d¡ |d dk �rl| d¡ n|d dk�r„| d¡ d |¡S )a:  
    Generate natural language style instructions for AI prompt based on calculated traits.

    Args:
        character: personClass instance
        relationship: relationshipClass instance (or None)
        player: playerClass instance

    Returns:
        str: Natural language instructions for AI prompt
    r   r   zQKeep responses extremely brief - 1-2 short sentences max, often just a few words.r   zQYou tend to ramble and share lots of details. Don't hold back - elaborate freely.r   zPYou rarely ask questions. Just respond without pushing the conversation forward.zXYou're naturally curious - frequently ask follow-up questions and show genuine interest.r   z=Keep tone neutral and understated. No excitement or emphasis.zTBe animated and enthusiastic! Use exclamation marks, show excitement, be expressive.r   zKGive minimal effort responses. Don't build on topics or match their energy.zKEngage fully with what they say. Build on their points, match their energy.r   zDStay surface-level. Avoid sharing personal details or deep thoughts.zXFeel free to share personal details, thoughts, and feelings openly - even TMI sometimes.r   r   zNever use emojis.r   z9Use an emoji occasionally when it fits (0-1 per message).zNUse emojis frequently to express yourself (2-4 per message is normal for you).r   zMText casually - lowercase, abbreviations (lol, idk, ur), minimal punctuation.zQUse proper grammar, spelling, and punctuation. Text like you're writing an email.Ú )r>   ÚappendÚjoin)r-   r,   ÚplayerÚeffective_traitsÚinstructionsr   r   r   Úget_messaging_style_prompt¯   sB    





 

rL   c                 C   sn  | rt | dƒsdS tdtd|ƒƒ}|dkrb| jd  d7  < | jd  d7  < | jd	  d7  < nR|d
kr¢| jd	  d8  < | jd  d8  < | jd  d8  < n| jd	  d7  < |dkrò| jd  d7  < | jd  d8  < | jd  d7  < |dk�r | jd  d8  < | jd  d7  < || jd< | jD ]8}t| j| ttfƒ�r0tdtd| j| ƒƒ| j|< �q0dS )a   
    Update messaging modifiers based on conversation dynamics.
    Called after each AI response to evolve the relationship's messaging style.

    Args:
        relationship: relationshipClass instance
        sentiment: str - 'positive', 'negative', or 'neutral'
        conversation_length: int - total messages in conversation
        topic_engagement: int - optional, -30 to +30 for current topic interest
    r1   Néâÿÿÿr   Úpositiver   é   r   r   Únegativeé   é   ç      à?r   r   r   é2   r   éØÿÿÿr   )r*   r9   r:   r1   r5   r6   r7   )r,   Ú	sentimentÚconversation_lengthZtopic_engagementÚkeyr   r   r   Ú'update_conversation_messaging_modifiersí   s.    


rY   c                 C   s„   ddl }| t¡}h d£}||vr8| d|› d�¡ d}ddlm} ||| jƒ}|r€t|dƒr€||jd	< t	d
| j
› d|› d�ƒ dS )a  
    Set character's mood state across all their relationships.
    Mood affects all conversations with this character.

    Args:
        character: personClass instance
        player: playerClass instance
        mood: str - 'great', 'bad', 'stressed', or 'neutral'
    r   N>   r   rC   rE   rD   zInvalid mood state 'z', defaulting to 'neutral'r   )Úget_relationshipr1   r   zSet z's mood to 'ú')ÚloggingÚ	getLoggerÚ__name__ÚwarningÚ	functionsrZ   Úidr*   r1   ÚprintÚ	firstname)r-   rI   Úmoodr\   ÚloggerZVALID_MOODSrZ   r,   r   r   r   Úset_mood_state#  s    


rf   çš™™™™™¹?c                 C   sj   t | dƒsdS | jD ]P}t| j| ttfƒr| j| }|d|  | j|< t| j| ƒdk rd| j|< qdS )a  
    Gradually return messaging modifiers toward neutral (0).
    Called periodically (weekly recommended) to prevent permanent extremes.

    Args:
        relationship: relationshipClass instance
        decay_rate: float - how much to decay (0.1 = 10% toward 0 each call)
    r1   NrO   rS   r   )r*   r1   r5   r6   r7   Úabs)r,   Z
decay_rater=   Úcurrentr   r   r   Údecay_messaging_modifiers?  s    	


rj   c              
   C   s*  ddl }| t¡}| r t| dƒs$dS dddddœddd	d
dœdddddœd
ddddœddiddiddddœdddœdœ}||vr–| d|› d�¡ dS || }| ¡ D ].\}}|dkrÂ|| j|< q¦| j|  |7  < q¦| jD ]4}t| j| tt	fƒrÜt
dtd| j| ƒƒ| j|< qÜtd|› d|› �ƒ dS )zÇ
    Apply messaging modifier changes for major relationship/life events.

    Args:
        relationship: relationshipClass instance
        event_type: str - type of event triggering modifiers
    r   Nr1   r$   r   )r   r   r   r   rU   rM   r?   rB   )r   r   r   r   r   r@   )r   r   r   r   rA   r)   )r   r   r   r   r   rC   rE   rD   )r   r   r   )r   r   )Ústart_datingÚbreakupZbecome_best_friendsZmajor_fightZgot_promotedZlost_jobZparent_diedZhad_babyzUnknown event type 'z' for messaging modifiersr   z	Applied 'z' messaging modifiers: )r\   r]   r^   r*   r_   Úitemsr1   r5   r6   r7   r9   r:   rb   )r,   Ú
event_typer\   re   Zevent_effectsZeffectsrX   Úvaluer   r   r   Úapply_event_modifiersW  s`    
üüüü	ÿÿýþÙ-
rp   c              	   C   sn   t | dƒr| jni }|r(t |dƒr(|jni }t| |ƒ}| j› d| j› �||||r\| dd¡ndt| |dƒdœS )a  
    Get detailed debug information about a character's messaging style.
    Useful for testing and debugging.

    Args:
        character: personClass instance
        relationship: relationshipClass instance (or None)

    Returns:
        dict: Debug information
    r0   r1   rF   r   r   N)Zcharacter_nameZbase_traitsZrelationship_modifiersrJ   r   Zprompt_instructions)r*   r0   r1   r>   rc   Úlastnamer3   rL   )r-   r,   r;   Zmodsr<   r   r   r   Úget_debug_messaging_info¥  s    

úrr   )NN)r   )rg   )Ú__doc__r   Újsonr   r   r/   r>   r8   rL   rY   rf   rj   rp   rr   r   r   r   r   Ú<module>   s   	
4%'>
6
N