+
    kHàj"w  ã                   ó<  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
HtHtHt ^ RIHtHtHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHt ^ RIH t  ]PB                  ! ]"4      t#0 R<mt$]%! 4       t&R=t'R	 R
 lt(R R lt)R R lt*R>R R llt+R R lt,R R lt-R R lt.R R lt/R R lt0R R lt1 ! R R]4      t2R R  lt3R! R" lt4R# R$ lt5R% R& lt6R' R( lt7R) R* lt8R+ R, lt9R- R. lt: ! R/ R04      t;R1 R2 lt<R3 R4 lt=R5RR6RR7R8/R9 R: llt>R; t?R# )?uº  IRC Platform Adapter for Hermes Agent â€” stdlib asyncio only, zero external dependencies.

config.yaml ``gateway.platforms.irc.extra`` keys: server, port (6697), nickname (hermes-bot), channel,
use_tls (true), server_password, nickserv_password, allowed_users ([] = allow all), max_message_length (450).
Env vars override config.yaml: IRC_SERVER, IRC_PORT, IRC_NICKNAME, IRC_CHANNEL, IRC_USE_TLS,
IRC_SERVER_PASSWORD, IRC_NICKSERV_PASSWORD.
N)ÚAnyÚDictÚListÚOptional)Úcoerce_portÚget_scoped_secretÚseed_extra_from_envÚ
send_error)Út)ÚBasePlatformAdapterÚ
SendResult)Úcancel_task)ÚMessageEventÚMessageType)ÚPlatformc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚrawÚreturn)ÚstrÚdict)Úformats   "ÚB/home/ubuntu/.hermes/hermes-agent/plugins/platforms/irc/adapter.pyÚ__annotate__r   /   s   € ÷ Vñ VœCð V¤Dñ Vó    c                ób  € RRr!V P                  R4      '       d   V R,          P                  R4      w  rp RV 9   d   V P                  R^4      w  rV P                  4       p\        V4      ^8”  d
   VR,          M. pV'       d   VP	                  V4       RTRV'       d   V^ ,          RV/# RRV/# )	z>Parse a raw IRC line into ``{"prefix", "command", "params"}``.Ú Ú::é   NNÚ ú :ÚprefixÚcommandÚparams)Ú
startswithÚ	partitionÚsplitÚlenÚappend)r   r!   ÚtrailingÚ_Úpartsr#   s   &     r   Ú_parse_irc_messager,   /   s�   € à˜2ˆHØ
‡~�~�c×ÒØ˜R�×*Ñ*¨3Ó/‰ˆ�3Øˆs„{ØŸ	™	 $¨Ó*‰ˆØ�I‰I‹K€EÜ˜e›* qœ.ˆU�2ŽY¨b€FßØ�‰�hÔØ�f˜i·U¨¨q­ÀHÈfÐUÐUÀÀHÈfÐUÐUr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   r!   r   ©r   )r   s   "r   r   r   =   s   € ÷  ñ  œ#ð  ¤#ñ  r   c                ó2   € V P                  R4      ^ ,          # )z2Extract nickname from IRC prefix (nick!user@host).Ú!)r&   )r!   s   &r   Ú_extract_nickr1   =   s   € à�<‰<˜Ó˜QÕÐr   c                ó$   € V ^8„  d   QhR\         /# ©r   r   r.   )r   s   "r   r   r   B   s   € ÷ (ñ (”ñ (r   c                  ó^   € \        \        \        P                  ! 4       R ,          4      4      # )iè  )r   ÚintÚtime© r   r   Ú_ms_idr8   B   s   € ÜŒs”4—9’9“; Õ%Ó&Ó'Ð'r   c          
      óT   € V ^8„  d   QhR\         R\        R\        R\        R\        /# )r   ÚextraÚenvÚkeyÚdefaultr   )r   r   r   )r   s   "r   r   r   F   s/   € ÷ >ñ >œð >¤Cð >¬cð >¼Cð >Ìñ >r   c                óJ   € \        V4      ;'       g    V P                  W#4      # )z(Env var overrides config.yaml ``extra``.)Ú_get_scoped_secretÚget)r:   r;   r<   r=   s   &&&&r   Ú_env_or_extrarA   F   s   € ä˜cÓ"×=Ð= e§i¡i°Ó&=Ð=r   c                ó$   € V ^8„  d   QhR\         /# r3   )Útuple)r   s   "r   r   r   K   s   € ÷ hñ hœuñ hr   c                 ód   € \        V R / 4      ;'       g    / p\        VRR4      \        VRR4      3# )r:   Ú
IRC_SERVERÚserverÚIRC_CHANNELÚchannel)ÚgetattrrA   )Úconfigr:   s   & r   Ú_server_channelrK   K   s6   € Ü�F˜G RÓ(×.Ð.¨B€EÜ˜ ¨hÓ7¼ÀuÈmÐ]fÓ9gÐgÐgr   c                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r   Ú	paragraphÚlimitr   )r   r5   Úlist)r   s   "r   r   r   P   s%   € ÷ ñ ¤ð ¬Cð ´D¼µIñ r   c                óæ  € . pV '       dç   \        V P                  R4      4      V8:  d   VP                  V 4        V# ^\        V 4      ^ rTpW48:  dH   W4,           ^,          p\        V RV P                  R4      4      V8:  d   Yf^,           r5KB  V^,
          pKM  V P                  R^ V4      pWu^,          8”  d   TpVP                  V RV P	                  4       4       WR P                  4       p Kî  V# )zYSplit one line into UTF-8 chunks of at most ``limit`` bytes, preferring space boundaries.úutf-8Nr   )r'   Úencoder(   ÚrfindÚrstripÚlstrip)rM   rN   ÚchunksÚlowÚhighÚsplit_atÚmidÚspaces   &&      r   Ú_chunk_paragraphr\   P   sß   € à€Fß
Üˆy×Ñ Ó(Ó)¨UÔ2Ø�M‰M˜)Ô$Øð €Mð  ¤ Y£°�8ˆØŒkØ•: !Õ#ˆCÜ�9˜T˜c�?×)Ñ)¨'Ó2Ó3°uÔ<Ø #¨1¥Wš#à˜Q•w’Ø—‘  Q¨Ó1ˆØ˜q•=Ô ØˆHØ�‰�i 	 Ð*×1Ñ1Ó3Ô4Ø˜iÐ(×/Ñ/Ó1Š	Ø€Mr   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   Útargetr   )r   r5   )r   s   "r   r   r   g   s   € ÷ ;ñ ;œCð ;¤Cñ ;r   c                óX   € R\        RV  R2P                  4       4      ^,           ,
          # )zLPayload bytes left in a 510-byte line after ``PRIVMSG <target> :`` and CRLF.iþ  úPRIVMSG r    )r'   rR   ©r_   s   &r   Ú_privmsg_budgetrc   g   s)   € à”#˜  ¨Ð+×2Ñ2Ó4Ó5¸Õ9Õ:Ð:r   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   rN   r   )r5   rO   r   )r   s   "r   r   r   l   s"   € ÷ _ñ _¤Cð _¬D´­Iñ _r   c                 óX   € V  UUu. uF  p\        W!4       F  q3NK  	  K  	  upp# u uppi ©N)r\   )Ú
paragraphsrN   rM   Úchunks   &&  r   Ú_split_linesri   l   s)   € Ù#-Ô^¡:�iÔ;KÈIÖ;]°%ŠEÑ;]‰E¡:Ò^Ð^ùÓ^s   †&c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úliner   )r   Úbytes)r   s   "r   r   r   p   s   € ÷ +ñ +”sð +œuñ +r   c                 ó2   € V R ,           P                  R4      # )ú
rQ   )rR   )rk   s   &r   Ú_encode_linero   p   s   € Ø�6�M×!Ñ! 'Ó*Ð*r   c                óZ   € V ^8„  d   QhR\         R\        \        P                  ,          /# )r   Úuse_tlsr   )Úboolr   ÚsslÚ
SSLContext)r   s   "r   r   r   t   s#   € ÷ =ñ =”dð =œx¬¯©Õ7ñ =r   c                 ó@   € V '       d   \         P                  ! 4       # R # rf   )rs   Úcreate_default_context)rq   s   &r   Ú_ssl_ctxrw   t   s   € ß+2Œ3×%Ò%Ó'Ð<¸Ð<r   c                   óZ  a a€ ] tR t^zt oRtRtV 3R lt]V3R lR l4       tV3R lR lt	RR	/V3R
 lR llt
