
    Ri                        d Z ddlmZ ddlmZmZ erddlmZ ddlm	Z	 ddZ
dddZ	 d	 	 	 	 	 	 	 	 	 ddZdd	Zddd
Zy)u   공통 봇 유틸리티 함수 모음.

gemini_bot.py, codex_bot.py 양쪽에서 공유하는 함수들을 여기에 정의합니다.
    )annotations)TYPE_CHECKINGAny)Update)ContextTypesc                0   | j                   }|y|j                  }|y|j                  r8|j                  r,|j                  j	                         |j	                         k(  ry|j
                  j                  }|dk(  r|j                  |k(  S |dv r|j                  |k(  ry|j                  xs g }|j                  xs d}|D ]j  }|j                  dk(  s||j                  |j                  |j                  z    }	|	j                  d      j	                         |j	                         k(  sj y |j                  }
|
rX|
j                  rL|
j                  j                  r6|
j                  j                  j	                         |j	                         k(  ryy)u&  이 봇이 해당 메시지에 응답해야 하는지 판단합니다.

    응답 조건:
      - 발신자가 자기 자신 봇(같은 username)이면 False (루프 방지)
      - 다른 봇의 메시지에는 멘션/리플라이 조건에 따라 응답 가능 (봇 간 토론 지원)
      - DM(private chat)이고 발신자가 OWNER_USER_ID이면 True
      - 그룹/슈퍼그룹:
          - 메시지 entities 중 @멘션이 이 봇 username과 일치하면 True
          - 리플라이 대상이 이 봇이면 True
      - 그 외 False
    Fprivate)group
supergroupT mention@)message	from_useris_botusernamelowerchattypeidentitiestextoffsetlengthlstripreply_to_message)updatebot_usernameowner_user_idr   sender	chat_typer   r   entity	mentionedreply_tos              R/home/jay/workspace/.worktrees/task-2117-dev1/services/multimodel-bot/bot_utils.pyshould_respondr&      sl    nnGF~ }}V__-B-B-DHZHZH\-\!!I IyyM)) ++99% ##)r||!r 	 F{{i' 1NO	##C(..0L4F4F4HH	  ++**!!**0B0B0K0K0Q0Q0SWcWiWiWk0k    c                   t        |       |k  r| gS g }d}| j                  d      D ]  }t        |      |kD  rH|r|j                  |       d}t        dt        |      |      D ]  }|j                  ||||z            Yt        |      t        |      z   |kD  r|r|j                  |       |}||z  } |r|j                  |       |S )u   텍스트를 max_len 이하의 청크로 분할합니다.

    가능하면 줄바꿈('\n') 기준으로 분할합니다.
    단일 줄이 max_len을 초과하는 경우에는 강제로 자릅니다.
    r   T)keependsr   )len
splitlinesappendrange)r   max_lenchunkscurrent_chunklineis         r%   split_messager3   G   s     4yGvFM. "t9wm, "1c$i1 5d1q7{345}D	)G3m, MT!M#"& m$Mr'   c                   K   | j                   }|yt        ||      }|D ]  }|j                  |       d{     y7 w)uD   응답 텍스트를 분할하여 텔레그램으로 전송합니다.N)r   r3   
reply_text)r   contextr   r.   r   r/   chunks          r%   send_responser8   l   sK      nnG4)F (  '''('s   5A?Ac                \   K   | j                  |d       d{   }|j                  S 7 w)uG   '🤔 생각 중...' 메시지를 보내고 message_id를 반환한다.u   🤔 생각 중...chat_idr   N)send_message
message_id)botr;   msgs      r%   send_thinking_messager@   {   s/       7K L
LC>> Ms   ,*,c                   K   t        ||      }| j                  |||d          d{    |dd D ]  }| j                  ||       d{     y7 *7 	w)u   '생각 중...' 메시지를 실제 응답으로 교체한다.

    텍스트가 max_len 이하면 edit_message_text로 교체.
    초과하면 첫 청크는 edit_message_text, 나머지는 send_message.
    r   )r;   r=   r   N   r:   )r3   edit_message_textr<   )r>   r;   r=   r   r.   r/   r7   s          r%   replace_thinking_messagerD      sl      4)F


JVTUY

WWW <wU;;;< X;s!   'AA"AAAAN)r   'Update'r   strr   intreturnbool)i   )r   rF   r.   rG   rH   z	list[str])
r   rE   r6   z'ContextTypes.DEFAULT_TYPE'r   rF   r.   rG   rH   None)r>   r   r;   rG   rH   rG   )r>   r   r;   rG   r=   rG   r   rF   r.   rG   rH   rJ   )__doc__
__future__r   typingr   r   telegramr   telegram.extr   r&   r3   r8   r@   rD    r'   r%   <module>rQ      si   
 # %)5p"R 	(((( ( 	(
 
(	<r'   