
    `gjR                       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 i 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	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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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*d+dd*d,d	d	d
dd-d.dd-d/d	d	d
dd0d1dd0d2d	d	d
dd3d4dd3d5d	d	d
dd6d7dd6d8d	d	d
dd9d:dd9d;d	d	d
di d<d=dd<d>d	d	d
dd?d@dd?dAd	d	d
ddBdCddBdDd	d	d
ddEdFddEdGd	d	d
ddHdIddHdJd	d	d
ddKdLddKdMd	d	d
ddNdOddNdPd	d	d
ddQdRddQdSd	d	d
ddTdUddTdVd	d	d
ddWdXddWdYd	d	d
ddZd[ddZd\d	d	d
dd]d^dd]d_d	d	d
dd`dadd`dbd	d	d
ddcddddcded	d	d
ddfdgddfdhd	d	d
ddidjddidkd	d	d
ddldmddldnd	d	d
di dodpddodqd	d	d
ddrdsddrdtd	d	d
ddudvddudwd	d	d
ddxdyddxdzd	d	d
dd{d|dd{d}d	d	d
dd~ddd~dd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
ddddddd	d	d
dddddd	d	d
dddddd	d	d
dddddd	d	d
dddddd	d	d
dddddd	d	d
dddddd	d	d
dddddd	d	d
dddddd	d	d
ddZ	de
d<   ddZdddZddZ ej                  d      ZddZddZddÄZddĄZddńZddƄZdddǄZ	 	 d	 	 	 	 	 	 	 ddȄZddɄZy)a  
Yuanbao sticker (TIMFaceElem) support.

Ported from yuanbao-openclaw-plugin/src/sticker/.

TIMFaceElem wire format:
    {
        "msg_type": "TIMFaceElem",
        "msg_content": {
            "index": 0,          # always 0 per Yuanbao convention
            "data": "<json>",    # serialised sticker metadata
        }
    }

The `data` field carries a JSON string with the sticker's metadata so the
receiver can look up the correct asset in the emoji pack.
    )annotationsN)Optionalu	   六六六2781003u(   666 厉害 牛 棒 绝了 好强 awesome   png)
sticker_id
package_idnamedescriptionwidthheightformatsu   我想开了262u/   想开 佛系 释怀 顿悟 看淡了 无所谓u   害羞130u/   腼腆 不好意思 脸红 娇羞 羞涩 捂脸u   比心252u/   笔芯 爱你 爱心手势 love heart 喜欢你u   委屈125u2   难过 想哭 可怜巴巴 瘪嘴 受伤 被欺负u   亲亲146u$   么么 mua 亲一下 kiss 飞吻 啵u   酷131u%   帅 墨镜 cool 高冷 有型 swaggeru   睡145u*   睡觉 困 zzZ 打盹 躺平 休眠 sleepyu   发呆152u,   懵 愣住 放空 呆滞 出神 脑子空白u   可怜157u2   卖萌 求饶 委屈巴巴 弱小 拜托 眼巴巴u   摊手200u1   无奈 没办法 耸肩 随便 那咋整 whateveru   头大213u,   头疼 烦恼 郁闷 难搞 崩溃 一团乱u   吓256u)   害怕 惊恐 震惊 吓一跳 恐怖 怂u   吐血203u,   无语 崩溃 被雷 内伤 一口老血 屮u   哼185u)   傲娇 生气 不满 撇嘴 不理 赌气u   嘿嘿220u/   坏笑 猥琐笑 偷笑 憨笑 得意 你懂的u   头秃218u/   程序员 加班 焦虑 没头发 秃了 肝爆u   暗中观察221u2   窥屏 潜水 偷偷看 角落 围观 屏住呼吸u	   我酸了224u2   嫉妒 柠檬精 羡慕 吃柠檬 眼红 恰柠檬u   打call246u'   应援 加油 支持 喝彩 助威 callu   庆祝251u%   祝贺 开心 耶 party 胜利 干杯u   奋斗151u)   努力 加油 拼搏 冲 干劲 卷起来u   惊讶143u/   震惊 哇 不敢相信 OMG 居然 这么离谱u   疑问144u/   问号 不懂 啥 为什么 啥情况 懵逼问u   仔细分析248u/   思考 推敲 认真 研究 琢磨 让我想想u   撅嘴184u%   嘟嘴 卖萌 不高兴 撒娇 嘴翘u   泪奔199u2   大哭 伤心 破防 感动哭 泪流满面 呜呜u   尊嘟假嘟276u1   真的假的 真假 可爱问 你骗我 是不是u	   略略略113u)   调皮 吐舌 不服 略 气死你 鬼脸u   困180u2   想睡 倦 打哈欠 睁不开眼 好困啊 sleepyu   折磨181u2   难受 痛苦 煎熬 蚌埠住了 受不了 要命u   抠鼻182u,   不屑 无聊 淡定 无所谓 鄙视 挖鼻u   鼓掌183u&   拍手 叫好 赞同 666 喝彩 掌声u	   斜眼笑204u6   滑稽 坏笑 doge 意味深长 阴阳怪气 嘿嘿嘿u	   辣眼睛216u.   看不下去 cringe 毁三观 太丑了 瞎了u   哦哟217u)   惊讶 起哄 哇哦 有戏 不简单 哟u   吃瓜222u,   围观 看戏 八卦 路人 看热闹 板凳u   狗头225u0   doge 保命 开玩笑 滑稽 反讽 懂的都懂u   敬礼227u)   salute 尊重 收到 遵命 致敬 报告u   哦231u,   知道了 明白 敷衍 嗯 这样啊 收到u   拿到红包236u2   红包 谢谢老板 发财 开心 抢到了 欧气u   牛吖239u    牛 厉害 强 666 佩服 大佬u   贴贴272u,   抱抱 亲昵 蹭蹭 亲密 靠靠 撒娇贴u   爱心138u*   心 love 喜欢你 红心 示爱 么么哒u   晚安170u,   好梦 睡了 night 早点休息 安啦 moonu   太阳176u-   晴天 早上好 阳光 morning 好天气 日u   柠檬266u,   酸 嫉妒 柠檬精 羡慕 我酸 恰柠檬u	   大冤种267u5   倒霉 吃亏 自嘲 好心没好报 背锅 工具人u   吐了132u/   恶心 yue 受不了 嫌弃 想吐 生理不适u   怒134u&   生气 愤怒 火大 暴躁 气炸 怼u   玫瑰165u,   花 示爱 表白 浪漫 送你花 情人节119   凋谢u)   花谢 失恋 难过 枯萎 心碎 凉了159   点赞u)   赞 认同 好棒 good like 大拇指 顶164   握手u-   合作 你好 商务 hello deal 成交 友好163   抱拳u)   谢谢 失敬 江湖 承让 拜托 有礼169oku.   好的 收到 没问题 okay 行 可以 懂了174   拳头u)   加油 干 冲 fight 力量 击拳 硬气191   鞭炮u,   过年 喜庆 爆竹 春节 噼里啪啦 红258   烟花u,   庆典 漂亮 新年 嘭 绽放 节日快乐)rC   rE   rG   rI   rK   rM   rO   rQ   zdict[str, dict]STICKER_MAPc                ,   | sy| j                         }|t        v r	t        |   S t        j                         D ]  \  }}||v s||v s|c S  t        j                         D ]  }|j	                  dd      }||v s|c S  t        |d      }|r|d   S dS )ur  
    按名称查找贴纸，支持模糊匹配。

    匹配优先级：
      1. 完全相等（name）
      2. name 包含查询词（前缀/子串）
      3. description 包含查询词（同义词搜索）
      4. 通用模糊评分（与 sticker-search 同算法），命中即返回得分最高的一条

    返回 sticker dict，找不到返回 None。
    Nr       )limitr   )striprR   itemsvaluesgetsearch_stickers)r   querykeystickerdescmatchess         T/root/.hermes/venv/lib/python3.12/site-packages/gateway/platforms/yuanbao_sticker.pyget_sticker_by_namerb   K  s     JJLE5!!#))+ WC<3%<N %%' {{="-D=N
 e1-G 71:*d*    c                0   | r`t         j                         D cg c],  }| |j                  dd      v s| |j                  dd      v r|. }}|rt        j                  |      S t        j                  t        t         j                                     S c c}w )u   
    随机返回一个贴纸。

    若指定 category，则在 description 中含有该关键词的贴纸里随机选取；
    category 为 None 时从全表随机。
    r   rT   r   )rR   rY   rZ   randomchoicelist)categorys