V3R lR ltR#V3R lR lltR$V3R lR lltV3R lR ltV3R lR lt]V3R lR l4       tV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R  lR! ltR"tVtV ;t# )%Ú
IRCAdapterzAAsync IRC adapter implementing the BasePlatformAdapter interface.Tc                óL  <€ \         SV `  V\        R 4      R7       \        VR/ 4      ;'       g    / p\	        VRR4      V n        \        \	        VRRR4      R4      V n        \	        VRR	R
4      V n        \	        VRR4      V n	        \        R4      pV'       d   VP                  4       \        9   MVP                  RR4      V n        \	        VRR4      V n        \	        VRR4      V n        VP                  R. 4      V n        V P"                   Uu0 uF+  p\%        V\&        4      '       g   K  VP                  4       kK-  	  upV n        VP                  R4      pVfM   \*        P,                  ! \.        4      ;_uu_ 4        ^ RIHp VP                  R 4      P4                  pRRR4       \7        T;'       g    R4      V n        RV n        RV n        RV n        V P                  V n        RV n         \B        PD                  ! 4       V n#        R# u upi   + '       g   i     Lx; i)Úirc)rJ   Úplatformr:   rE   rF   ÚIRC_PORTÚporté)  ÚIRC_NICKNAMEÚnicknameú
hermes-botrG   rH   ÚIRC_USE_TLSrq   TÚIRC_SERVER_PASSWORDÚserver_passwordÚIRC_NICKSERV_PASSWORDÚnickserv_passwordÚallowed_usersÚmax_message_lengthN)Úplatform_registryéÂ  F)$ÚsuperÚ__init__r   rI   rA   rF   r   r~   r�   rH   r?   ÚlowerÚ_TRUTHYr@   rq   r…   r‡   rˆ   Ú
isinstancer   Ú_allowed_users_lowerÚ
contextlibÚsuppressÚ	ExceptionÚgateway.platform_registryrŠ   r‰   r5   Ú_readerÚ_writerÚ
_recv_taskÚ_current_nickÚ_registeredÚasyncioÚEventÚ_registration_event)	ÚselfrJ   Úkwargsr:   Ú_use_tls_rawÚuÚmax_msgrŠ   Ú	__class__s	   &&,     €r   r�   ÚIRCAdapter.__init__   sµ  ø€ Ü‰Ñ ´¸%³ÐÔAÜ˜ ¨Ó,×2Ð2°ˆÜ# E¨<¸ÓBˆŒÜ¤¨e°ZÀÈÓ NÐPTÓUˆŒ	Ü% e¨^¸ZÈÓVˆŒÜ$ U¨M¸9ÓEˆŒÜ)¨-Ó8ˆß:F�|×)Ñ)Ó+¬wÒ6ÈEÏIÉIÐV_ÐaeÓLfˆŒÜ,¨UÐ4IÐK\Ó]ˆÔÜ!.¨uÐ6MÐObÓ!cˆÔØ#(§9¡9¨_¸bÓ#AˆÔà=A×=OÒ=OÓ)fÑ=O¸ÔS]Ð^_Ôad×Se¬)¨!¯'©'®)Ñ=OÑ)fˆÔ!Ø—)‘)Ð0Ó1ˆØŠ?Ü×$Ò$¤Y×/Õ/ÝGØ+×/Ñ/°Ó6×IÑI�÷ 0ô #& g§n n°Ó"5ˆÔØ7;ˆŒØ7;ˆŒØ26ˆŒØ!Ÿ]™]ˆÔØ ˆÔÜ#*§=¢=£?ˆÖ ùò *g÷ 0×/ús   ÄHÄ.HÆ"HÈH#	c                ó    <€ V ^8„  d   QhRS[ /# r3   r.   )r   Ú__classdict__s   "€r   r   ÚIRCAdapter.__annotate__›   s   ø€ ÷ ñ ‘cñ r   c                ó   € R # )ÚIRCr7   ©rž   s   &r   ÚnameÚIRCAdapter.nameš   s   € ár   c                ó2   <€ V ^8„  d   QhRS[ RS[ RS[RS[/# )r   ÚcodeÚmessageÚ	retryabler   ©r   rr   )r   r¦   s   "€r   r   r§   ž   s)   ø€ ÷ ñ ™#ð ©ð ¹4ð ÁDñ r   c               ó,   € V P                  WVR 7       R# )©r°   F)Ú_set_fatal_error)rž   r®   r¯   r°   s   &&&$r   Ú_failÚIRCAdapter._failž   s   € Ø×Ñ˜d°yÐÔAÙr   Úis_reconnectFc                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   r·   r   ©rr   )r   r¦   s   "€r   r   r§   ¢   s   ø€ ÷  ñ  ©Tð  ¹dñ  r   c          	   ƒ  ó>  "  € V P                   '       d   V P                  '       g*   \        P                  R4       V P	                  RRRR7      # V P                  RV P                    RV P                   2RV P                   R	V P                    24      '       g   R#  \        P                  ! \        P                  ! V P                   V P                  \        V P                  4      R
7      RR7      G Rj  x€L
 w  V n        V n        T P"                  '       d'   T P%                  RT P"                   24      G Rj  x€L
  T P%                  RT P                   24      G Rj  x€L
  T P%                  RT P                   R24      G Rj  x€L
  \        P&                  ! T P)                  4       4      T n         \        P                  ! T P,                  P/                  4       RR7      G Rj  x€L
  T P4                  '       dE   T P%                  RT P4                   24      G Rj  x€L
  \        P6                  ! ^4      G Rj  x€L
  T P%                  RT P                   24      G Rj  x€L
  T P9                  4        \        P;                  RT P                   T P                  T P<                  T P                  4       T P?                  R4       R#  ELÙ  \         dT   p\        P                  RT P                   T P                  T4       T P	                  R\!        T4      RR7      u Rp?# Rp?ii ; i ELø ELÕ EL± ELR  \0         dF    \        P                  R4       T P3                  4       G Rj  x€L 
  T P	                  RRRR7      u # i ; i ELp ELU EL25i)z:Connect to the IRC server, register, and join the channel.z*IRC: server and channel must be configuredÚconfig_missingz&IRC_SERVER and IRC_CHANNEL must be setFr³   r{   r   zIRC identity Ú@©rs   g      >@©ÚtimeoutNu&   IRC: failed to connect to %s:%s â€” %sÚconnect_failedTúPASS úNICK úUSER z 0 * :Hermes AgentzIRC: registration timed outÚregistration_timeoutz#IRC server did not send RPL_WELCOMEúPRIVMSG NickServ :IDENTIFY úJOIN z(IRC: connected to %s:%s as %s, joined %s) rF   rH   ÚloggerÚerrorrµ   Ú_acquire_platform_lockr�   r›   Úwait_forÚopen_connectionr~   rw   rq   r–   r—   r”   r   r…   Ú	_send_rawÚcreate_taskÚ_receive_loopr˜   r�   ÚwaitÚTimeoutErrorÚ
disconnectr‡   ÚsleepÚ_mark_connectedÚinfor™   Ú_wire_plugin_handlers)rž   r·   Úes   &$ r   ÚconnectÚIRCAdapter.connect¢   së  é € à�{�{ˆ{ $§,§, ,Ü�L‰LÐEÔFØ—:‘:Ð.Ð0XÐdi�:ÓjÐjà×*Ñ*¨5°T·[±[°MÀÀ4Ç=Á=À/Ð2RÐVcÐdh×dqÑdqÐcrÐrsÐtx×tÑtð  tAð  UB÷  Cò  CÙð	HÜ/6×/?Ò/?Ü×'Ò'¨¯©°T·Y±YÄHÈTÏ\É\ÓDZÔ[Ðeiô0k÷ *kÑ&ˆDŒL˜$œ,ð
 ××ÐØ—.‘. 5¨×)=Ñ)=Ð(>Ð!?Ó@×@Ð@Ø�n‰n˜u T§]¡] OÐ4Ó5×5Ð5Ø�n‰n˜u T§]¡] OÐ3EÐFÓG×GÐGÜ!×-Ò-¨d×.@Ñ.@Ó.BÓCˆŒð	mÜ×"Ò" 4×#;Ñ#;×#@Ñ#@Ó#BÈDÔQ×QÐQð
 ×!×!Ð!Ø—.‘.Ð#>¸t×?UÑ?UÐ>VÐ!WÓX×XÐXÜ—-’- Ó"×"Ð"Ø�n‰n˜u T§\¡\ NÐ3Ó4×4Ð4Ø×ÑÔÜ�‰Ð>ÀÇÁÈTÏYÉYÐX\×XjÑXjÐlp×lxÑlxÔyØ×"Ñ" 4Ô(Ùò/*køäô 	HÜ�L‰LÐAÀ4Ç;Á;ÐPT×PYÑPYÐ[\Ô]Ø—:‘:Ð.´°A³À$�:ÓGÕGûð	Húò AÚ5ÚGò RøÜô 	mÜ�L‰LÐ6Ô7Ø—/‘/Ó#×#Ñ#Ø—:‘:Ð4Ð6[Ðgk�:ÓlÒlð	múò
 YÚ"Ú4ùs  ‚$N§A4NÂNÂAK Ã8KÃ9K Ä
NÄ!NÄ=L5Ä>%NÅ#L8Å$&NÆ
L;Æ-NÆ93M Ç,L>Ç-M Ç1NÈ!NÈ$NÈ%NÉNÉ%NÉ(NÉ)A(NËK ËL2ËAL-Ì'L2Ì(NÌ-L2Ì2NÌ8NÌ;NÌ>M Í3NÍ4M7Í5NÎNÎNÎNÎNÎNc                ó   <€ V ^8„  d   QhRR/# ©r   r   Nr7   )r   r¦   s   "€r   r   r§   Ä   s   ø€ ÷ )ñ ) $ñ )r   c              ƒ  óÖ  "  € \         P                  ! \        4      ;_uu_ 4        V P                  4        RRR4       V P	                  4        V P
                  '       dú   V P
                  P                  4       '       gÚ   \         P                  ! \        4      ;_uu_ 4        V P                  R\        R4      ,           4      G Rj  x€L
  \        P                  ! R4      G Rj  x€L
  RRR4       \         P                  ! \        4      ;_uu_ 4        V P
                  P                  4        V P
                  P                  4       G Rj  x€L
  RRR4       \        V P                  4      G Rj  x€L
  RV n        RV n        RV n        V P"                  P%                  4        R#   + '       g   i     ELz; i Ló L×  + '       g   i     LÝ; i L…  + '       g   i     L‹; i Lu5i)zQuit and close the connection.NúQUIT :zplatform.irc.quit_messageg      à?F)r’   r“   r”   Ú_release_platform_lockÚ_mark_disconnectedr—   Ú
is_closingrÌ   r
   r›   rÒ   ÚcloseÚwait_closedr   r˜   r–   rš   r�   Úclearrª   s   &r   rÑ   ÚIRCAdapter.disconnectÄ   s>  é € ä× Ò ¤×+Õ+Ø×'Ñ'Ô)÷ ,à×ÑÔ!Ø�<�<ˆ< §¡× 7Ñ 7× 9Ò 9Ü×$Ò$¤Y×/Õ/Ø—n‘n X´Ð2MÓ0NÕ%NÓO×OÐOÜ—m’m CÓ(×(Ð(÷ 0ô ×$Ò$¤Y×/Õ/Ø—‘×"Ñ"Ô$Ø—l‘l×.Ñ.Ó0×0Ð0÷ 0ô ˜$Ÿ/™/Ó*×*Ð*ØˆŒØˆŒØ ˆÔØ× Ñ ×&Ñ&Ö(÷ ,×+Ð+úñ
 PÙ(÷ 0×/úñ
 1÷ 0×/úñ 	+ùs™   ‚#G)¥F'¶)G)Á G)Â "G)Â"%F?ÃF;ÃF?Ã%F=Ã&F?Ã**G)Ä8GÅGÅGÅ G)Å1G'Å25G)Æ'F8	Æ2	G)Æ;F?Æ=F?Æ?G	Ç
G)ÇGÇG$	Ç	G)c                óh   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[S[ S[3,          ,          /# )r   Úchat_idÚcontentÚreply_toÚmetadata)r   r   r   r   )r   r¦   s   "€r   r   r§   Ö   s;   ø€ ÷ 
=ñ 
=¡#ð 
=±ð 
=¹xÉ½}ð 
=Ù%¡d©3±¨8¥nÕ5ñ
=r   c              ƒ  óÆ  "  € V P                   '       d!   V P                   P                  4       '       d   \        R RR7      # V P                  W!4       FA  p V P	                  RV RV 24      G Rj  x€L
  \
        P                  ! R4      G Rj  x€L
  KC  	  \        R\        4       R7      #  L; L  \         d#   p\        R \        T4      R7      u Rp?u # Rp?ii ; i5i)	FzNot connected)ÚsuccessrÈ   ra   r    Nç333333Ó?T)rê   Ú
message_id)
r—   rß   r   Ú_split_messagerÌ   r›   rÒ   r”   r   r8   )rž   rå   ræ   rç   rè   rk   rÖ   s   &&&&&  r   ÚsendÚIRCAdapter.sendÖ   s²   é € à�|�|ˆ|˜tŸ|™|×6Ñ6×8Ò8Ü e°?ÔCÐCØ×'Ñ'¨Ö9ˆDð?Ø—n‘n x°¨y¸¸4¸&Ð%AÓB×BÐBÜ—m’m CÓ(×(Ò(ñ :ô  $´6³8Ô<Ð<ñ	 CÙ(øÜô ?Ü!¨%´s¸1³vÔ>×>ûð?üs^   ‚2C!µ!C!ÁB1Á1B-Á2B1ÂB/ÂB1ÂC!Â-B1Â/B1Â1CÂ<CÃCÃC!ÃCÃC!c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rå   r   Nr.   )r   r¦   s   "€r   r   r§   â   s   ø€ ÷ 5ñ 5©ð 5Àñ 5r   c              ƒ  ó   "  € R# 5i)u&   IRC has no typing indicator â€” no-op.Nr7   )rž   rå   rè   s   &&&r   Úsend_typingÚIRCAdapter.send_typingâ   s   é ‚ ùs   ‚c                ó<   <€ V ^8„  d   QhRS[ RS[S[ S[3,          /# )r   rå   r   ©r   r   r   )r   r¦   s   "€r   r   r§   å   s'   ø€ ÷ ^ñ ^©3ð ^±4¹¹S¸µ>ñ ^r   c              ƒ  óJ   "  € R TRVP                  R4      '       d   R/# R/# 5i)r«   ÚtypeÚgroupÚdm©Ú#Ú&)r$   )rž   rå   s   &&r   Úget_chat_infoÚIRCAdapter.get_chat_infoå   s-   é € Ø˜ °G×4FÑ4FÀz×4RÒ4R¨Ð]Ð]ÐX\Ð]Ð]ùs   ‚!#c                ó<   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          /# )r   ræ   r_   r   )r   rO   )r   r¦   s   "€r   r   r§   è   s+   ø€ ÷ gñ g¡cð g±3ð g¹4Á½9ñ gr   c           	     ó   € V P                  V4      P                  R4       Uu. uF  q3P                  4       '       g   K  VNK  	  pp\        V\	        V P
                  \        V4      4      4      ;'       g    R.# u upi )zWSplit a long message into IRC-safe chunks (510-byte line limit minus PRIVMSG overhead).Ú
r   )Ú_strip_markdownr&   Ústripri   Úminr‰   rc   )rž   ræ   r_   Úprg   s   &&&  r   rí   ÚIRCAdapter._split_messageè   sh   € à!%×!5Ñ!5°gÓ!>×!DÑ!DÀTÔ!JÓXÑ!J˜AÏgÉgÏi—a�aÑ!Jˆ
ÐXÜ˜J¬¨D×,CÑ,CÄ_ÐU[ÓE\Ó(]Ó^×fÐfÐceÐbfÐfùò Ys
   £A;¿A;c                ó&   <€ V ^8„  d   QhRS[ RS[ /# ©r   Útextr   r.   )r   r¦   s   "€r   r   r§   î   s   ø€ ÷ ñ ™cð ¡cñ r   c                óR   € \          F  w  r\        P                  ! WV 4      p K  	  V # )z-Convert basic markdown to plain text for IRC.)Ú_MARKDOWN_RULESÚreÚsub)r	  ÚpatternÚrepls   &  r   r  ÚIRCAdapter._strip_markdowní   s%   € ÷ -‰MˆGÜ—6’6˜'¨Ó.ŠDñ -àˆr   c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r   rk   r   Nr.   )r   r¦   s   "€r   r   r§   ô   s   ø€ ÷ #ñ #¡Cð #¨Dñ #r   c              ƒ  ó  "  € V P                   '       d!   V P                   P                  4       '       d   R# V P                   P                  \        V4      4       V P                   P	                  4       G Rj  x€L
  R#  L5i)zSend a raw IRC protocol line.N)r—   rß   Úwritero   Údrain©rž   rk   s   &&r   rÌ   ÚIRCAdapter._send_rawô   sP   é € à�|�|ˆ|˜tŸ|™|×6Ñ6×8Ò8ÙØ�‰×Ñœ<¨Ó-Ô.Ø�l‰l× Ñ Ó"×"Ô"ùs   ‚2BµABÁ8A?Á9Bc                ó   <€ V ^8„  d   QhRR/# rÚ   r7   )r   r¦   s   "€r   r   r§   û   s   ø€ ÷ 1ñ 1 Tñ 1r   c              ƒ  óÂ  "  € Rp V P                   '       dŸ   V P                   P                  4       '       g   V P                   P                  R4      G Rj  x€L
 ;p'       g   MRW,          pRV9   g   Ko  VP                  R^4      w  r1 V P	                  VP                  RRR7      4      G Rj  x€L
  KJ  V P                  '       dD   \        P                  R
4       V P                  RRRR7       V P                  4       G Rj  x€L
  R# R#  L¶ L_  \         d"   p\        P                  RT4        Rp?KÌ  Rp?ii ; i  \        P                   d    h \         d!   p\        P                  R	T4        Rp?LÅRp?ii ; i L~  T P                  '       dD   \        P                  R
4       T P                  RRRR7       T P                  4       G Rj  x€L 
  i i ; i5i)u6   Main receive loop â€” reads lines and dispatches them.r   i   Nó   
rQ   Úreplace©ÚerrorszIRC: error handling line: %szIRC: receive loop error: %sz*IRC: connection lost, marking disconnectedÚconnection_lostz"IRC connection closed unexpectedlyTr³   )r–   Úat_eofÚreadr&   Ú_handle_lineÚdecoder”   rÇ   Úwarningr›   ÚCancelledErrorrÈ   Úis_connectedr´   Ú_notify_fatal_error)rž   ÚbufferÚdatark   rÖ   s   &    r   rÎ   ÚIRCAdapter._receive_loopû   s�  é € àˆð	1Ø—,—,�, t§|¡|×':Ñ':×'<Ò'<Ø&*§l¡l×&7Ñ&7¸Ó&=× =Ð=˜Ö=ØØ•�Ø Ö'Ø#)§<¡<°¸Ó#;‘L�DðJØ"×/Ñ/°·±¸GÈI°Ó0VÓW×WÒWð × × Ð Ü—‘ÐKÔLØ×%Ñ%Ð&7Ð9]ÐimÐ%ÔnØ×.Ñ.Ó0×0Ò0ñ !ñ !>ñ XøÜ$ô JÜŸ™Ð'EÀq×IÒIûðJûä×%Ñ%ô 	ØÜô 	;Ü�L‰LÐ6¸×:Ñ:ûð	;úñ 1øð × × Ð Ü—‘ÐKÔLØ×%Ñ%Ð&7Ð9]ÐimÐ%ÔnØ×.Ñ.Ó0×0Ò0ð !üsÊ   ‚G†E  ˜E  ¸E  ÁDÁE  Á#F Á$E  Á5E  Â
%D Â/DÂ0D Â4E  Â6AGÄFÄGÄE  ÄD ÄD=ÄD8Ä2E  Ä8D=Ä=E  Å F ÅF Å E;Å6F Å;F Æ F ÆGÆAGÇGÇGÇGc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r   r   Nr.   )r   r¦   s   "€r   r   r§     s   ø€ ÷ +ñ +¡cð +¨dñ +r   c              ƒ  óL  "  € \        V4      pVR,          VR,          rCVR8X  d0   T P                  RV'       d
   V^ ,          MR 24      G Rj  x€L
  R# VR8X  d<   RV n        V P                  P	                  4        V'       d   V^ ,          V n        R# R# VR	8X  dÌ   \        P                  ! R
V P
                  4      ;p'       dF   V P                  P                  R4       R\        VP                  ^4      4      ^,            2V n        M5V P                  V P
                  V P                  8X  d   RMR,           V n        V P                  RV P
                   24      G Rj  x€L
  R# VR8X  dL   \        V4      ^8¼  d<   V P                  \        VR,          4      V^ ,          V^,          4      G Rj  x€L
  R# VR8X  dZ   V'       dP   \        VR,          4      P                  4       V P
                  P                  4       8X  d   V^ ,          V n        R# R# R# R#  ELÏ L½ Lm5i)z$Dispatch a single IRC protocol line.r"   r#   ÚPINGúPONG :r   NÚ001TÚ433z_(\d+)$Ú_0123456789r*   Ú_1rÂ   ÚPRIVMSGr!   ÚNICK)r,   rÌ   rš   r�   Úsetr™   r  Úsearchr�   rT   r5   rø   r'   Ú_handle_privmsgr1   rŽ   )rž   r   Úmsgr"   r#   Úsuffix_matchs   &&    r   r!  ÚIRCAdapter._handle_line  s½  é € ä  Ó%ˆØ˜i�.¨#¨h­-�Ø�fÔØ—.‘. 6·v¨&°®)À2Ð)FÐ!GÓH×HÒHØ˜ÔØ#ˆDÔØ×$Ñ$×(Ñ(Ô*ßØ%+¨A¥Y�Ö"ñ à˜ÔÜ!Ÿyšy¨°T×5GÑ5GÓHÐHˆ|ÖHØ(,¯©×(<Ñ(<¸]Ó(KÐ'LÈAÌcÐR^×RdÑRdÐefÓRgÓNhÐklÕNlÐMmÐ%n�Õ"à%)§]¡]¸T×=OÑ=OÐSW×S`ÑS`Ô=`±cÐfjÕ%k�Ô"Ø—.‘. 5¨×);Ñ);Ð(<Ð!=Ó>×>Ò>Ø˜	Ô!¤c¨&£k°QÔ&6Ø×&Ñ&¤}°S¸µ]Ó'CÀVÈAÅYÐPVÐWXÕPYÓZ×ZÒZØ˜Ô§6¬m¸CÀ½MÓ.J×.PÑ.PÓ.RÐVZ×VhÑVh×VnÑVnÓVpÔ.pØ!'¨¥ˆDÖñ /q¡6Ñò Iñ ?áZùsP   ‚7H$ºH$ÁHÁ5H$ÂAH$ÃBH$Å"H Å#AH$Æ4H"Æ5H$Ç
