+
    kHàj9a  ã                  ó²   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
HtHtHtHt ^ RIHt ^ RIHt ]P&                  ! R4      tR
t ! R R	4      tR# )z4Discord native media uploads and delivery fallbacks.)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalÚTuple)Út)Ú
SendResultz!plugins.platforms.discord.adapterc                  óü   a € ] tR t^t]R R l4       tRR/R R lltRR R lltRR	 V 3R
 llltRR R llt	RRRR/R R llt
RR R lltR R ltRR V 3R llltRR V 3R llltRR R lltR R R lltRtV ;t# )!ÚDiscordMediaMixinc               ó    € V ^8„  d   QhRRRR/# )é   Úchannelr   ÚreturnÚint© )Úformats   "ÚL/home/ubuntu/.hermes/hermes-agent/plugins/platforms/discord/adapter_media.pyÚ__annotate__ÚDiscordMediaMixin.__annotate__   s   € ÷ 3ñ 3¨Sð 3°Sñ 3ó    c                ó¤   € \        V RR4      pVe;   \        VRR4      p\        V\        4      '       d   V^ 8”  d   \        V\        4      # \        # )aÆ  Return the effective Discord attachment size limit for *channel*.

Prefer the guild's boost-aware ``filesize_limit`` when present; fall
back to the platform default for DMs / group DMs without a guild.
The guild value is floored at the platform default: discord.py's
unboosted-tier constant can lag a platform-wide raise (10 MiB in
2.7.1 vs the 20 MiB default since Sep 3 2026), and under-reporting
makes the preflight reject files Discord would accept.
ÚguildNÚfilesize_limit)ÚgetattrÚ
isinstancer   ÚmaxÚ#_DISCORD_DEFAULT_UPLOAD_LIMIT_BYTES)r   r   Úlimits   &  r   Ú_discord_upload_limit_bytesÚ-DiscordMediaMixin._discord_upload_limit_bytes   sN   € ô ˜ ¨$Ó/ˆØÒÜ˜EÐ#3°TÓ:ˆEÜ˜%¤×%Ò%¨%°!¬)Ü˜5Ô"EÓFÐFÜ2Ð2r   ÚcaptionNc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r   r   Ú	file_pathÚstrÚfilenamer"   úOptional[str]r   zOptional[SendResult]r   )r   s   "r   r   r   ,   s4   € ÷ "6ñ "6Øð"6Ø'*ð"6Ø69ð"6ØGTð"6à	ñ"6r   c             ƒ  óB  "  €  \         P                  P                  V4      pT P                  T4      pYW8:  d   R# TR,          pTR,          p	RT RTR R	T	R
 R2p
\        P                  RT P                  T
4       \        RY8R T	R
 R7      p T P                  4       pT'       d3   T P                  T4      '       g   TP                  TR7      G Rj  x€L
  MST'       dL   T P                  T4      '       d   T P                  Y4      G Rj  x€L
  MTP                  TR7      G Rj  x€L
  \	        RT