candidatess      ra   get_random_stickerrk   l  s     "))+
15533x155QSCT7T 

 
 ==,,==k002344
s   1Bc                    | syt        |       j                         }t        j                         D ]  }|j	                  d      |k(  s|c S  y)u$   按 sticker_id 精确查找贴纸。Nr	   )strrW   rR   rY   rZ   )r	   sidr^   s      ra   get_sticker_by_idro   }  sM    
j/


!C%%' ;;|$+N rc   u5   [\s\u3000\-_·.,，。!！?？\"“”'‘’、/\\]+c                    t        j                  dt        | xs d            j                         j	                         S )NNFKCrT   )unicodedata	normalizerm   rW   lowerraws    ra   _normalize_textrw     s/      SYB8>>@FFHHrc   c                @    t         j                  dt        |             S )NrT   )	_PUNCT_REsubrw   ru   s    ra   _compact_textr{     s    ==_S122rc   c                    | syi }|D ]  }|j                  |d      dz   ||<    d}| D ]'  }|j                  |d      }|dkD  s|dz  }|dz
  ||<   ) |t        |       z  S N        r   rU   )rZ   len)needlehaystackbagchhitsns         ra   _multiset_char_hit_ratior     s    C %''"a.1$B%D GGBNq5AID!eCG	
 #f+rc   c                Z   t        |       dk  st        |      dk  ryt        t        |       dz
        D ch c]
  }| ||dz     }}t        t        |      dz
        D ch c]
  }|||dz     }}t        ||z        }t        |      t        |      z   |z
  }|r||z  S dS c c}w c c}w )N   r~   rU   )r   range)abiABinterunions          ra   _bigram_jaccardr     s    
