o
    /Iojc	                     @  s   U 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mZ eej	
ddZi Zded< d#ddZd$ddZd%ddZd&ddZd'ddZd(ddZd)ddZd*d!d"ZdS )+u#  通用个人设置存储层（绑定 QQ 号，bot 与 web 双进程共用）。

每用户一个 JSON 文件：server_data/user_settings/<user_id>.json
文件不存在 = 全默认值。各功能自行约定键名，深合并写入。

原子写（tmp + os.replace）防止出现写了一半的文件；每用户进程内锁
防止同进程并发读改写丢失更新；跨进程并发未加锁——写频率可忽略，属可接受风险。

已约定键：
    privacy.char_public: bool  是否允许他人查看我的角色卡（缺省 True）
    )annotationsN)PathBOTERO_USER_SETTINGS_ROOTzserver_data/user_settingszdict[str, threading.Lock]_LOCKSreturnthreading.Lockc                 C  s   t t| t S N)r   
setdefaultstr	threadingLockuser_id r   //home/dore/onebot/Bot_Ero/core/user_settings.py	_lock_for   s   r   r   c                 C  s*   t |  }| std| t| S )Nu   非法用户 ID: )r
   stripisdigit
ValueErrorSETTINGS_ROOT)r   uidr   r   r   _settings_path   s   r   pathdictc              	   C  s>   |   si S z
t| jddW S  ttjfy   i  Y S w )Nutf-8encoding)is_filejsonloads	read_textOSErrorJSONDecodeError)r   r   r   r   _read&   s   r#   dataNonec                 C  sZ   | j jddd | j d| j dt j d }|jtj|ddddd	 t	
||  d S )
NT)parentsexist_ok.z.tmpF   )ensure_asciiindentr   r   )parentmkdirnameuuiduuid4hex
write_textr   dumpsosreplace)r   r$   tmpr   r   r   _write/   s    r7   basepatchc                 C  sT   t | }| D ]\}}t|t r#t||t r#t|| |||< q|||< q|S r   )r   items
isinstanceget_deep_merge)r8   r9   outkeyvaluer   r   r   r=   6   s   
r=   c                 C  s   t t| S r   )r#   r   r   r   r   r   get_settings@   s   rA   c                 C  sN   t | }t|  tt||}t|| W d    |S 1 s w   Y  |S r   )r   r   r=   r#   r7   )r   r9   r   mergedr   r   r   update_settingsD   s   

rC   boolc                 C  s   t t| di ddS )Nprivacychar_publicT)rD   rA   r<   r   r   r   r   privacy_publicL   s   rG   )r   r   )r   r   )r   r   r   r   )r   r   r$   r   r   r%   )r8   r   r9   r   r   r   )r   r   )r9   r   r   r   )r   rD   )__doc__
__future__r   r   r4   r   r/   pathlibr   environr<   r   r   __annotations__r   r   r#   r7   r=   rA   rC   rG   r   r   r   r   <module>   s"    



	