AH$È H$È"H$c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[ RR/# )r   Úsender_nickr_   r	  r   Nr.   )r   r¦   s   "€r   r   r§   )  s0   ø€ ÷ Qñ Q±ð Q¹cð QÉð QÐQUñ Qr   c              ƒ  óD  "  € VP                  4       V P                  P                  4       8X  d   R # VP                  R4      '       d#   VP                  R4      '       d   RV RV^R  2pVP                  R4      '       d   R # VP                  R4      pV'       d‡   V P                   R2V P                   R2V P                   R23 FT  pVP                  4       P                  VP                  4       4      '       g   K8  V\	        V4      R  P                  4       p M	  R # V P                  '       d8   VP                  4       V P                  9  d   \        P                  RV4       R # T P                  Y4'       d   TMTV'       d   RMR	WR
7      G R j  x€L
  R #  L5i)NzACTION Úz* r   r   Ú,z/IRC: ignoring message from unauthorized user %srø   rù   )r	  rå   Ú	chat_typeÚuser_idÚ	user_nameéÿÿÿÿrú   )
rŽ   r™   r$   Úendswithr'   r  r‘   rÇ   ÚdebugÚ_dispatch_message)rž   r;  r_   r	  Ú
is_channelr!   s   &&&&  r   r6  ÚIRCAdapter._handle_privmsg)  se  é € Ø×ÑÓ $×"4Ñ"4×":Ñ":Ó"<Ô<ÙØ�?‰?˜=×)Ò)¨d¯m©m¸F×.CÒ.CØ˜�} A d¨1¨R j \Ð2ˆDØ�?‰?˜6×"Ò"ÙØ×&Ñ& zÓ2ˆ
çØ"×0Ñ0Ð1°Ð3¸×8JÑ8JÐ7KÈ1Ð5MÐRV×RdÑRdÐQeÐefÐOgÓh�Ø—:‘:“<×*Ñ*¨6¯<©<«>×:Ô:Ø¤ F£ Ð-×3Ñ3Ó5�DÙñ iñ
 Ø×$×$Ð$¨×):Ñ):Ó)<ÀD×D]ÑD]Ô)]Ü�L‰LÐJÈKÔXÙØ×$Ñ$¨$Æ*¹ÐR]ß:D©wÈ$Ø-8ð %ó Q÷ 	Qô 	Qùs8   ‚AF Á	F Á !F ÂA:F Ä3F Ä5AF Æ
