§
    z¶»je  ã                  ó0  — d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZ ddlmZmZ ddlmZ  G d„ dej        ¦  «        Z ed	¬
¦  «         G d„ d¦  «        ¦   «         Z ed	d	¬¦  «         G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )z‘
Character management service for FreeExile.
Handles Level 1 character creation from scratch, season binding, and starting home zone assignment.
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional)Ú	dataclassÚfield)ÚDatabaseAccountRepositoryc                  ó   — e Zd ZdZdZdZdZdS )ÚCharacterClassÚsword_masterÚferal_berserkerÚwild_archerÚ
bone_hexerN)Ú__name__Ú
__module__Ú__qualname__ÚSWORD_MASTERÚFERAL_BERSERKERÚWILD_ARCHERÚ
BONE_HEXER© ó    ú6C:\Projects\FreeExile\server\auth\character_service.pyr   r      s"   € € € € € Ø!€LØ'€OØ€KØ€J€J€Jr   r   T)Úslotsc                  ó  — e Zd ZU dZded<   ded<   ded<   ded<   dZd	ed
<   dZded<   dZd	ed<   dZd	ed<   dZ	d	ed<   dZ
d	ed<   dZd	ed<   dZded<   dZded<   dZded<   dZded<    eej        ¬¦  «        Zded<   d S )!Ú	Characterz*Core player character entity in FreeExile.ÚstrÚcharacter_idÚ
account_idÚnamer   Ú
class_typeé   ÚintÚlevelÚseason_01_minh_nguyetÚ	season_idr   Ú
experienceéd   Ú
current_hpÚmax_hpé2   Úcurrent_manaÚmax_manaÚzone_boundless_sanctuaryÚcurrent_zone_idç        ÚfloatÚpos_xç      $@Úpos_yz[]Úinventory_json)Údefault_factoryÚ
created_atN)r   r   r   Ú__doc__Ú__annotations__r%   r'   r(   r*   r+   r-   r.   r0   r3   r5   r6   r	   Útimer8   r   r   r   r   r      s  € € € € € € à4Ð4ØÐÐÑØ€O€O�OØ€I€I�IØÐÐÑØ€E€N€N€N�NØ,€IÐ,Ð,Ð,Ñ,Ø€JÐÐÐÑØ€JÐÐÐÑØ€FÐÐÐÑØ€LÐÐÐÑØ€HÐÐÐÑØ5€OÐ5Ð5Ð5Ñ5Ø€EÐÐÐÑØ€EÐÐÐÑØ€NÐÐÐÑØ˜¨d¬iÐ8Ñ8Ô8€JÐ8Ð8Ð8Ñ8Ð8Ð8r   r   )r   Úfrozenc                  ó6   — e Zd ZU dZded<   ded<   dZded<   dS )	ÚCharacterCreationResultzResult of character creation.ÚboolÚsuccessr   ÚmessageNúOptional[Character]Ú	character)r   r   r   r9   r:   rC   r   r   r   r>   r>   .   s;   € € € € € € à'Ð'Ø€M€M�MØ€L€L�LØ%)€IÐ)Ð)Ð)Ñ)Ð)Ð)r   r>   c                  ór   — e Zd ZdZ ej        dej        ¦  «        Zdd„Zdd„Z		 dd d„Z
d!d„Zd"d„Zd#d„ZdS )$ÚCharacterServicezKManages character creation, listing, season binding, and starting location.z^[\w\s\u00C0-\u1EF9]{3,24}$Ú
repositoryr
   ÚreturnÚNonec                ó   — || _         d S )N)rF   )ÚselfrF   s     r   Ú__init__zCharacterService.__init__;   s   € Ø$ˆŒˆˆr   Úrowr   r   c           	     óP  — t          di d|d         “d|d         “d|d         “dt          |d         ¦  «        “d|d         “d|d         “d|d         “d|d         “d	|d	         “d
|d
         “d|d         “d|d         “d|d         “d|d         “d|d         “d|d         “ŽS )Nr   r    r!   r"   r%   r'   r(   r*   r+   r-   r.   r0   r3   r5   r6   r8   r   )r   r   )rJ   rL   s     r   Ú_row_to_characterz"CharacterService._row_to_character>   s3  € Ýð 