R7      #   \         d   p\	        RRT RT 2R7      u Rp?# Rp?ii ; i L� LY L@  \         d'    \        P                  RT P                  TRR7        Lni ; i5i)zéPreflight ``file_path`` against the channel's upload cap (#50846): a doomed
``413`` round-trip is skipped and the user gets a notice naming the size and the
limit. Returns the failed result, or ``None`` when the file may be uploaded.FzCannot stat file ú: ©ÚsuccessÚerrorNz#File too large for Discord upload: z is ú.1fz MB (limit ú.0fz MB)z[%s] %sz'platform.discord.media.upload_too_large©r&   Úsize_mbÚlimit_mb©Úcontentz0[%s] Failed to send oversized-file notice for %sT©Úexc_infoé   )ÚosÚpathÚgetsizeÚOSErrorr
   r    ÚloggerÚwarningÚnamer	   Úwarning_notifications_enabledÚ_is_forum_parentÚsendÚ_send_to_forumÚ	ExceptionÚdebug)Úselfr   r$   r&   r"   Ú	file_sizeÚexcr   r0   r1   r,   ÚnoticeÚshowns   &&&&$        r   Ú_reject_oversized_uploadÚ*DiscordMediaMixin._reject_oversized_upload,   s‘  é € ð	ZÜŸ™Ÿ™¨	Ó2ˆIð ×0Ñ0°Ó9ˆØÔÙØ˜{Õ+ˆØ˜KÕ(ˆØ5°h°Z¸tÀGÈCÀ=ÐP[Ð\dÐehÐ[iÐimÐnˆÜ�‰�y $§)¡)¨UÔ3ÜØ5Ø°#¨ÀXÈcÀNôUˆð	qØ×6Ñ6Ó8ˆEßà×,Ñ,¨W×5Ò5Ø!Ÿ,™,¨v˜,Ó6×6Ð6øßà×(Ñ(¨×1Ò1Ø×-Ñ-¨gÓ?×?Ñ?à!Ÿ,™,¨w˜,Ó7×7Ð7ô  %¨uÔ5Ð5øô5 ô 	ZÜ eÐ5FÀxÀjÐPRÐSVÐRWÐ3XÔYÕYûð	Zúñ" 7ñ @á7øÜô 	qÜ�L‰LÐKÈTÏYÉYÐX`ÐkoˆLÖpð	qüs¸   ‚F„D: £A,FÂ.E+ Â?E+ ÃE%ÃE+ ÃFÃE+ Ã"E+ Ã9E+ ÄE'ÄE+ ÄFÄE+ Ä(E)Ä)E+ Ä-FÄ:E"ÅEÅE"ÅFÅE"Å"FÅ%E+ Å'E+ Å)E+ Å+.FÆFÆFÆFc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   Úchat_idr%   r$   r"   r'   Ú	file_nameÚmetadataúOptional[dict[str, Any]]r   r
   r   )r   s   "r   r   r   P   sF   € ÷ 1@ñ 1@Øð1@Ø'*ð1@Ø5Bð1@à ð1@à3Kð1@ð 
ñ1@r   c              ƒ  óî  "  € ^ RI HpHp V P                  '       g   \	        RRR7      # \
        P                  P                  V4      '       g   \	        RRV 2R7      # V P                  V! W4      4      G Rj  x€L
 pV'       g   \	        RRV R2R7      # T;'       g     \
        P                  P                  V4      p	V P                  W‚W“R	7      G Rj  x€L
 p
V
e   V
# \        P                  R
V P                  T	\
        P                  P                  V	4      ^,          P                  4       ;'       g    RV4       VP!                  W)R7      pV P#                  V4      '       d7   T P%                  Yƒ;'       g    RP'                  4       V.R7      G Rj  x€L
 pV# TP)                  V'       d   TMRV.R7      G Rj  x€L
 p\+        VRR4      ;'       g    . pV'       gh   \        P-                  RV P                  \+        VRR4      V	4       \	        RRV	 R2\/        \+        VRR4      ;'       g    R4      ;'       g    RR7      # \	        R\/        VP0                  4      R7      #  ELò EL˜ LØ L²5i)u  Send a local file as a Discord attachment (forum channels get a new thread). Path-based
``discord.File`` only: the open-handle form can race the multipart encoder after an image
batch and yield zero attachments â€” a silent drop for video/document MEDIA tags.

See #66797.
©Ú_prompt_target_idÚdiscordFúNot connectedr*   zFile not found: NúChannel ú
 not found©r"   z*[%s] Sending file attachment %s (%s) to %szno-ext©r&   Ú ©r3   ÚfilesÚattachmentsz;[%s] Discord returned message %s with no attachments for %sÚidÚ?z4Discord accepted the message but attached no files (Ú))r+   r,   Ú
message_idT©r+   r`   )Ú!plugins.platforms.discord.adapterrR   rS   Ú_clientr
   r7   r8   ÚisfileÚ_resolve_channelÚbasenamerI   r;   Úinfor=   ÚsplitextÚlowerÚFiler?   Ú_forum_post_fileÚstripr@   r   r<   r%   r]   )rD   rL   r$   r"   rM   rN   rR   rS   r   r&   ÚrejectedÚdiscord_fileÚresultÚmsgr\   s   &&&&&&         r   Ú_send_file_attachmentÚ'DiscordMediaMixin._send_file_attachmentP   s  é € ÷ 	Qà�|�|ˆ|Ü e°?ÔCÐCÜ�w‰w�~‰~˜i×(Ò(Ü eÐ5EÀiÀ[Ð3QÔRÐRØ×-Ñ-Ñ.?ÀÓ.RÓS×SˆßÜ e°X¸g¸YÀjÐ3QÔRÐRØ×;Ð;¤§¡× 0Ñ 0°Ó ;ˆØ×6Ñ6°wÈ8Ð6Óe×eˆØÒØˆOÜ�‰Ø8¸$¿)¹)ÀXÜ�G‰G×Ñ˜XÓ& qÕ)×/Ñ/Ó1×=Ð=°X¸wô	
ð
 —|‘| I�|ÓAˆØ× Ñ  ×)Ò)Ø×0Ñ0Ø§- -¨R×!6Ñ!6Ó!8ÀÀð 1ó ÷ ˆFð ˆMØ—L‘L·G©ÀÈlÈ^�LÓ\×\ˆÜ˜c =°$Ó7×=Ð=¸2ˆßô �N‰NØMÈtÏyÉyÜ˜˜T 3Ó'¨ôô ØØLÈXÈJÐVWÐXÜœw s¨D°"Ó5×;Ð;¸Ó<×DÐDÀôð ô
  $´3°s·v±v³;Ô?Ð?òC Tò fññ ]ùs�   ‚AI5Á*I5Á9I+Á:I5ÂI5Â 6I5ÃI.ÃA I5Ä8AI5Å=I5ÆI1ÆI5Æ2I5Ç I3ÇI5Ç
I5Ç$AI5É)I5É.I5É1I5É3I5c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   rL   r%   Úimageszlist[tuple[str, str]]rN   rO   Úhuman_delayÚfloatr   r
   r   )r   s   "r   r   r   „   sD   € ÷ Ogñ OgØðOgØ$9ðOgà*ðOgà@EðOgð 
ñOgr   c              ƒ  ó�  <"  € ^ RI HpHpHpHp V P
                  '       g   \        RRR7      # V'       g   \        RRR7      #  ^ RIp	^ RIp
^ RI	H
p  T P                  T! Y4      4      G Rj  x€L
 pT'       g3   \        P!                  RT P"                  T4       \        RR	T R