1vzSVaZ"3q6A:./1QU/A/"3q6A:./1QU/A/AJEFSVOe#E!55=*s*	 	0/s   B#!B(c                r    | syd}|D ]   }|t        |       k\  r n|| |   k(  s|dz  }" |t        |       z  S r}   )r   )r   r   jr   s       ra   _longest_subsequence_ratior     sO    	A F?FA	
 s6{?rc   c           
     &   t        |       }t        |      }|r|syt        |       }t        |      }d}||k(  rt        |d      }||v r"t        |dt        dt	        |            z         }t	        |      dk\  r|j                  |      rt        |d      }|r||v rt        |d      }t        |t        ||      dz        }t        |t        ||      d	z        }t        |t        ||      d
z        }t	        |      dk(  r||v rt        |d      }|S )Nr~         Y@\      r   g      V@g     U@>   :   4   rU   g      Q@)	rw   r{   maxminr   
startswithr   r   r   )r   r\   hayqhay_cq_cbests          ra   _score_fieldr     s   
(
#CAa(#E

CD
ax4Cx4c!SVn,-
1v{s~~a(4
se|4t-c59B>?Dt_S%0256Dt/U;b@AD
1v{qCx4Krc   c           	        t        dt        d|rt        |      nd            }| rt        |       s t	        t
        j                               d| S g }t
        j                         D ]  }t        |j                  dd      |       }t        |j                  dd      |       dz  }t        |j                  d	d            j                         }t        |       }d
}	|r|rt        |      }
|
|k(  rd}	n||
v rd}	|j                  t        |||	      |f        |j                  d d       |r|d   d   nd}|dk  r|d| D cg c]  \  }}|	 c}}S |dk\  rd}n$|dk\  rt        d|dz        }nt        d|dz        }|D cg c]  }|d   |k\  s| }}|r|n|}|d| D cg c]  \  }}|	 c}}S c c}}w c c}w c c}}w )u  
    在内置贴纸表中按模糊匹配排序返回前 N 条结果。

    评分综合 name/description 字段的子串、字符多重集覆盖、bigram Jaccard、子序列比例。
    name 权重略高于 description（×0.88）。空 query 时按字典顺序返回前 N 条。
    rU   i  
   Nr   rT   r   g)\(?r	   r~   r   g      U@c                    | d   S )Nr    )xs    ra   <lambda>z!search_stickers.<locals>.<lambda>  s
    ad rc   T)r]   reverser      g      2@   g      $@g      ?g      @gffffff?)r   r   intrw   rg   rR   rY   r   rZ   rm   rW   appendsort)r\   rV   