ð 
ð 
Ø˜^Ô,Ð,ð
à˜<Ô(Ð(ð
ð �V”�ð
õ & c¨,Ô&7Ñ8Ô8Ð8ð	
ð
 �g”,�,ð
ð ˜+Ô&Ð&ð
ð ˜<Ô(Ð(ð
ð ˜<Ô(Ð(ð
ð �x”=�=ð
ð ˜^Ô,Ð,ð
ð ˜”_�_ð
ð  Ð 1Ô2Ð2ð
ð �g”,�,ð
ð �g”,�,ð
ð Ð/Ô0Ð0ð
ð  ˜<Ô(Ð(ð!
ð 	
r   r&   r    r   r!   r"   r   r'   r>   c                ó   — |                      ¦   «         }| j                             |¦  «        st          dd¬¦  «        S | j                             |¦  «        }|st          dd¬¦  «        S | j                             ¦   «         5 }|                     d|                     ¦   «         f¦  «        }| 	                    ¦   «         r!t          dd|› d�¬¦  «        cddd¦  «         S 	 ddd¦  «         n# 1 swxY w Y   d	t          j        ¦   «         j        dd
…         › �}	t          j        ¦   «         }
d}d\  }}ddddœddddœg}t          j        |¦  «        }| j                             ¦   «         5 }|                     d|	|||j        ||||||
f
¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   t%          d*i d|	“d|“d|“d|“dd“d|“dd“dd“dd“dd “d!d “d"|“d#|“d$|“d%|“d&|
“Ž}t          d'd(|¬)¦  «        S )+zGCreate a new Level 1 character bound to active season and starting map.FzSCharacter name must be between 3 and 24 characters with valid alphanumeric letters.)r@   rA   zAccount does not exist.z9SELECT character_id FROM characters WHERE LOWER(name) = ?zCharacter name 'z*' is already taken. Please choose another.NÚchar_é   r/   )r1   r4   Úwpn_novice_bone_bladeÚ	main_handr#   )Úitem_idÚslotÚquantityÚarmor_coarse_tunicÚchestav  
                INSERT INTO characters (
                    character_id, account_id, name, class_type, level, season_id,
                    experience, current_hp, max_hp, current_mana, max_mana,
                    current_zone_id, pos_x, pos_y, inventory_json, created_at
                ) VALUES (?, ?, ?, ?, 1, ?, 0, 100, 100, 50, 50, ?, ?, ?, ?, ?)
                r   r    r!   r"   r%   r'   r(   r   r*   r)   r+   r-   r,   r.   r0   r3   r5   r6   r8   Tz*Character created successfully at Level 1.)r@   rA   rC   r   )ÚstripÚ
NAME_REGEXÚmatchr>   rF   Ú	get_by_idÚ_get_connectionÚexecuteÚlowerÚfetchoneÚuuidÚuuid4Úhexr;   ÚjsonÚdumpsÚvalueÚcommitr   )rJ   r    r!   r"   r'   Úcleaned_nameÚaccountÚconnÚcurr   ÚnowÚstarting_zoneÚstart_xÚstart_yÚstarter_inventoryr6   rC   s                    r   Úcreate_characterz!CharacterService.create_characterR   sˆ  € ð —z’z‘|”|ˆð Œ×$Ò$ \Ñ2Ô2ð 	Ý*ØØmðñ ô ð ð ”/×+Ò+¨JÑ7Ô7ˆØð 	]Ý*°5ÐB[Ð\Ñ\Ô\Ð\ð Œ_×,Ò,Ñ.Ô.ð 	°$Ø—,’,ÐZÐ]i×]oÒ]oÑ]qÔ]qÐ\sÑtÔtˆCØ�|Š|‰~Œ~ð Ý.Ø!Øg¨|ÐgÐgÐgðñ ô ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ðð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 7�tœz™|œ|Ô/°°°Ô4Ð6Ð6ˆÝŒi‰kŒkˆð 3ˆØ$Ñˆ�ð 0¸ÐRSÐTÐTØ,°gÈ1ÐMÐMð
Ðõ œÐ$5Ñ6Ô6ˆàŒ_×,Ò,Ñ.Ô.ð 	°$Ø�LŠLðð !ØØ ØÔ$ØØ!ØØØ"Øðñô ð ð* �KŠK‰MŒMˆMð-	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ0 ð 
ð 
ð 
Ø%˜ð
à!�zð
ð �ð
ð "�zð	
ð
 �!ð