2R7      #  ^
p\%        ^ \'        T4      T4       Uu. uF  qòYÿT,            NK  	  ppRp\)        T4       EF  w  ppT^ 8”  d&   T^ 8”  d   \*        P,                  ! T4      G Rj  x€L
  . p. p. pRp T EFÂ  w  ppT'       d   TP/                  T4       TP1                  R4      '       Edp   T! TR,          4      p\2        P4                  P7                  T4      '       g$   \        P!                  RT P"                  T4       K�   \2        P4                  P9                  T4      pT P=                  T4      pTT8”  dŸ   \        P!                  RT P"                  \2        P4                  P?                  T4      TR.,          TR.,          4       TP/                  \A        R\2        P4                  P?                  T4      TR.,          R TR.,          R R7      4       EKe  TP/                  T	PC                  T\2        P4                  P?                  T4      R7      4       EK§  T! T4      '       g$   \        P!                  RT P"                  4       EKØ   ^ RI"p^ RI#H$pH%p  T! RR7      p!T ! T!4      w  p"p#Tf   TPL                  ! R// T"B pT! TTTPO                  ^R7      T#R7      G Rj  x€L
 w  p$p%p&T$^È8w  d-   \        P!                  RT P"                  T$TR,          4       EKj  T! T&PQ                  RR4      4      p'TP/                  T	PC                  T