F ÆFÆF c                ó<   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[ RR/# )r   r	  rå   r?  r@  rA  r   Nr.   )r   r¦   s   "€r   r   r§   @  sB   ø€ ÷ pñ p©Cð p¹#ð pÉ#ð pÑX[ð pÑhkð pÐptñ pr   c           
   ƒ  ó>  "  € V P                   '       g   R# V P                  W"W4VR7      pV P                  \        V\        P
                  V\        P                  ! 4       P                  \        P                  P                  4       R7      4      G Rj  x€L
  R#  L5i)z;Build a MessageEvent and hand it to the base class handler.N)rå   Ú	chat_namer?  r@  rA  )r	  Úmessage_typeÚsourcerì   Ú	timestamp)Ú_message_handlerÚbuild_sourceÚhandle_messager   r   ÚTEXTÚuuidÚuuid4ÚhexÚdatetimeÚnow)rž   r	  rå   r?  r@  rA  rL  s   &&&&&& r   rE  ÚIRCAdapter._dispatch_message@  s…   é € à×$×$Ð$ÙØ×"Ñ"Ø¸)Ð`ið #ó kˆð ×!Ñ!¤,°DÄ{×GWÑGWÐ`fÜ:>¿*º*»,×:JÑ:JÔV^×VgÑVg×VkÑVkÓVmô#oó p÷ 	pô 	pùs   ‚BBÂBÂB)r‘   r™   r–   r˜   rš   r�   r—   rˆ   rH   r‰   r�   r‡   r~   rF   r…   rq   )NNrf   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úserial_receive_loopr�   Úpropertyr«   rµ   r×   rÑ   rî   rò   rý   rí   Ústaticmethodr  rÌ   rÎ   r!  r6  rE  Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r£   r¦   s   @@r   ry   ry   z   sÉ   ù‡ € ÙKàÐõ3ð6 ÷ó ð÷ð ð °E÷  ò  ÷D)ð )÷$
=ò 
=÷5ò 5÷^ð ^÷gð gð
 ÷ó ð÷#ð #÷1ð 1÷0+ð +÷,Qð Q÷.p÷ pð pr   ry   c                ó$   € V ^8„  d   QhR\         /# r3   r¹   )r   s   "r   r   r   M  s   € ÷ `ñ `œDñ `r   c                 óT   € \        \        RR4      ;'       d    \        RR4      4      # )zNCheck if IRC is configured via env (server + channel; no pip packages needed).rE   r   rG   )rr   r?   r7   r   r   Úcheck_requirementsre  M  s&   € äÔ" <°Ó4×^Ð^Ô9KÈMÐ[]Ó9^Ó_Ð_r   c                ó$   € V ^8„  d   QhR\         /# r3   r¹   )r   s   "r   r   r   R  s   € ÷ $ñ $œtñ $r   c                óF   € \        V 4      w  r\        T;'       d    T4      # )zRValidate that the platform config (env or config.yaml) has enough info to connect.)rK   rr   )rJ   rF   rH   s   &  r   Úvalidate_configrh  R  s!   € ä% fÓ-�O€FÜ�×"Ð"˜7Ó#Ð#r   c                ó   € V ^8„  d   QhRR/# rÚ   r7   )r   s   "r   r   r   X  s   € ÷ EYñ EY˜4ñ EYr   c                 ó°  aaaa€ ^ RI HoHp HoHpHpHoHoHp ^ RI	H
p R V3R llpR VVV3R llpV! R4       V! R4      pV! RR	R4      '       d   R
# V! RR4       \        4        T! RRT;'       g    RR4      '       g   R
# V ! RR4      pS! RV'       d   RMR4       V'       d   RMRp	S! RV	 R2V! R4      ;'       g    RR7      p
V
'       d    S! R\        \        V
4      4      4       MV! R4      '       d
   S! RR4       R. F)  w  r¼pT! Y¼V! V4      ;'       g    RV4      '       d   K(   R
# 	  \        4        V! RR4       R/ F3  w  rëpV ! VR4      '       g   K  S! VRR7      ;p'       g   K+  S! WÏ4       K5  	  \        4        V! R R!R"R#4       V ! R$R4      '       d   S! R%R4       S! R&R4       S! R'4       M^S! R%R4       S! R(V! R&4      ;'       g    RR7      pV'       d#   S! R&VP                  R)R4      4       V! R*4       MS! R&R4       S! R+4       \        4        V! R,4       S! R-4       R
#   \         d    S! RT	 24        ELMi ; i)0za`hermes gateway setup` flow (lazy hermes_cli imports keep the plugin importable outside the CLI).)ÚpromptÚprompt_yes_noÚsave_env_valueÚget_env_valueÚprint_headerÚ
print_infoÚprint_warningÚprint_success)Údeclines_reconfigurec                ó(   € V ^8„  d   QhR\         RR/# )r   Úlinesr   Nr.   )r   s   "r   r   Ú'interactive_setup.<locals>.__annotate__^  s   € ÷ ñ ”Sð ˜Tñ r   c                  ó*   <€ V  F  pS! V4       K  	  R # rf   r7   )ru  rk   rp  s   * €r   rÔ   Úinteractive_setup.<locals>.info^  s   ø€ ÛˆDÙ�tÖó r   c          
      óT   € V ^8„  d   QhR\         R\         R\         R\         R\        /# )r   Úlabelr;   r=   Úwhatr   r±   )r   s   "r   r   rv  b  s/   € ÷ ñ œð ¤3ð ´ð ¼Cð ÄDñ r   c                 óp   <€ S! WR 7      pV'       g   S! V R24       R# S! WP                  4       4       R# )©r=   u#    is required â€” skipping IRC setupFT)r  )rz  r;   r=   r{  Úvaluerq  rk  rm  s   &&&& €€€r   Ú	_requiredÚ$interactive_setup.<locals>._requiredb  s4   ø€ Ù�uÔ.ˆßÙ˜T˜FÐ"EÐFÔGÙÙ�sŸK™K›MÔ*Ùr   r©   rE   zReconfigure IRC?NuR   Connect Hermes to an IRC network. Uses Python stdlib â€” no extra packages needed.z<   Works with Libera.Chat, OFTC, your own ZNC/InspIRCd, etc.z*IRC server hostname (e.g. irc.libera.chat)r   ÚServerzUse TLS (recommended)?Trƒ   ÚtrueÚfalseÚ6697Ú6667zPort (default Ú)r}   r}  u   Invalid port â€” using default u   ðŸ”‘ Optional authenticationz   Leave blank to skip.F)Úpasswordu5   ðŸ”’ Access control: restrict who can message the botuA      IRC nicks are not authenticated â€” anyone can claim any nick.zD   For public channels, pair with NickServ-only mode on your networkz,   if you want stronger identity guarantees.z2Allow all users in the channel to talk to the bot?ÚIRC_ALLOW_ALL_USERSÚIRC_ALLOWED_USERSuD   âš ï¸�  Open access â€” any nick in the channel can command the bot.z=Allowed nicks (comma-separated, leave empty to deny everyone)r   zAllowlist configureduJ   No nicks allowed â€” the bot will ignore all messages until you add nicks.z)IRC configuration saved to ~/.hermes/.envzFRestart the gateway for changes to take effect: hermes gateway restart))zBot nickname (e.g. hermes-bot)r€   ÚNickname)u>   Channel to join (e.g. #hermes â€” comma-separate for multiple)rG   ÚChannel))z+Configure a server password (PASS command)?zServer passwordr„   )z"Identify with NickServ on connect?zNickServ passwordr†   )Úhermes_cli.setuprk  rl  rm  rn  ro  rp  rq  rr  Úhermes_cli.setup_platformsrs  Úprintr   r5   Ú
ValueErrorr  )rl  rn  ro  rr  rs  rÔ   r  Úexisting_serverrq   Údefault_portr~   rz  r;   r{  ÚquestionÚsecretÚallowedrp  rq  rk  rm  s                    @@@@r   Úinteractive_setupr•  X  si  û€ ÷v÷ vó vå?÷ð ÷ò ñ �ÔÙ# LÓ1€OÙ˜EÐ#5°|×DÒDÙÙÐ	]Ø	GôIä	„GÙÐAÀ<ÐQ`×QfÐQfÐdfÐhp×qÒqÙÙÐ4°dÓ;€GÙ�=¯G¡&¸ÔAß$‘6¨&€LÙ�N < .°Ð2¹MÈ*Ó<U×<[Ð<[ÐY[Ô\€Dßð	LÙ˜:¤s¬3¨t«9£~Õ6ñ 
�z×	"Ò	"Ù�z 2Ô&ó{Ñˆ�Dá˜¡]°3Ó%7×%=Ð%=¸2¸t×DÔDÚñ{ô 
„GÙÐ	'Ð)BÔCó!^Ñˆ˜ñ ˜ 5×)Ô)¹ÀÐPTÔ9UÐ/U¨v×/UÐ/UÙ˜3Ö'ñ	!^ô
 
„GÙÐ	@Ø	LØ	OØ	7ô9ñ ÐIÈ5×QÒQÙÐ,¨fÔ5ÙÐ*¨BÔ/ÙÐ\Õ]áÐ,¨gÔ6ÙÐXÙ!.Ð/BÓ!C×!IÐ!IÀrôKˆçÙÐ.°·±ÀÀRÓ0HÔIÙÐ0Õ1áÐ.°Ô3ÙÐcÔdÜ	„GÙÐ=Ô>ÙÐWÖXøôI ô 	LÙÐ;¸L¸>ÐJ×Kð	Lús   ÃH; È;IÉIc                ó$   € V ^8„  d   QhR\         /# r3   r¹   )r   s   "r   r   r      s   € ÷ #ñ #œDñ #r   c                ó   € \        V 4      # )z5Check whether IRC is configured (env or config.yaml).)rh  )rJ   s   &r   r%  r%     s   € ä˜6Ó"Ð"r   c                ó2   € V ^8„  d   QhR\         R,          /# rÚ   )r   )r   s   "r   r   r   ¥  s   € ÷ :ñ :œ �ñ :r   c                 óÚ   € \        RR4      P                  4       p \        RR4      P                  4       pV '       d	   V'       g   R# \        RR\        3RRRR	 3RR3R
VR7      pRV RV/VC# )aW  ``env_enablement_fn``: seed ``PlatformConfig.extra`` from the profile's env BEFORE adapter construction;
``None`` when IRC isn't minimally configured. Passwords also live in extra for back-compat with
config.yaml users; env wins at construct time. Home channel defaults to IRC_CHANNEL so cron
``deliver=irc`` has a target without extra config.rE   r   rG   Nr}   r~   rƒ   rq   c                 ó0   € V P                  4       \        9   # rf   )rŽ   r�   )Úvs   &r   Ú<lambda>Ú!_env_enablement.<locals>.<lambda>°  s   € ¨Q¯W©W«Y¼'Ò-Ar   ÚIRC_HOME_CHANNEL)Úhome_envÚhome_defaultrF   rH   )r€   r�   N)r„   r…   N)r†   r‡   N)r?   r  Ú_seed_extra_from_envr5   )rF   rH   Úseeds      r   Ú_env_enablementr£  ¥  s€   € ô
   ¨bÓ1×7Ñ7Ó9€FÜ  °Ó3×9Ñ9Ó;€Gß—wÙÜØ	�VœSÐ!Ð#EØ	˜	Ñ#AÐBØ8Ð:nð!ð #°ô	:€Dð
 �f˜i¨Ð9°DÐ9Ð9r   c                ó0   € V ^8„  d   QhR\         R\         /# r  r.   )r   s   "r   r   r   ·  s   € ÷ Jñ J¤3ð J¬3ñ Jr   c                óf   € V P                  RR4      P                  RR4      P                  RR4      # )zRNeutralise CR/LF (IRC command injection vector) and the protocol-illegal NUL byte.Úr   r  Ú r   )r  )r	  s   &r   Ú_strip_irc_control_charsr¨  ·  s-   € à�<‰<˜˜cÓ"×*Ñ*¨4°Ó5×=Ñ=¸fÀbÓIÐIr   c                ó0   € V ^8„  d   QhR\         R\        /# r^   r±   )r   s   "r   r   r   ¼  s   € ÷ 0ñ 0œCð 0¤Dñ 0r   c                 ó@   € \        V 4      ;'       d    V ^ ,          R9   # )é    z#&+!r¹   rb   s   &r   Ú_is_irc_channelr¬  ¼  s   € Ü�‹<×/Ð/˜F 1�I¨Ñ/Ð/r   c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# )r   Údetailr   rõ   )r   s   "r   r   r   À  s"   € ÷ 8ñ 8”cð 8œd¤3¬ 8�nñ 8r   c                 ó   € \        R V  24      # )zIRC standalone send: )r	   )r®  s   &r   Ú	_sa_errorr°  À  s   € ÜÐ-¨f¨XÐ6Ó7Ð7r   c                   ól   a € ] tR tRt o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R	 lR
 ltRt	V t
