
    eVj
)                        U d Z ddlZddlZddlZddlZddlZddlZddlZddlZ	ddl
Z	ddlmZmZ ej                  j                  dd      ZdZdZdZej                  j                  d	d
      ZdZej                  j                  dd      j+                  d      Zej                  j                  dd      ZdZ eexr e      Z e       Zee   ed<   dad Z dZ! ejD                  dejF                        Z$d&dededededef
dZ%de&ddfdZ'de&defdZ(d Z)defdZ*defdZ+dede,fd Z-dede,fd!Z.d'd"e,fd#Z/d$ Z0e1d%k(  r e0        yy)(uV  
Aria Chat Logger - SQLite Edition

Lokale SQLite-Variante des Chat Loggers. Speichert Telegram-Nachrichten
in /root/.aria-chat.db statt Supabase. Keine Cloud-Abhängigkeit, DSGVO-konform.

Schema:
  CREATE TABLE IF NOT EXISTS aria_chat_log (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    created_at TEXT NOT NULL DEFAULT (datetime('now')),
    direction TEXT NOT NULL,         -- 'in' or 'out'
    chat_id TEXT NOT NULL,
    user_name TEXT,
    message_text TEXT,
    source TEXT DEFAULT 'telegram',
    metadata TEXT
  );
  CREATE INDEX IF NOT EXISTS idx_created_at ON aria_chat_log(created_at);
    N)datetimetimezoneARIA_DB_PATHz/home/aria/.aria-chat.dbaria   i  ARIA_SESSION_BACKUPz!/home/aria/.aria-last-session.txt   ARIA_SUPABASE_URL /ARIA_SUPABASE_SERVICE_KEYaria_chat_logseen_hashesc                     t        j                  t              } | j                  d       | j                  d       | j                  d       | j	                          | j                          t        j                  t        d       y)z,SQLite Schema anlegen falls nicht vorhanden.a}  
        CREATE TABLE IF NOT EXISTS aria_chat_log (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            created_at TEXT NOT NULL DEFAULT (datetime('now')),
            direction TEXT NOT NULL,
            chat_id TEXT NOT NULL,
            user_name TEXT,
            message_text TEXT,
            source TEXT DEFAULT 'telegram',
            metadata TEXT
        )
    zFCREATE INDEX IF NOT EXISTS idx_created_at ON aria_chat_log(created_at)zDCREATE INDEX IF NOT EXISTS idx_direction ON aria_chat_log(direction)i  N)sqlite3connectDB_PATHexecutecommitcloseoschmod)conns    -/home/aria/scripts/aria-chat-logger-sqlite.pyinit_dbr   7   s]    ??7#DLL  	 	LLYZLLWXKKMJJLHHWe    a  <channel\s+source="(?:plugin:telegram:telegram|telegram)"\s+chat_id="(?P<chat_id>[^"]{1,50})"\s+message_id="(?P<message_id>[^"]{1,50})"\s+user="(?P<user>[^"]{1,100})"(?:\s+user_id="[^"]{1,50}")?\s+ts="(?P<ts>[^"]{1,50})"[^>]{0,400}>(?P<text>.{0,5000}?)</channel>	directionchat_idtexttsreturnc                     |  d| d|d d  d| }t        j                  |j                               j                         d d S )N|,     )hashlibsha256encode	hexdigest)r   r   r   r    raws        r   msg_hashr+   d   sI    Kq	4:,at