PS                  T%4      R \'        T4       R!T' 2R7      4       EKÅ  	  T'       gð   T PU                  4       p)T)'       gc   T'       d[   T PW                  T4      '       d#   T PY                  TT^ ,          4      G Rj  x€L
  M!TP[                  T^ ,          R#7      G Rj  x€L
  T'       dJ   T)'       dB   T PW                  T4      '       g+    TP[                  R$P]                  T4      R#7      G Rj  x€L
   Tf   EKà   TPa                  4       G Rj  x€L
  EKü  T'       d
   T^ ,          MRp*T'       d4   T Pc                  R$P]                  T*'       d   T*.M. T,           4      T*4      p*\        Pe                  R(T P"                  \'        T4      T^,           \'        T4      4       T PW                  T4      '       d6   T Pg                  TT*;'       g    R)Pi                  4       TR*7      G Rj  x€L
  MTP[                  T*TR*7      G Rj  x€L
  R&pTe    TPa                  4       G Rj  x€L
  EK  EK  	  \        TT'       d   RR7      # R-R7      #   \         d    \        S,T `5  YY44      G Rj  x€L 
 u # i ; i ELÖ  \         dE   p\        P!                  RT P"                  T4       \        S,T `5  YY44      G Rj  x€L 
 u Rp?# Rp?ii ; iu upi  EL†  \:         d/   p\        P!                  RT P"                  TT4        Rp?EK­  Rp?ii ; i EL‡  \         d6   p(\        P!                  R"T P"                  TR,          T(4        Rp(?(EKó  Rp(?(ii ; i ELÙ ELº ELl  \         d'    \        P_                  R%T P"                  R&R'7        ELši ; i EL‚  \         d     EKˆ  i ; i ELÀ EL§  \         dr   p\        P!                  R+T P"                  T^,           \'        T4      TR&R'7       \        S,T `5  TTY4R,7      G Rj  x€L 
 p+T;'       g    T+Pj                  p Rp?ELRp?ii ; i EL
  \         d     EK#  i ; i  Te-    TPa                  4       G Rj  x€L 
  i   \         d     i i ; ii ; i5i)0z±Send images as one Discord message (<=10 attachments): URLs are downloaded and uploaded
inline (bare links don't render); on chunk failure the remainder uses the per-image loop.)rR   Ú_image_ext_from_content_typeÚ#_read_url_image_with_redirect_guardÚis_safe_urlFrT   r*   zno images to sendN)Úunquotez.[%s] Channel %s not found for multi-image sendrU   rV   z7[%s] Failed to resolve channel for multi-image send: %szfile://:é   NNz[%s] Skipping missing image: %sz%[%s] Skipping unreadable image %s: %szE[%s] Skipping oversized image in batch: %s is %.1f MB (limit %.0f MB)z.platform.discord.media.image_skipped_too_larger-   r.   r/   rX   z&[%s] Blocked unsafe image URL in batch©Úresolve_proxy_urlÚproxy_kwargs_for_aiohttpÚDISCORD_PROXY©Úplatform_env_var©Útotal©ÚtimeoutÚrequest_kwargsz4[%s] Failed to download image (HTTP %d) in batch: %s:NéP   Núcontent-typeú	image/pngÚimage_Ú.z[%s] Download failed for %s: %sr2   Ú
z+[%s] Failed to send oversized-image noticesTr4   z@[%s] Sending %d image(s) as single Discord message (chunk %d/%d)rY   rZ   zQ[%s] Multi-image Discord send failed (chunk %d/%d), falling back to per-image: %s)ru   zall images failed to sendr6   r   )6rb   rR   rx   ry   rz   rc   r
   rS   ÚioÚurllib.parser{   rB   ÚsuperÚsend_multiple_imagesre   r;   r<   r=   ÚrangeÚlenÚ	enumerateÚasyncioÚsleepÚappendÚ
startswithr7   r8   Úexistsr9   r:   r    rf   r	   rj   ÚaiohttpÚgateway.platforms.baser~   r   ÚClientSessionÚClientTimeoutÚgetÚBytesIOr>   r?   rA   r@   ÚjoinrC   ÚcloseÚwarning_textrg   rk   rl   r+   )-rD   rL   rt   rN   ru   rR   rx   ry   rz   Ú_discord_modÚ_ioÚ_unquoter   ÚeÚCHUNKÚiÚchunksÚ	deliveredÚ	chunk_idxÚchunkr[   ÚcaptionsÚskip_noticesÚaiohttp_sessionÚ	image_urlÚalt_textÚ
local_pathÚ	_img_sizeÚstat_errÚ
_img_limitÚ_aiohttpr~   r   Ú_proxyÚ_sess_kwÚ_req_kwÚstatusÚdataÚheadersÚextÚdl_errrH   r3   ÚfallbackÚ	__class__s-   &&&&&                                       €r   r‘   Ú&DiscordMediaMixin.send_multiple_images„   s<  øé € ÷ 	Xó  	Xà�|�|ˆ|Ü e°?ÔCÐCßÜ eÐ3FÔGÐGð	^Û*ÛÝ8ð	^Ø ×1Ñ1Ñ2CÀGÓ2VÓW×WˆGßÜ—‘ÐOÐQU×QZÑQZÐ\cÔdÜ!¨%¸À'ÀÈ*Ð7UÔVÐVð ð ˆÜ/4°Q¼¸F»ÀUÔ/KÓLÑ/K¨!˜˜u�9Ó%Ñ/KˆÐLØˆ	Ü )¨&× 1ÑˆI�uØ˜QŒ 9¨q¤=Ü—m’m KÓ0×0Ð0Ø!ˆEØ"$ˆHØ&(ˆLØ"ˆOðjÜ+0Ñ'�I˜xßØ Ÿ™¨Ô1Ø ×+Ñ+¨I×6Ó6Ù%-¨i¸­mÓ%<˜
Ü!Ÿw™wŸ~™~¨j×9Ò9Ü"ŸN™NÐ+LÈdÏiÉiÐYcÔdÙ$ð%Ü(*¯©¯©¸
Ó(C˜Ið &*×%EÑ%EÀgÓ%N˜
Ø$ zÔ1Ü"ŸN™NØ gØ $§	¡	¬2¯7©7×+;Ñ+;¸JÓ+GØ )¨[Õ 9¸:ÈÕ;Uôð
 )×/Ñ/´Ø PÜ)+¯©×)9Ñ)9¸*Ó)EØ+4¸Õ+DÀSÐ*IØ,6¸+Õ,FÀsÐ+Kô	1Nô Oò
 %ØŸ™ \×%6Ñ%6°zÌBÏGÉG×L\ÑL\Ð]gÓLhÐ%6Ó%i×já*¨9×5Ò5Ü"ŸN™NÐ+SÐUY×U^ÑU^Ô_Ú$ð%Û6ßjÙ%6ÈÔ%X˜FÙ0HÈÓ0PÑ-˜H gØ.Ò6Ø2:×2HÒ2HÑ2TÈ8Ñ2T Ù:]Ø /°Ø(0×(>Ñ(>ÀRÐ(>Ó(HÐY`ô;÷ 5Ñ1˜F D¨'ð  &¨œ}Ü &§¡Ø$ZØ$(§I¡I¨v°yÀµ~ô!"ò !)Ù">¸w¿{¹{È>Ð[fÓ?gÓ"h˜CØ!ŸL™L¨×):Ñ):¸3¿;¹;ÀtÓ;LÐY_Ô`cÐdiÓ`jÐ_kÐklÐmpÐlqÐWrÐ):Ó)s×tñq ,1÷x ð !×>Ñ>Ó@�Eß §XØ×0Ñ0°×9Ò9Ø"&×"5Ñ"5°g¸xÈ½{Ó"K×KÑKà")§,¡,°xÀµ{ ,Ó"C×CÐCß#¯°d×6KÑ6KÈG×6TÒ6TðØ")§,¡,°t·y±yÀÓ7N ,Ó"O×OÐOð ð0 #Õ.ðØ-×3Ñ3Ó5×5Ó5÷1 *2˜( 1ž+°t�ßØ"×/Ñ/°·	±	Ï¸G¹9ÐUWÐ[gÕ:gÓ0hÐjqÓr�GÜ—‘ØVØ—I‘Iœs 5›z¨9°q­=¼#¸f»+ôð ×(Ñ(¨×1Ò1Ø×/Ñ/Ø¨'¯-¨-°R×)>Ñ)>Ó)@Èð 0ó ÷ ñ ð "Ÿ,™,¨w¸e˜,ÓD×DÐDØ �	ð #Ò.ðØ-×3Ñ3Ó5×5Ó5ò /ñ[ !2ôd  )¿9°4ÔfÐfÐJeÔfÐføô ô 	^Ü™Ñ5°gÀxÓ]×]Ð]Ò]ð	^úò Xøô ô 	^Ü�N‰NÐTÐVZ×V_ÑV_ÐabÔcÜ™Ñ5°gÀxÓ]×]Ð]Õ]ûð	^üò Mò 1øô&  'ô %Ü"ŸN™NØ GØ $§	¡	¨:°xôö %ûð%úò@5øô  )ô %Ü"ŸN™NÐ+LÈdÏiÉiÐYbÐcfÕYgÐioÔpÞ$ûð%úò LâCò PøÜ(ô Ü"ŸL™LØ MØ $§	¡	°Dð )÷ ðúò> 6øÜ$ô Ûðúò#ò Eøäô :Ü—‘ØgØ—I‘I˜y¨1�}¬c°&«k¸1Àtð ô ô "'¡Ñ!=¸gÀuÈhÐ!=Ó!p×pÐp�Ø%×9Ð9¨×)9Ñ)9–	ûð:úò 6øÜ$ô Ûðûð #Ò.ðØ-×3Ñ3Ó5×5Ò5øÜ$ô Ùðúð /üsÇ  ƒ3a·aÁX ÁY Á.YÁ/Y Á;1Y Â,aÃZÃ=aÄZÄaÄ&9]<Å 3]<Æ#]<Æ8Z!ÇD]<Ë#]<ÌA[ Í[Í8[ Î]<ÎA[ Ï*]<Ï7]<Ð]<Ð]<Ð.]<Ñ