R# )Ú_StandaloneConniÄ  zZRaw line I/O for ``_standalone_send``; ``pump`` answers PINGs while waiting for a numeric.c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# )r   ÚreaderÚwriter)r›   ÚStreamReaderÚStreamWriter)r   r¦   s   "€r   r   Ú_StandaloneConn.__annotate__Ç  s'   ø€ ÷ 0ñ 0™w×3Ñ3ð 0¹W×=QÑ=Qñ 0r   c                óV   € WuV n         V n        \        P                  ! 4       V n        R # rf   )r´  rµ  r›   Úget_running_loopÚ_loop)rž   r´  rµ  s   &&&r   r�   Ú_StandaloneConn.__init__Ç  s    € Ø#)Ð ˆŒ�T”[Ü×-Ò-Ó/ˆŽ
r   c                ó$   <€ V ^8„  d   QhRS[ RR/# r  r.   )r   r¦   s   "€r   r   r¸  Ë  s   ø€ ÷ "ñ "™cð " dñ "r   c              ƒ  óž   "  € V P                   P                  \        V4      4       V P                   P                  4       G R j  x€L
  R #  L5irf   )rµ  r  ro   r  r  s   &&r   r   Ú_StandaloneConn.rawË  s2   é € Ø�‰×Ñœ, tÓ,Ô-Ø�k‰k×ÑÓ!×!Ô!ùs   ‚AAÁAÁAc                ó    <€ V ^8„  d   QhRS[ /# )r   r¿   )Úfloat)r   r¦   s   "€r   r   r¸  Ï  s   ø€ ÷ ñ ¡%ñ r   c              ƒ  ó¤  "  € V P                   P                  4       V,           pW0P                   P                  4       ,
          ;p^ 8”  dÐ    \        P                  ! V P                  P                  R4      VR7      G Rj  x€L
 p\        TP                  RRR7      P                  R4      4      pTR,          R	8X  d>   T P                  R
TR,          '       d   TR,          ^ ,          MR 24      G Rj  x€L
  K×  T! TR,          4      G Rj  x€L
 ;pf   Kô  T# R#  L›  \         d     R# \        P                   d
    \        u # i ; i LW L@5i)zZFeed commands to ``on_msg`` until it returns non-None; None on timeout, ``_EOF`` on close.r  r¾   NrQ   r  r  rn   r"   r,  r-  r#   r   )r»  r6   r›   rÊ   r´  Ú	readuntilrÐ   ÚIncompleteReadErrorÚ_EOFr,   r"  rT   r   )rž   r¿   Úon_msgÚdeadlineÚ	remainingÚraw_liner7  Úresults   &&&     r   ÚpumpÚ_StandaloneConn.pumpÏ  s  é € à—:‘:—?‘?Ó$ wÕ.ˆØ$§z¡z§¡Ó'8Õ8Ð8ˆy¸AÔ=ðÜ!(×!1Ò!1°$·+±+×2GÑ2GÈÓ2PÐZcÔ!d×d�ô
 % X§_¡_°WÀY _Ó%O×%VÑ%VÐW]Ó%^Ó_ˆCØ�9�~ Ô'Ø—h‘h ¸CÀ¿M¼M¨¨H­°aÖ(8ÈrÐ'RÐSÓT×TÒTÙ"(¨¨Y­Ó"8×8Ð8�&ÔEØ�Ùñ eøÜô ÚÜ×.Ñ.ô Ü’ðúñ UÙ8ùsy   ‚A	EÁ4D Â DÂD ÂAEÃEÃ4EÃ5EÄEÄEÄEÄD ÄE	Ä)EÄ,E	Ä?E	ÅEÅE	Å	EÅEc                ó   <€ V ^8„  d   QhRR/# rÚ   r7   )r   r¦   s   "€r   r   r¸  à  s   ø€ ÷ Kñ K˜Tñ Kr   c              ƒ  ó4  "  € \         P                  ! \        4      ;_uu_ 4        V P                  P	                  4        \
        P                  ! V P                  P                  4       R R7      G Rj  x€L
  RRR4       R#  L  + '       g   i     R# ; i5i)ç      @r¾   N)r’   r“   r”   rµ  rà   r›   rÊ   rá   rª   s   &r   rà   Ú_StandaloneConn.closeà  s_   é € Ü× Ò ¤×+Õ+Ø�K‰K×ÑÔÜ×"Ò" 4§;¡;×#:Ñ#:Ó#<ÀcÔJ×JÐJ÷ ,Ñ+áJ÷ ,×+Ð+üs/   ‚#B¥ABÁ3BÁ4BÁ8