ð  �ið
ð �qð
ð �sð
ð �3ð
ð ˜ð
ð �Rð
ð *˜Mð
ð �'ð
ð �'ð
ð *˜>ð
ð  �sð!
ˆ	õ& 'ØØ@Øð
ñ 
ô 
ð 	
s%   ÂAC2Ã2C6Ã9C6Å3:F9Æ9F=Ç F=úList[Character]c                óØ   ‡ — ‰ j                              ¦   «         5 }|                     d|f¦  «        }ˆ fd„|                     ¦   «         D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z,List all characters belonging to an account.zESELECT * FROM characters WHERE account_id = ? ORDER BY created_at ASCc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   )rN   )Ú.0ÚrrJ   s     €r   ú
<listcomp>z4CharacterService.list_characters.<locals>.<listcomp>·   s'   ø€ ÐFÐFÐF°!�D×*Ò*¨1Ñ-Ô-ÐFÐFÐFr   N)rF   r]   r^   Úfetchall)rJ   r    rj   rk   s   `   r   Úlist_charactersz CharacterService.list_characters°   sÈ   ø€ àŒ_×,Ò,Ñ.Ô.ð 	G°$Ø—,’,ØWØ�ñô ˆCð GÐFÐFÐF°s·|²|±~´~ÐFÑFÔFð	Gð 	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gs   ›7AÁA#Á&A#r   rB   c                ó  — | j                              ¦   «         5 }|                     d|f¦  «        }|                     ¦   «         }|r!|                      |¦  «        cddd¦  «         S 	 ddd¦  «         n# 1 swxY w Y   dS )zFetch character by ID.z/SELECT * FROM characters WHERE character_id = ?N)rF   r]   r^   r`   rN   )rJ   r   rj   rk   rL   s        r   Úget_characterzCharacterService.get_character¹   sÚ   € àŒ_×,Ò,Ñ.Ô.ð 	3°$Ø—,’,ÐPÐS_ÐRaÑbÔbˆCØ—,’,‘.”.ˆCØð 3Ø×-Ò-¨cÑ2Ô2ð		3ð 	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð3ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð
 ˆts   šAA6Á6A:Á=A:r?   c                óÖ   — | j                              ¦   «         5 }|                     d||f¦  «        }|                     ¦   «          |j        dk    cddd¦  «         S # 1 swxY w Y   dS )z(Delete a character owned by the account.z@DELETE FROM characters WHERE character_id = ? AND account_id = ?r   N)rF   r]   r^   rg   Úrowcount)rJ   r   r    rj   rk   s        r   Údelete_characterz!CharacterService.delete_characterÂ   s®   € àŒ_×,Ò,Ñ.Ô.ð 	$°$Ø—,’,ØRØ˜zÐ*ñô ˆCð �KŠK‰MŒMˆMØ”< !Ò#ð	$ð 	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð 	$ð 	$s   š7AÁA"Á%A"N)rF   r
   rG   rH   )rL   r   rG   r   )r&   )
r    r   r!   r   r"   r   r'   r   rG   r>   )r    r   rG   rr   )r   r   rG   rB   )r   r   r    r   rG   r?   )r   r   r   r9   ÚreÚcompileÚUNICODErZ   rK   rN   rq   ry   r{   r~   r   r   r   rE   rE   6   s¼   € € € € € ØUÐUà�”Ð:¸B¼JÑGÔG€Jð%ð %ð %ð %ð
ð 
ð 
ð 
ð2 1ð\
ð \
ð \
ð \
ð \
ð|Gð Gð Gð Gðð ð ð ð$ð $ð $ð $ð $ð $r   rE   )r9   Ú
__future__r   Úenumrd   r   r;   ra   Útypingr   r   r   r   Údataclassesr   r	   Úserver.auth.databaser
   ÚEnumr   r   r>   rE   r   r   r   ú<module>rˆ      sŒ  ððð ð
 #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð �T”Yñ ô ð ð €�ÐÑÔð9ð 9ð 9ð 9ð 9ñ 9ô 9ñ Ôð9ð( €�˜dÐ#Ñ#Ô#ð*ð *ð *ð *ð *ñ *ô *ñ $Ô#ð*ðT$ð T$ð T$ð T$ð T$ñ T$ô T$ð T$ð T$ð T$r   