\#Ñ!]<Ñ,\&Ñ-]<Ñ9]<Ò]<Ò$\,Ò=\)Ò>\,ÓaÓ]#Ó] Ó]#Ó#aÓ&]<Ó.]<Ô]<ÔA<]<Ö]<Ö6]6Ö7]<×]9×]<×a×_>×1_;×2_>×6$aØYØ8X;Ø9YØ>aÙ YÙaÙY ÙZÙ4ZÚZ	ÚZÚZÚaÚZÚ	aÚ![Ú,"[Û]<Û[Û]<Û[ Û \ Û+)\Ü]<Ü\ Ü ]<Ü&]<Ü)\,Ü,-]Ý]<Ý]Ý]<Ý ]#Ý#]3Ý.aÝ2]3Ý3aÝ6]<Ý9]<Ý<_8ÞA
_3ß_ß_3ß _3ß-`ß3_8ß8`ß;_>ß>`à	aà`àaàaà`1à*`-
à+`1à0aà1`?	à<aà>`?	à?aáac               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rL   r%   Ú
audio_pathr"   r'   Úreply_torN   rO   r   r
   r   )r   s   "r   r   r     sF   € ÷ D;ñ D;ØðD;Ø(+ðD;Ø6CðD;àðD;à2JðD;ð 
ñD;r   c              ‹  óæ  "  € ^ RI HpHp  ^ RIp	V P	                  V! W4      4      G Rj  x€L
 p
V
'       g   \        RRV R2R7      # \        P                  P                  V4      '       g   \        RRV 2R7      # \        P                  P                  V4      pV P                  W¢W³R7      G Rj  x€L
 pVe   V# V P                  WJ4      p\        P                  ! \        V4      P                  4      G Rj  x€L
 pV P!                  V
4      '       dV   VP#                  V	P%                  V4      VR	7      pT P'                  Y£;'       g    R
P)                  4       VR7      G Rj  x€L
 #  ^ RIp ^ RIHp V! V4      P0                  P2                  pRRRRRRRR\;        V^4      RVP=                  \?        ^€.R,          4      4      PA                  4       /./pVe   R\C        V4      RR/VR&   RRR\D        PF                  ! V4      /RRRVRRR R!/.pV PH                  PJ                  PM                  VPJ                  PO                  R"R#V
PP                  R$7      VR%7      G Rj  x€L
 p\        R&\C        VR,          4      R'7      #  EL\ EL× EL’ EL)  \4         d!    \7        R\9        T4      R,          4      p EL)i ; i L[  \4         dÑ   p\R        PU                  R(T4       TP#                  T	P%                  T4      TR	7      p T
PW                  TTR)7      G Rj  x€L 
 pMP  \4         dC   pTe9   T PY                  T4      '       d"   T
PW                  TRR)7      G Rj  x€L 
 p Rp?M	h Rp?ii ; i\        R&\C        TPP                  4      R'7      u Rp?# Rp?ii ; i  \4         dD   p\R        P[                  R*T P\                  TR&R+7       \        R\C        T4      R7      u Rp?# Rp?ii ; i5i),z(Send audio as a Discord file attachment.rQ   NFrU   rV   r*   zAudio file not found: rW   rX   rY   ©r3   Úfile)ÚOggOpusg      ð?g     @Ÿ@Úflagsi    r\   r]   Ú0r&   zvoice-message.oggÚduration_secsÚwaveformé   r`   Úfail_if_not_existsÚmessage_referencer=   Úpayload_jsonÚvaluezfiles[0]Úcontent_typez	audio/oggÚPOSTz/channels/{channel_id}/messages)Ú
channel_id)ÚformTra   z3Voice message flag failed, falling back to file: %s)rÇ   Ú	referencez[%s] Failed to send audio: %sr4   )/rb   rR   rS   rŽ   re   r
   r7   r8   r™   rf   rI   Ú_reply_reference_for_sendr•   Ú	to_threadr   Ú
read_bytesr?   rj   rŸ   rk   rl   Úbase64Úmutagen.oggopusrÈ   rg   ÚlengthrB   r   r“   ÚroundÚ	b64encodeÚbytesÚdecoder%   ÚjsonÚdumpsrc   ÚhttpÚrequestÚRouter]   r;   rC   r@   Ú_is_reply_reference_rejectedr,   r=   )rD   rL   rÃ   r"   rÄ   rN   ÚkwargsrR   rS   rŽ   r   r&   rm   rÖ   Ú	file_dataÚ
forum_filerÚ   rÈ   rË   Úpayload_datarÕ   Úmsg_dataÚ	voice_errrÇ   rp   Úsend_errr¦   s   &&&&&&,                    r   Ú
send_voiceÚDiscordMediaMixin.send_voice  s�  é € ÷
 	Qð=	;ÛØ ×1Ñ1Ñ2CÀGÓ2VÓW×WˆGßÜ!¨%¸À'ÀÈ*Ð7UÔVÐVÜ—7‘7—>‘> *×-Ò-Ü!¨%Ð9OÐPZÈ|Ð7\Ô]Ð]Ü—w‘w×'Ñ'¨