safe_limitscoredr^   name_sdesc_srn   q_normid_ssid_normtop_ri   floorpairfilteredouts                     ra   r[   r[     s    QCuU"=>J.K&&()+:66')F%%' <gkk&"5u=gkk-<eDtK'++lB/0668 '6&s+H6!8#s6640':;< KKNDK1 &)A,aC
ax$[j12da22
by	D#)$Ct$!'<47e+;<H<(FCkz*+$!QA++ 3 =+s   F7F=F='Gc                $    d| i}|||d<   d|dgS )u  
    构造 TIMFaceElem 消息体。

    Yuanbao 约定：
      - index 固定传 0（服务端通过 data 字段识别具体表情）
      - data 为 JSON 字符串，包含 sticker_id / package_id 等字段

    Args:
        face_index: 保留字段，暂时不影响 wire format（Yuanbao 固定 index=0）。
                    当 face_index > 0 时视为旧版 QQ 表情 ID，直接放入 index。
        face_type:  保留字段（兼容旧接口，当前未使用）。
        data:       已序列化的 JSON 字符串；为 None 时仅传 index。

    Returns:
        符合 Yuanbao TIM 协议的 msg_body list，如::

            [{"msg_type": "TIMFaceElem", "msg_content": {"index": 0, "data": "..."}}]
    indexdataTIMFaceElem)msg_typemsg_contentr   )
face_index	face_typer   r   s       ra   build_face_msg_bodyr     s,    . !*-K"F&{CDDrc   c           
         t        j                  | d   | d   | j                  dd      | j                  dd      | j                  dd      | d   d	d
d      }t        d|      S )u   
    从 STICKER_MAP 中的 sticker dict 直接构造 TIMFaceElem 消息体。

    这是 send_sticker() 的内部辅助，确保 data 字段与原始 JS 插件一致。
    r	   r
   r   r   r   r   r   r   )r	   r
   r   r   r   r   F),:)ensure_ascii
separatorsr   )r   r   )jsondumpsrZ   r   )r^   data_payloads     ra   build_sticker_msg_bodyr     so     ::!,/!,/[[#.kk(C0{{9e4FO	
 L !,??rc   )r   rm   returnOptional[dict])N)rh   rm   r   dict)r	   rm   r   r   )rv   rm   r   rm   )r   rm   r   rm   r   float)r   rm   r   rm   r   r   )r   rm   r\   rm   r   r   )r   )r\   rm   rV   r   r   z
list[dict])rU   N)r   r   r   r   r   zOptional[str]r   rg   )r^   r   r   rg   )__doc__
__future__r   r   re   rerr   typingr   rR   __annotations__rb   rk   ro   compilery   rw   r{   r   r   r   r   r[   r   r   r   rc   ra   <module>r      sd  $ #   	  h 6;Ah  6>Hh  68Hh   68H!h * 68K+h 4 68=5h > 
65>?h H 
65CIh R 68ESh \ 68K]h f 68Jgh p 68Eqh z 
65B{h D 68EEh N 
65BOh X 68HYh b 68Hch l 6>Kmh v 6;Kwh @ 69@Ah J 68>Kh T 68BUh ^ 68H_h h 68Hih r 6>Hsh | 68>}h F 68KGh P 6>JQh Z 6;B[h d 
65Keh n 68Koh x 68Eyh B 68?Ch L 6;OMh V 6;GWh ` 68Bah j 68Ekh t 68Iuh ~ 68Bh H 
65EIh R 6>KSh \ 689]h f 68Egh p 68Cqh z 68E{h D 68FEh N 68EOh X 6;NYh b 68Hch l 
65?mh v 68Ewh B 68B 68B 68F 68B 64G 68B 68E 68EG	h _ hV	+B5" BJJOP	I3+	0(,Z EEE E 
	E:@rc   