4C>>#**,'113CR88r   rowc           
         t         sy	 | j                  d      }t        |t              r	 t	        j
                  |      }| d   | j                  d      | j                  d      | j                  d      | j                  dd	      |d
}t	        j                  |      j                  d      }t        j                  j                  t         dt         |dt        dt         ddd      }t        j                  j!                  |d      5 }|j"                  dk\  rt%        d|j"                          ddd       y# t        t        f$ r d|i}Y w xY w# 1 sw Y   yxY w# t        j&                  j(                  $ r6}t%        d|j*                   d|j-                         dd         Y d}~yd}~wt.        $ r}t%        d|        Y d}~yd}~ww xY w)zRBest-effort POST in Supabase aria_chat_log. Fehler werden geloggt, nicht geraised.Nmetadatar*   r   r   	user_namemessage_textsourcetelegramr   r   r/   r0   r1   r.   zutf-8z	/rest/v1/POSTzBearer zapplication/jsonzreturn=minimal)apikeyAuthorizationzContent-TypePrefer)datamethodheaders   timeoutr$   z[WARN] Supabase status z[ERROR] Supabase HTTP :    z[ERROR] Supabase POST: )
SB_ENABLEDget
isinstancestrjsonloads
ValueError	TypeErrordumpsr(   urllibrequestRequestSB_URLSB_TABLESB_KEYurlopenstatusprinterror	HTTPErrorcoderead	Exception)r,   metapayloadr8   reqrespes          r   supabase_insertr\   i   s   !-wwz"dC %zz$' [)wwy)-GGN3ggh
3
 zz'"))'2nn$$hiz* #*6(!3 2*		 % 

 ^^##C#3 	?t{{c!/}=>	? 	?- 	* %t}%,	? 	? <<!! C&qvvhb$30@ABB -'s+,,-se   !E% D?  CE% (E6E% ?EE% EE% E"E% "E% %G,F33G?GGc                    	 t        j                  t        d      }|j                  d| d   | d   | j	                  d      | j	                  d      | j	                  dd	      | j	                  d
      f       |j                          |j                          t        |        y# t         j                  $ r}t        d|        Y d}~yd}~ww xY w)z7INSERT in SQLite + parallel in Supabase (wenn ENABLED).
   r<   z
            INSERT INTO aria_chat_log (direction, chat_id, user_name, message_text, source, metadata)
            VALUES (?, ?, ?, ?, ?, ?)
        r   r   r/   r0   r1   r2   r.   Tz[ERROR] SQLite INSERT: NF)