Ó3ˆHØ!×:Ñ:¸7ÐPXÐ:Ój×jˆHØÒ#Ø�Ø×6Ñ6°xÓIˆIÜ%×/Ò/´°ZÓ0@×0KÑ0KÓL×LˆIà×$Ñ$ W×-Ò-Ø$Ÿ\™\¨"¯*©*°YÓ*?È(˜\ÓS�
Ø!×2Ñ2Ø§m m°×%:Ñ%:Ó%<À:ð 3ó ÷ ð ð&HÛðFÝ7Ù$+¨JÓ$7×$<Ñ$<×$CÑ$C�Mð ˜TØ!Ø˜c :Ð/BÀOÔUZÐ[hÐjkÓUlØ" F×$4Ñ$4´U¸C¸5À3½;Ó5GÓ$H×$OÑ$OÓ$Qð%ð $ð �ð Ò(Ø9EÄsÈ8Ã}ÐVjÐlqÐ8r�LÐ!4Ñ5à˜^¨W´d·j²jÀÓ6NÐOà 
¨G°YÀ
ÐL_Ø&¨ðð�ð "&§¡×!2Ñ!2×!:Ñ!:Ø—L‘L×&Ñ& vÐ/PÐ]d×]gÑ]gÐ&ÓhØð ";ó "÷ �ô "¨$¼3¸xÈ½~Ó;NÔOÐOò[ Xò kò Mòøô !ô FÜ$'¨¬S°«^¸fÕ-DÓ$E“MðFúñ$øô
 ô 
HÜ—‘ÐRÐT]Ô^Ø—|‘| B§J¡J¨yÓ$9ÀH�|ÓM�ðØ '§¡°$À) Ó L×LÐL‘CøÜ ô Ø Ò,°×1RÑ1RÐS[×1\Ò1\Ø$+§L¡L°dÀd LÓ$K×KÐK�àûð	úô
 "¨$¼3¸s¿v¹v»;ÔGÕGûð
Hûô ô 	;Ü�L‰LÐ8¸$¿)¹)ÀQÐQUˆLÔVÜ e´3°q³6Ô:Õ:ûð	;üsj  ‚	O1ŒN  ªJ«N  ·N  ÁO1Á$N  Á-N  Á<O1Á=5N  Â2J	Â3	N  Â<O1Â==N  Ã:JÃ;N  Ä5N  ÅN  Å&JÅ'N  Å*O1Å,K Å1"J ÆCK É$K É% K ÊO1ÊN  Ê	N  ÊN  ÊN  Ê'J=Ê9K Ê<J=Ê=K ËNË8NÌL#ÌLÌL#Ì"NÌ#M0Ì.M+Í	M+ÍM"Í M+Í%NÍ*M+Í+M0Í0"NÎNÎN  ÎO1ÎNÎN  Î O.Î+8O)Ï#O.Ï$O1Ï)O.Ï.O1rM   rN   c               ó    € V ^8„  d   QhRRRR/# )r   Ú	not_foundr%   Úkindr   )r   s   "r   r   r   ]  s   € ÷ ;ñ ;Ð[^ð ;Ðfiñ ;r   c          	   ƒ  ó&  "  €  V P                  WW4VR7      G Rj  x€L
 #  L  \         d    \        RT RT 2R7      u # \         dD   p\        P                  RT P                  YhRR7       \        R\        T4      R7      u Rp?# Rp?ii ; i5i)	zIA failed attachment is a failed delivery, never a successful text notice.)rM   rN   NFr)   r*   z[%s] Failed to send %s: %sTr4   )rq   ÚFileNotFoundErrorr
   rB   r;   r,   r=   r%   )	rD   rL   r8   r"   rM   rñ   rò   rN   r¦   s	   &&&&$$$$ r   Ú_send_local_fileÚ"DiscordMediaMixin._send_local_file]  s„   é € ð	;Ø×3Ñ3°GÀ7ÐjrÐ3Ós×sÐsÑsøÜ ô 	KÜ e°i°[ÀÀ4À&Ð3IÔJÒJÜô 	;Ü�L‰LÐ5°t·y±yÀ$ÐTXˆLÔYÜ e´3°q³6Ô:Õ:ûð	;üsN   ‚B„" › œ" ŸB " ¢B¿BÁBÁ
BÁ8B	ÂBÂBÂ	BÂBc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rL   r%   Ú
image_pathr"   r'   rÄ   rN   rO   r   r
   r   )r   s   "r   r   r   h  ó>   € ÷ 
ñ 
Øð
Ø(+ð
Ø6Cð
àð
à2Jð
ð 
ñ
r   c           	   ƒ  óJ   "  € V P                  WVRRVR7      G Rj  x€L
 #  L5i)z>Send a local image file natively as a Discord file attachment.zImage file not foundzlocal image©rñ   rò   rN   N©rõ   )rD   rL   rø   r"   rÄ   rN   s   &&&&&&r   Úsend_image_fileÚ!DiscordMediaMixin.send_image_fileh  ó7   é € ð
 ×*Ñ*Ø Ð4JÐQ^Øð +ó 
÷ 
ð 	
ñ 
ùó   ‚#œ!�#c               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )r   rL   r%   Úurlr"   r'   rò   rN   zOptional[dict]Úerror_metadatar   r
   r   )r   s   "r   r   r   s  sF   € ÷ %2ñ %2Øð%2Ø!$ð%2Ø/<ð%2ØGJð%2à*8ð%2àJXð%2ð 