BÂBÂB	Â	B)r»  r´  rµ  N)rX  rY  rZ  r[  r\  r�   r   rË  rà   r`  ra  )r¦   s   @r   r²  r²  Ä  s2   ø‡ € Ùd÷0ð 0÷"ð "÷ð ÷"Kö Kr   r²  c                ó€   € V ^8„  d   QhR\         R\        R\        R\        \        \        \        3,          ,          /# )r   ÚconnÚ	nick_baser…   r   ©r²  r   r   r   r   )r   s   "r   r   r   æ  s;   € ÷ 6ñ 6œ_ð 6¼ð 6Ìsð 6ÔW_Ô`dÔehÔjmÐemÕ`nÕWoñ 6r   c              ƒ  ó²  a aaa"  € ^ oS R2R,          oR V VVV3R llpV'       d&   S P                  R\        V4       24      G Rj  x€L
  S P                  RS 24      G Rj  x€L
  S P                  RS R	24      G Rj  x€L
  S P                  R
V4      G Rj  x€L
 pVf   \        R4      # V\        J d   \        R4      # VRJ d   R# T#  L… Lk LP L85i)zdPASS/NICK/USER and wait for 001, retrying nick collisions; returns an error dict or None on success.z-cronºNé   Nc                ó$   € V ^8„  d   QhR\         /# ©r   Úcmdr.   )r   s   "r   r   Ú"_sa_register.<locals>.__annotate__ë  s   € ÷ .ñ .¤Cñ .r   c              “   óì   <"  € V R
9   dG   S^,          oS^8”  d   \        R4      # S RS 2R,          oSP                  RS 24      G Rj  x€L
  MV R9   d   \        RV  R24      # V R8X  d   R	# R#  L&5i)Ú432ztoo many nick collisionsz-cron-rÖ  rÂ   Nzserver rejected client (r†  r.  T>   rÝ  r/  >   Ú464Ú465)r°  r   )rÚ  rÒ  Únick_attemptsrÓ  Ústandalone_nicks   &€€€€r   Ú_on_registrationÚ&_sa_register.<locals>._on_registrationë  sŽ   øé € à�.Ô Ø˜QÕˆMØ˜qÔ Ü Ð!;Ó<Ð<à!* ¨6°-°ÐAÀ#ÕFˆOØ—(‘(˜U ?Ð"3Ð4Ó5×5Ñ5Ø�NÔ"ÜÐ7¸°u¸AÐ>Ó?Ð?Ø˜e”|ˆtÐ-¨Ð-ñ 6ùs   ƒAA4ÁA2Á'A4rÁ   NrÂ   rÃ   z 0 * :Hermes Agent (cron)ç      .@z%registration timeout (no RPL_WELCOME)z,server closed connection during registrationT)r   r¨  rË  r°  rÅ  )rÒ  rÓ  r…   râ  Ú
registeredrà  rá  s   ff&  @@r   Ú_sa_registerræ  æ  sÝ   ûé € à€MØ"˜ 5Ð)¨#Õ.€O÷.ó .÷ Ø�h‰h˜Ô7¸ÓHÐIÐJÓK×KÐKØ
�(‰(�U˜?Ð+Ð,Ó
-×-Ð-Ø
�(‰(�U˜?Ð+Ð+DÐEÓ
F×FÐFØ—y‘y Ð'7Ó8×8€JØÒÜÐ@ÓAÐAØ”TÓÜÐGÓHÐHØ Ó%ˆ4Ð5¨:Ð5ñ 	LÙ-ÙFÙ8ùsH   †ACÁ	CÁ
CÁ%CÁ&CÂCÂCÂCÂ3CÃCÃCÃCc          	      ót   € V ^8„  d   QhR\         R\        R\        \        \        \        3,          ,          /# )r   rÒ  r_   r   rÔ  )r   s   "r   r   r     s.   € ÷ 	8ñ 	8œð 	8´#ð 	8¼(Ä4ÌÌSÈÅ>Õ:Rñ 	8r   c              ƒ  óÆ   a"  € R V3R llpV P                  RS 24      G Rj  x€L
  V P                  RV4      G Rj  x€L
 p\        V\        4      '       d   V# R#  L8 L 5i)ziJOIN a channel target (+n channels drop PRIVMSG from non-members); error dict only on explicit rejection.c                ó$   € V ^8„  d   QhR\         /# rÙ  r.   )r   s   "r   r   Ú_sa_join.<locals>.__annotate__  s   € ÷ 8ñ 8œCñ 8r   c              “   óT   <"  € V R9   d   \        RS RV  R24      # V R9   d   R# R# 5i)Ú403rÆ   z rejected (r†  TN>   rì  Ú405Ú471Ú473Ú474Ú475>   Ú366ÚJOIN)r°  )rÚ  r_   s   &€r   Ú_on_joinÚ_sa_join.<locals>._on_join  s;   øé € ØÐ<Ô<Ü˜u V H¨K¸°u¸AÐ>Ó?Ð?Ø˜oÔ-ˆtÐ7°4Ð7ùs   ƒ%(rÆ   NrÏ  )r   rË  r�   r   )rÒ  r_   rô  Újoineds   &f  r   Ú_sa_joinr÷    s]   øé € ÷8ð 8ð �(‰(�U˜6˜(Ð#Ó
$×$Ð$à—9‘9˜S (Ó+×+€FÜ ¬×-Ò-ˆ6Ð7°4Ð7ñ %á+ùs   ƒ!A!¤A¥A!¾A¿A!ÁA!Ú	thread_idÚmedia_filesÚforce_documentFc                óÄ   € V ^8„  d   QhR\         R\         R\        \         ,          R\        \        \         ,          ,          R\        R\        \         \
        3,          /# )r   rå   r¯   rø  rù  rú  r   )r   r   rO   rr   r   r   )r   s   "r   r   r     sS   € ÷ ;ñ ;¬Sð ;¼3ð ;ÌhÔWZÍmð ;Ü(0´´cµÕ(;ð;ÜTXð;ÜeiÔjmÔorÐjrÕesñ;r   c          	   ƒ  óø	  a"  € \        V R/ 4      ;'       g    / p\        V 4      w  rxV'       d	   V'       g   \        R4      # \        VRRR4      p	 \	        V	4      p
\        R4      pTe   TP                  4       \        9   M\        TP                  R	R
4      4      pT;'       g    To\        ;QJ d    T3R lR+ 4       F  '       g   K   R
M	  RM! T3R lR+ 4       4      '       d   \        R4      # \        TRRR4      P                  R4      R,          ;'       g    Rp\        P                  T4      p \         P"                  ! \         P$                  ! Yz\'        T4      R7      RR7      G Rj  x€L
 w  pp\/        TT4      p \1        TT\        TRR4      4      G Rj  x€L
 ;p'       d   TTP3                  4       G Rj  x€L
  # \        TRR4      ;p'       dD   TP5                  R\7        T4       24      G Rj  x€L
  \         P8                  ! ^4      G Rj  x€L
  \;        S4      '       d7   \=        TS4      G Rj  x€L
 ;p'       d   TTP3                  4       G Rj  x€L
  # R TP?                  R4       4        Uu. uF  pT'       g   K  TNK  	  pp\A        T\C        S4      4      pT F@  pTP5                  RS RT 24      G Rj  x€L
  \         P8                  ! R 4      G Rj  x€L
  KB  	  T'       g$   \        R!4      TP3                  4       G Rj  x€L
  # TP5                  R"\E        R#4      ,           4      G Rj  x€L
  \F        PH                  ! \         PJ                  4      ;_uu_ 4        \         P"                  ! TPM                  R$4      R%R7      G Rj  x€L
  RRR4       R&R
R'\O        4       /TP3                  4       G Rj  x€L
  #   \
        \        3 d    \        RT	: 24      u # i ; i EL†  \         P(                   d    h \*         d   p\-        RT 24      u Rp?# Rp?ii ; i EL” ELv EL> EL# EL ELãu upi  EL€ ELe EL: EL L¹  + '       g   i     L¿; i L¡  \         P(                   d    h \*         dI   p\P        PS                  R(R
R)7       \-        R*T 24      u Rp?TP3                  4       G Rj  x€L 
  # Rp?ii ; i  TP3                  4       G Rj  x€L 
  i ; i5i),a  Open an ephemeral IRC connection, send a PRIVMSG, and quit (out-of-process cron delivery via
``send_message_tool``). Uses a distinct ``-cron`` nick so it never collides with the live gateway adapter.
``thread_id``/``media_files`` are accepted for signature parity only.r:   z-IRC_SERVER and IRC_CHANNEL must be configuredr}   r~   r   zinvalid port rƒ   Nrq   Tc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irf   r7   )Ú.0Úchr_   s   & €r   Ú	<genexpr>Ú#_standalone_send.<locals>.<genexpr>!  s   øé € Ð
<Ñ";˜B�Ž<Ó";ùs   ƒr  Fz'chat_id contains illegal IRC charactersr€   r�   r‚   z_0123456789-:Né   Nr½   rä  r¾   zIRC standalone connect failed: r„   r…   r†   r‡   rÅ   c              3   óT   "  € T F  p\        V4      P                  4       x € K   	  R # 5irf   )r¨  rT   )rþ  r  s   & r   r   r  9  s$   é € Ð!bÑPaÈ1Ô":¸1Ó"=×"DÑ"D×"FÐ"FÓPaùs   ‚&(ra   r    rë   zempty message after strippingrÜ   zplatform.irc.standalone_quiti   g       @rê   rì   zIRC standalone send raised)Úexc_infozIRC standalone send failed: )r¦  r  r§  r   )*rI   rK   r°  rA   r5   Ú	TypeErrorr�  r?   rŽ   r�   rr   r@   ÚanyrT   ry   r  r›   rÊ   rË   rw   r$  r”   r	   r²  ræ  rà   r   r¨  rÒ   r¬  r÷  r&   ri   rc   r
   r’   r“   rÐ   r   r8   rÇ   rD  )Úpconfigrå   r¯   rø  rù  rú  r:   rF   rH   Ú
port_valuer~   Úuse_tls_envrq   rÓ  Úplainr´  rµ  rÖ   rÒ  rÈ   r‡   Úqrg   ru  rk   r_   s   &&&$$$                   @r   Ú_standalone_sendr    s3  øé € ô
 �G˜W bÓ)×/Ð/¨R€EÜ% gÓ.�O€FßŸÜÐHÓIÐIÜ˜u j°&¸$Ó?€Jð9Ü�:‹ˆô % ]Ó3€KØ0;Ò0Gˆk×ÑÓ!¤WÒ,ÌTÐRW×R[ÑR[Ð\eÐgkÓRlÓMm€Gà×Ð˜€Fß
ƒsÔ
<Ñ";Ó
<‡s‡s‚sÔ
<Ñ";Ó
<×<Ò<ÜÐBÓCÐCä˜e ^°ZÀÓN×UÑUÐVdÓeÐfiÕj×zÐzÐnz€IÜ×&Ñ& wÓ/€EðAÜ&×/Ò/Ü×#Ò# F´h¸wÓ6GÔHÐRVô X÷ X‰ˆ�ô ˜6 6Ó*€DðÜ& t¨Y¼ÀeÐMbÐduÓ8vÓw×wÐwˆ5ÖwØð4 �j‰j‹l×Ñô3 !.¨eÐ5LÐNaÓ bÐbÐÖbØ—(‘(Ð8Ô9QÐRcÓ9dÐ8eÐfÓg×gÐgÜ—-’- Ó"×"Ð"ä˜6×"Ò"´xÀÀfÓ7M×1MÐ(M¨Ö(MØð( �j‰j‹l×Ññ# "cÐPU×P[ÑP[Ð\`ÔPaÔ!bÓhÑ!b˜AÔfg—a�aÑ!bˆ
ÐhÜ˜Z¬¸Ó)@ÓAˆÛˆDØ—(‘(˜X f X¨R°¨vÐ6Ó7×7Ð7Ü—-’- Ó$×$Ò$ñ ÷ ÜÐ<Ó=ð �j‰j‹l×Ñð �h‰h�x¤!Ð$BÓ"CÕCÓD×DÐDÜ× Ò ¤×!5Ñ!5×6Õ6Ü×"Ò" 6§;¡;¨tÓ#4¸cÔB×BÐB÷ 7à˜4 ¬v«xÐ8ð �j‰j‹l×Ñøô_ ”zÐ"ô 9Ü˜=¨©Ð7Ó8Ò8ð9úòXøä×!Ñ!ô ØÜô AÜÐ;¸A¸3Ð?Ó@Õ@ûðAúò xò6 	ò1 hÚ"â1Mò* 	ùò# iò 8Ú$ò 	ò 	EáB÷ 7×6úñ 	øô ×!Ñ!ô ØÜô >Ü�‰Ð1¸DˆÔAÜÐ8¸¸Ð<Ó=Ô=à�j‰j‹l×Òûð	>ûð �j‰j‹l×Òüs-  ƒ4S:¸S:ÁO ÁA	S:Â'S:Â5S:ÃS:Ã*5S:Ä S:Ä9:O< Å3O9Å4O< Å;S:ÆQ1 Æ#P7Æ$Q1 Æ0Q1 Æ1S:ÇP:ÇS:Ç
5Q1 Ç?P=È Q1 ÈQ È$Q1 ÉQÉQ1 ÉQ1 ÉS:É#QÉ$S:É)Q1 Ê
Q	ÊQ	Ê6Q1 ËQËQ1 Ë,QË-Q1 Ë=
Q1 ÌS:ÌQÌS:Ì $Q1 ÍQÍ0Q1 Í5+QÎ QÎ!QÎ%Q1 Î:S:ÏQ/ÏS:Ï O6Ï3S:Ï5O6Ï6S:Ï9O< Ï<P4ÐP4ÐP/Ð)P4Ð*S:Ð/P4Ð4S:Ð7Q1 Ð:S:Ð=Q1 Ñ Q1 ÑQ1 ÑS:Ñ	Q1 ÑQ1 ÑS:ÑQ1 ÑQÑQ,	Ñ'Q1 Ñ/S:Ñ1SÒSÒ$SÒ5SÒ6S Ò:S:ÓSÓS:ÓSÓS ÓS7Ó0S3Ó1S7Ó7S:c                óŽ   € V P                  RRRR\        \        \        \        . ROR\
        \        R\        RRR	R
RRRR7       R# )z7Plugin entry point: called by the Hermes plugin system.r{   z:Relay messages between an IRC channel (or DMs) and Hermes.zChttps://hermes-agent.nousresearch.com/docs/user-guide/messaging/ircr©   z&No extra packages needed (stdlib only)rž  r‰  rˆ  r‹   u   ðŸ’¬FTu  You are chatting via IRC. IRC does not support markdown formatting â€” use plain text only. Messages are limited to ~450 characters per line (long messages are automatically split). In channels, users address you by prefixing your nick. Keep responses concise and conversational.)r«   Údashboard_descriptionÚdocs_urlrz  Úadapter_factoryÚcheck_fnrh  r%  Úrequired_envÚinstall_hintÚsetup_fnÚenv_enablement_fnÚcron_deliver_env_varÚstandalone_sender_fnÚallowed_users_envÚallow_all_envr‰   ÚemojiÚpii_safeÚallow_update_commandÚplatform_hintN)rE   rG   r€   )Úregister_platformry   re  rh  r%  r•  r£  r  )Úctxs   &r   Úregisterr   M  sX   € à×ÑØØZØVØÜ"Ü#ô (Ü!ÚBØ=Ü"Ü)Ø/Ü-Ø-Ø+ØØØØ!ðð1 ö  r   >   Ú1Úyesr‚  ))z\*\*(.+?)\*\*ú\1)z	__(.+?)__r#  )z	\*(.+?)\*r#  )z(?<!\w)_(.+?)_(?!\w)r#  )z`(.+?)`r#  )z	```\w*\n?r   )z!\[([^\]]*)\]\(([^)]+)\)z\2)z\[([^\]]+)\]\(([^)]+)\)z\1 (\2))r   )@r\  r›   rU  r’   Úloggingr  rs   r6   rR  Útypingr   r   r   r   Úgateway.platforms._sharedr   r   r?   r   r¡  r	   Ú
agent.i18nr
   Úgateway.platforms.baser   r   Úgateway.platforms.helpersr   Úgateway.platforms.eventr   r   Úgateway.configr   Ú	getLoggerrX  rÇ   r�   ÚobjectrÅ  r  r,   r1   r8   rA   rK   r\   rc   ri   ro   rw   ry   re  rh  r•  r%  r£  r¨  r¬  r°  r²  ræ  r÷  r  r   r7   r   r   Ú<module>r.     s  ðñó Û Û Û Û 	Û 
Û Û ß ,Ó ,÷ó õ ß BÝ 1ß =Ý #ð 
×	Ò	˜8Ó	$€â
€Ùƒx€ð	€õVõ õ
(÷>õ
hõ
õ.;õ
_õ+õ=ôNpÐ$ô Npõf`õ
$õEYõP#õ
:õ$Jõ
0õ8÷Kñ KõD6õ:	8ð;Ð^bð ;Ø>Bð;Ø[`÷;ô| r   