r   r   r   r   rA   r   r   r\   ErrorrQ   )r,   r   r[   s      r   	db_insertr`      s    w3  	NGGK GGN#GGHj)GGJ

	 	

== 's+,s   B!B$ $C7C

Cc                  n   	 t        j                  t        d      } | j                  dt         d      }|j
                  }| j                          | j                  d       | j                          |dkD  rt        d| d       y
y
# t         j                  $ r}t        d	|        Y d
}~y
d
}~ww xY w)u"   Alte Einträge löschen (>7 Tage).r^   r<   z?DELETE FROM aria_chat_log WHERE created_at < datetime('now', '-z days')VACUUMr   z
[CLEANUP] u    alte Einträge gelöschtz[ERROR] SQLite Cleanup: N)
r   r   r   r   RETENTION_DAYSrowcountr   r   rQ   r_   )r   curdeletedr[   s       r   
db_cleanuprg      s    .w3llMnM]]de
 ,,X

Q;Jwi'@AB == .(,--.s   BB	 	B4B//B4c            
          	 t        j                  dddt        dddt         gddd	      } | j                  S # t         j
                  t        t         j                  f$ r Y y
w xY w)Ntmuxzcapture-panez-tz-pz-S-Tr;   )capture_outputr   r=   r   )
subprocessrunTMUX_SESSIONBUFFER_LINESstdoutTimeoutExpiredFileNotFoundErrorSubprocessError)results    r   capture_tmuxru      sg    ^T<tqEWXdA
 }}%%'8*:T:TU s   69 (A$#A$c                      	 t         j                  j                  t              } | t        k(  ry| at        t        dd      5 }|j                         cd d d        S # 1 sw Y   y xY w# t        t        f$ r Y yw xY w)Nr   rreplace)errors)	r   pathgetsizeSESSION_BACKUPlast_backup_sizeopenrU   rr   OSError)sizefs     r   read_session_backupr      sm    ww~.##.#i8 	A668	 	 	w' s4   ,A) A) A	A) A&"A) &A) )A;:A;c                    d}t         j                  |       D ]  }|j                  d      }|j                  d      }|j                  d      }|j                  d      j                         }|rt	        |      dk  rft        d|||      }|t        v r}t        j                  |       t        d|||dt        j                  d	|i      d
      s|dz  }|d d j                  dd      }t        d| d|         |S )Nr   r   userr    r      inr2   ts_telegramr3   P   
 z	[IN/XML] r>   )RE_INBOUND_XMLfinditergroupstriplenr+   r   addr`   rD   rH   rx   rQ   )	r   loggedmr   r   r    msg_texthpreviews	            r   parse_inboundr      s   F $$T* 1'')$wwvWWT]776?((*3x=1,T7Hb1$ 

M2#67
  aKFsm++D#6GIdV2gY/0114 Mr   c           	      n   d}t        j                  d|       }|D ]  }t        j                  d|      }t        j                  d|      }|r|st        j                  d|      }|r|sO|j                  d      }|j                  d      }|j	                  dd      j	                  d	d
      j	                  dd      }t        |      dk  rt        d||      }|t        v rt        j                  |       t        d|d|dd      s|dz  }|d d j	                  dd      }	t        d|	         |S )Nr   z0(?=mcp__plugin_telegram_telegram__reply|"reply")zchat_id["\s:]+(\d+)z"text":\s*"((?:[^"\\]|\\.)*)"ztext["\s:]+([^\n]{10,})r   z\nr   z\t	z\""   outr   r2   )r   r   r/   r0   r1   r   r   z[OUT] aria: )resplitsearchr   rx   r   r+   r   r   r`   rQ   )
r   r   blocksblock
chat_match
text_matchr   r   r   r   s
             r   parse_outboundr      s>   FXXI4PF ,YY5u=
YY?G
#=uEJZ""1%##A&##E4088EMMeUXYx=1UGX.$ 
  aKFsm++D#6GL	*+=,@ Mr   max_sizec                     t        t              | kD  rPt        t              d | dz   }|D ]  }t        j                  |        t	        d|  dt        t                      y y )Nr   z[CLEANUP] seen_hashes: z -> )r   r   listdiscardrQ   )r   	to_remover   s      r   cleanup_seenr     sb    
;("%nx1}5	 	#A"	#'zc+6F5GHI	 #r   c                     t        d       t        dt                t        dt         d       t        dt         d       t        dt        rdnd	 t        rd
t
        z   dz   nd        t                d} 	 	 d}t               }|r|t        |      z  }|t        |      z  }t               }|r|t        |      z  }|t        |      z  }|dkD  rt        d| d       | dz  } | dz  dk(  r
t                | dz  dk(  r
t                t        j                  t               # t        $ r}t        d|        Y d }~6d }~ww xY w)Nz![START] Aria Chat Logger (SQLite)z  DB: z  Poll-Intervall: sz  Retention: z Tagez  Supabase Sink: ONOFFz ()r   r   z[LOG] z neue Nachricht(en) gespeichertr   2   x   z[ERROR] )rQ   r   POLL_INTERVALrc   r@   rL   r   ru   r   r   r   r   rg   rV   timesleep)cycletotalbufferbackupr[   s        r   mainr   %  sH   	-/	F7)
	}oQ
/0	M.)
/0	jde<T^TF]S=Pdf<g
hiIE
	"E!^Fv..//(*Fv..//qyug%DEFQJErzQs{a
 	

=!5 .  	"HQC.!!	"s   <BD% %	E.EE__main__)r   )i  )2__doc__r   r   r   rD   r&   r   rl   urllib.requestrI   urllib.errorr   r   environrA   r   rn   r   ro   r|   rc   rstriprL   rN   rM   boolr@   setr   rC   __annotations__r}   r   
RE_INBOUNDcompileDOTALLr   r+   dictr\   r`   rg   ru   r   intr   r   r   r   __name__ r   r   <module>r      s  ( 
 	        ' **..)C
D 57Z[ 
+R	0	7	7	<	3R	8&#V$
 SX  < 
& II
9 9c 9 9# 9s 9
%- %-$ %-P4 D 0."c 
S 
! ! !H$ $ $NJ3 J$"N zF r   