ñ%2r   c          
   ƒ  óˆ  "  € ^ RI Hp	Hp
HpHp V P
                  '       g   \        RRR7      # V! V4      '       g2   \        P                  RV P                  WD4       V! V4      G Rj  x€L
 #  ^ RI
pV P                  V	! W4      4      G Rj  x€L
 pV'       g   \        RRV R2R7      # ^ R	IHpHp V! V! R
R7      4      w  ppVP                  ! R/ VB ;_uu_4       GRj  x€L
 pV
! VW-P!                  ^R7      VR7      G Rj  x€L
 w  pppV^È8w  d   \#        RV RV 24      h^ RIpVP'                  VP)                  V4      V! V4      R7      pV P+                  V4      '       dF   T P-                  Yã;'       g    RP/                  4       VR7      G Rj  x€L
 uuRRR4      GRj  x€L
  # TP1                  V'       d   TMRVR7      G Rj  x€L
 p\        R\3        VP4                  4      R7      uuRRR4      GRj  x€L
  #  EL� EL| EL) EL	 Ly Lj LF L  + GRj  x€L 
 '       g   i     R# ; i  \6         d7    \        P                  RT P                  RR7       T! T4      G Rj  x€L 
 u # \"         d@   p\        P9                  RT P                  TTRR7       T! T4      G Rj  x€L 
 u Rp?# Rp?ii ; i5i)z´Download ``url`` and post it as a native attachment (Discord renders those inline).
``fallback(metadata)`` is the base-adapter URL send (``error_metadata`` after download failure).)rR   ry   rS   rz   FrT   r*   z1[%s] Blocked unsafe %s URL during Discord send_%sNrU   rV   r}   r€   r�   rƒ   r…   zFailed to download z: HTTP rX   rY   rÆ   Tra   zI[%s] aiohttp not installed, falling back to URL. Run: pip install aiohttpr4   z:[%s] Failed to send %s attachment, falling back to URL: %sr   )rb   rR   ry   rS   rz   rc   r
   r;   r<   r=   rš   re   r›   r~   r   rœ   r�   rB   rŽ   rj   rŸ   r?   rk   rl   r@   r%   r]   ÚImportErrorr,   )rD   rL   r  r"   rò   Úfilename_forr¿   rN   r  rR   ry   rS   rz   rš   r   r~   r   r¸   r¹   Úsessionrº   r»   r¼   rŽ   rÇ   rp   r¦   s   &&&&$$$$$                  r   Ú_send_url_mediaÚ!DiscordMediaMixin._send_url_medias  sd  é € ÷ 	Có  	Cà�|�|ˆ|Ü e°?ÔCÐCÙ˜3×ÒÜ�N‰NÐNÐPT×PYÑPYÐ[_ÔfÙ! (Ó+×+Ð+ð	2ÛØ ×1Ñ1Ñ2CÀGÓ2VÓW×WˆGßÜ!¨%¸À'ÀÈ*Ð7UÔVÐVßZÙ 8Ñ9JÐ\kÔ9lÓ mÑˆH�gØ×,Ò,Ñ8¨x×8×8Ò8¸GÙ.QØ˜S×*?Ñ*?ÀbÐ*?Ó*IÐZaô/÷ )Ñ%�˜˜gð ˜S”=Ü#Ð&9¸$¸¸wÀvÀhÐ$OÓPÐPÛØ—|‘| B§J¡J¨tÓ$4¹|ÈGÓ?T�|ÓU�Ø×(Ñ(¨×1Ò1Ø!%×!6Ñ!6°wÏÈÐTV×H]ÑH]ÓH_ÐfjÐ!6Ó!k×k÷ 9×8Ò8ð $ŸL™L¿G±ÈÐTX˜LÓY×Y�Ü!¨$¼3¸s¿v¹v»;ÔG÷ 9×8Ò8ò ,ò Xò
 9ò)ñ lñ 9ñ Z÷ 9×8×8Ó8ûô ô 	2Ü�N‰NÐfÐhl×hqÑhqð  }AˆNô  BÙ! .Ó1×1Ð1Ò1Üô 	2Ü�L‰LÐUÐW[×W`ÑW`ÐbfÐhiÐtxˆLÔyÙ! .Ó1×1Ð1Õ1ûð	2üs[  ‚9K¼,KÁ(HÁ)KÁ.H6 ÂHÂH6 ÂH6 Â)KÂ*8H6 Ã"HÃ#H6 Ã&HÄHÄA"HÅ)HÅ=HÆHÆHÆH6 Æ(HÆ)H6 Æ-KÆ.HÇHÇHÇ#HÇ2H6 Ç?HÈ H6 ÈKÈH6 ÈH6 ÈHÈHÈH6 ÈHÈH6 ÈH3	ÈH"È 
H3	È+H3	È-H6 È1KÈ3H6 È68J?É.I1É/J?É4KÉ6J?É?J?Ê /J:Ê/J2Ê0J:Ê4J?Ê5KÊ:J?Ê?Kc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rL   r%   r°   r"   r'   rÄ   rN   rO   r   r
   r   )r   s   "r   r   r   ›  s>   € ÷ 
ñ 
Øð
Ø'*ð
Ø5Bð
àð
à2Jð
ð 
ñ
r   c              ƒ  ó†   <a aaaaa"  € ^ RI HpHo S P                  SSSRV3R lVVVVVV 3R lWUR7      G Rj  x€L
 #  L5i)z4Send an image natively as a Discord file attachment.)rR   rx   Úimagec                ó:   <€ R S! V P                  RR4      4       2# )zimage.r‰   rŠ   )rž   )Úhrx   s   &€r   Ú<lambda>Ú.DiscordMediaMixin.send_image.<locals>.<lambda>¤  s   ø€  VÑ,HÈÏÉÈ~Ð_jÓIkÓ,lÐ+mÑ#nr   c                ó4   <€ \         \        S`  SSSSV R 7      # ©)rN   )r�   r   Ú
send_image)ÚmdrÀ   r"   rL   r°   rÄ   rD   s   &€€€€€€r   r  r  ¥  s!   ø€ ¤Ô&7¸Ñ IÈ'ÐS\Ð^eÐgoÐz|Ð IÔ }r   ©rò   r  r¿   rN   r  N)rb   rR   rx   r  )	rD   rL   r°   r"   rÄ   rN   rR   rx   rÀ   s	   fffff& @€r   r  ÚDiscordMediaMixin.send_image›  sC   þé € ÷
 	fà×)Ñ)Ø�Y ¨gÜnß}Ñ}Øð	 *ó 
÷ 
ð 	
ñ 
ùs   ‰1Aº?»Ac               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rL   r%   Úanimation_urlr"   r'   rÄ   rN   rO   r   r
   r   )r   s   "r   r   r   ª  s>   € ÷ 	
ñ 	
Øð	
Ø+.ð	
Ø9Fð	
àð	
à2Jð	
ð 
ñ	
r   c              ƒ  ón   <a aaaa"  € S P                  SSSRR VVVVVV 3R lWUR7      G Rj  x€L
 #  L5i)z;Send an animated GIF natively as a Discord file attachment.Ú	animationc                ó   € R # )zanimation.gifr   )Ú_hs   &r   r  Ú2DiscordMediaMixin.send_animation.<locals>.<lambda>°  s   € ÑWfr   c                ó4   <€ \         \        S`  SSSSV R 7      # r  )r�   r   Úsend_animation)r  rÀ   r  r"   rL   rÄ   rD   s   &€€€€€€r   r  r  ±  s(   ø€ ¤Ô&7¸Ñ MÈgÐWdÐfmÐowð  CEÐ Mô  !Fr   r  N)r  )rD   rL   r  r"   rÄ   rN   rÀ   s   fffff&€r   r  Ú DiscordMediaMixin.send_animationª  sE   ýé € ð
 ×)Ñ)Ø�] G°+ÑLf÷ Fñ  FØð *ó 
÷ 
ð 	
ñ 
ùs   ˆ&5®3¯5c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rL   r%   Ú
video_pathr"   r'   rÄ   rN   rO   r   r
   r   )r   s   "r   r   r   ¶  rù   r   c           	   ƒ  óJ   "  € V P                  WVRRVR7      G Rj  x€L
 #  L5i)z9Send a local video file natively as a Discord attachment.zVideo file not foundzlocal videorû   Nrü   )rD   rL   r"  r"   rÄ   rN   s   &&&&&&r   Ú
send_videoÚDiscordMediaMixin.send_video¶  rÿ   r   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r   rL   r%   r$   r"   r'   rM   rÄ   rN   rO   r   r
   r   )r   s   "r   r   r   Á  sH   € ÷ 	
ñ 	
Øð	
Ø'*ð	
Ø5Bð	
à ð	
à3@ð	
ð +ð	
ð 
ñ		
r   c           
   ƒ  óJ   "  € V P                  WW4RRVR7      G Rj  x€L
 #  L5i)z8Send an arbitrary file natively as a Discord attachment.zFile not foundÚdocument)rM   rñ   rò   rN   Nrü   )rD   rL   r$   r"   rM   rÄ   rN   s   &&&&&&&r   Úsend_documentÚDiscordMediaMixin.send_documentÁ  s7   é € ð ×*Ñ*Ø ÐHXÐ_iØð +ó 
÷ 
ð 	
ñ 
ùr   r   )NNN)Ng        )NNNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ústaticmethodr    rI   rq   r‘   rî   rõ   rý   r  r  r  r$  r)  Ú__static_attributes__Ú__classcell__)rÀ   s   @r   r   r      s‚   ø† Øô3ó ð3ð""6ØW[÷"6÷H1@÷hOgò Og÷dD;ðN;È$ð ;Ðtx÷ ;÷
õ%2÷P
ò 
÷	
ò 	
÷
÷	
õ 	
r   r   i  @)Ú__doc__Ú
__future__r   r•   rá   Úloggingr7   Úpathlibr   Útypingr   r   r   r   r   Ú
agent.i18nr	   r›   r
   Ú	getLoggerr;   r   r   r   r   r   Ú<module>r9     sK   ðÙ :Ý "ã Û Û Û 	Ý ß 3Õ 3å Ý -à	×	Ò	Ð>Ó	?€ð '7Ð #÷q
ó q
r   