Ë
    Y�”j"@  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZ dd„Zdd„Zdd„Zd d	„Zd!d
„Zd"d„Zd#d„Zd$d„Zd%d„Zd&d„Zd'd„Zd%d„Zd%d„Zd(d„Zd d„Zdddœd)d„Zd*d+d„Zd,d-d„Zd.d„Zd/d0d„Zd.d„Z y)1uK   Ð¡Ð²Ð¾Ñ� Ð‘Ð” Ð»Ð¾Ð²Ñ†Ð° â€” Ð±ÐµÐ· Ð¿Ñ€Ð¸Ð²Ñ�Ð·ÐºÐ¸ Ðº Ð¿Ð°Ð½ÐµÐ»Ð¸ OZPAY.é    )ÚannotationsN)ÚOptional)ÚDATA_DIRÚDB_PATHÚSESSIONS_DIRc                 óP  — t        j                  dd¬«       t        j                  dd¬«       t        j                  t        t        «      «      } t        j                  | _        | j                  «       }|j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  «       D �ch c]  }|d   ’Œ	 }}d|vr|j                  d	«       |j                  d
«       |j                  d«       | j                  «        | S c c}w )NT©ÚparentsÚexist_oka/  
        CREATE TABLE IF NOT EXISTS owners (
            tg_id INTEGER PRIMARY KEY,
            first_name TEXT,
            last_name TEXT,
            username TEXT,
            created_at REAL NOT NULL,
            seen_at REAL NOT NULL,
            balance REAL NOT NULL DEFAULT 0
        )
        a–  
        CREATE TABLE IF NOT EXISTS sessions (
            owner_tg_id INTEGER PRIMARY KEY,
            phone TEXT,
            tg_user_id INTEGER,
            first_name TEXT,
            last_name TEXT,
            username TEXT,
            status TEXT NOT NULL DEFAULT 'logged_out',
            updated_at REAL NOT NULL,
            FOREIGN KEY (owner_tg_id) REFERENCES owners(tg_id)
        )
        zÔ
        CREATE TABLE IF NOT EXISTS watch_settings (
            owner_tg_id INTEGER PRIMARY KEY,
            value TEXT NOT NULL,
            FOREIGN KEY (owner_tg_id) REFERENCES owners(tg_id)
        )
        zPRAGMA table_info(owners)é   Úbalancez=ALTER TABLE owners ADD COLUMN balance REAL NOT NULL DEFAULT 0ad  
        CREATE TABLE IF NOT EXISTS invoices (
            invoice_id INTEGER PRIMARY KEY,
            owner_tg_id INTEGER NOT NULL,
            amount_usd REAL NOT NULL,
            status TEXT NOT NULL DEFAULT 'active',
            pay_url TEXT,
            mini_url TEXT,
            created_at REAL NOT NULL,
            paid_at REAL
        )
        a!  
        CREATE TABLE IF NOT EXISTS balance_log (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            owner_tg_id INTEGER NOT NULL,
            amount REAL NOT NULL,
            reason TEXT,
            actor_tg_id INTEGER,
            created_at REAL NOT NULL
        )
        )r   Úmkdirr   Úsqlite3ÚconnectÚstrr   ÚRowÚrow_factoryÚcursorÚexecuteÚfetchallÚcommit)ÚconnÚcurÚrowÚ
owner_colss       ú)/var/www/api.ozpay.ru/ozpay/catcher/db.pyÚget_connr      sú   € Ü‡N�N˜4¨$Õ/Ü×Ñ˜t¨dÕ3Ü�?‰?œ3œw›<Ó(€DÜ—{‘{€DÔØ
�+‰+‹-€CØ‡K�Kð
	ôð ‡K�Kð	ôð ‡K�Kð	ôð ‡K�KÐ+Ô,Ø$'§L¡L£NÖ3˜S�#�a“&Ð3€JÐ3Ø˜
Ñ"Ø�‰ÐSÔTØ‡K�Kð	ôð ‡K�Kð		ôð 	‡K�K„MØ€Kùò= 4s   ÃD#c                ól   — t        j                  dd¬«       t        t         dt        | «      › �z  «      S )NTr	   Úu)r   r   r   Úint©Úowner_tg_ids    r   Úsession_pathr#   Z   s/   € Ü×Ñ˜t¨dÕ3ÜŒ| ¤# kÓ"2Ð!3Ð4Ñ4Ó5Ð5ó    c           	     ób  — t        | d   «      }t        j                  «       }t        «       }|j                  «       }|j	                  d|f«       |j                  «       d u}|rQ|j	                  d| j                  d«      xs d| j                  d«      xs d| j                  d«      xs d||f«       nQ|j	                  d|| j                  d«      xs d| j                  d«      xs d| j                  d«      xs d||f«       |j                  «        |j                  «        t        |«      S )	NÚidz(SELECT tg_id FROM owners WHERE tg_id = ?zŒ
            UPDATE owners
            SET first_name = ?, last_name = ?, username = ?, seen_at = ?
            WHERE tg_id = ?
            Ú
first_nameÚ Ú	last_nameÚusernamez�
            INSERT INTO owners (tg_id, first_name, last_name, username, created_at, seen_at)
            VALUES (?, ?, ?, ?, ?, ?)
            )
r    Útimer   r   r   ÚfetchoneÚgetr   ÚcloseÚ	get_owner)ÚuserÚtg_idÚnowr   r   Úexistss         r   Úupsert_ownerr4   _   s  € Ü��T‘
‹O€EÜ
�)‰)‹+€CÜ‹:€DØ
�+‰+‹-€CØ‡K�KÐ:¸U¸HÔEØ�\‰\‹^ 4Ð'€FÙØ�‰ðð —‘˜Ó&Ò,¨"Ø—‘˜Ó%Ò+¨Ø—‘˜Ó$Ò*¨ØØðõ	
ð 	�‰ðð
 Ø—‘˜Ó&Ò,¨"Ø—‘˜Ó%Ò+¨Ø—‘˜Ó$Ò*¨ØØðô	
ð 	‡K�K„MØ‡J�J„LÜ�UÓÐr$   c                óF  — t        «       }|j                  «       }|j                  dt        | «      f«       |j	                  «       }|j                  «        |st        | «      dddddœS t        |d   «      |d   xs d|d   xs d|d   xs dt        |d	   xs d«      dœS )
NzRSELECT tg_id, first_name, last_name, username, balance FROM owners WHERE tg_id = ?r(   r   ©r&   r'   r)   r*   r   r1   r'   r)   r*   r   ©r   r   r   r    r,   r.   Úfloat)r1   r   r   r   s       r   r/   r/   ‰   s±   € Ü‹:€DØ
�+‰+‹-€CØ‡K�KØ\Ü	ˆU‹ˆôð �,‰,‹.€CØ‡J�J„LÙä�e“*ØØØØñ
ð 	
ô �#�g‘,ÓØ˜,Ñ'Ò-¨2Ø˜Ñ%Ò+¨Ø˜
‘OÒ) rÜ˜˜Y™Ò,¨1Ó-ñð r$   c                 óâ  — t        «       } | j                  «       }|j                  d«       |j                  «       D �cg c]  }t	        |d   «      ‘Œ }}| j                  «        g }t        j                  «       rBt        j                  d«      D ]*  }	 |j                  t	        |j                  dd  «      «       Œ, t        t        |«      t        |«      z  «      S c c}w # t        $ r Y Œ]w xY w)Nz SELECT owner_tg_id FROM sessionsr   z
u*.sessionr   )r   r   r   r   r    r.   r   Úis_dirÚglobÚappendÚstemÚ
ValueErrorÚsortedÚset)r   r   r   ÚrowsÚextraÚpaths         r   Úlist_session_ownersrD   £   sÉ   € Ü‹:€DØ
�+‰+‹-€CØ‡K�KÐ2Ô3Ø#&§<¡<£>Ö2˜CŒC��A‘�KÐ2€DÐ2Ø‡J�J„LØ€EÜ×ÑÔÜ ×%Ñ% lÓ3ò 	ˆDðØ—‘œS §¡¨1¨2 Ó/Õ0ð	ô
 ”#�d“)œc %›jÑ(Ó)Ð)ùò 3øô ò Ùðús   ¾CÂ'C"Ã"	C.Ã-C.c               ó~  — |xs i }t        «       }|j                  «       }|j                  dt        | «      ||j	                  d«      |j	                  d«      xs d|j	                  d«      xs d|j	                  d«      xs d|t        j
                  «       f«       |j                  «        |j                  «        y )Na
  
        INSERT INTO sessions (
            owner_tg_id, phone, tg_user_id, first_name, last_name, username, status, updated_at
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        ON CONFLICT(owner_tg_id) DO UPDATE SET
            phone = excluded.phone,
            tg_user_id = excluded.tg_user_id,
            first_name = excluded.first_name,
            last_name = excluded.last_name,
            username = excluded.username,
            status = excluded.status,
            updated_at = excluded.updated_at
        r&   r'   r(   r)   r*   )r   r   r   r    r-   r+   r   r.   )r"   ÚphoneÚmeÚstatusr   r   s         r   Úsave_session_metarI   ³   sž   € Ø	Šˆr€BÜ‹:€DØ
�+‰+‹-€CØ‡K�Kð	ô �ÓØØ�F‰F�4‹LØ�F‰F�<Ó Ò& BØ�F‰F�;ÓÒ% 2Ø�F‰F�:ÓÒ$ "ØÜ�I‰I‹Kð		
ôð2 	‡K�K„MØ‡J�J…Lr$   c                óØ   — | sy t        «       }|j                  «       }|j                  dt        | «      f«       |j	                  «       }|j                  «        |rt        |d   «      S d S )Nz5SELECT owner_tg_id FROM sessions WHERE tg_user_id = ?r   )r   r   r   r    r,   r.   )Ú
tg_user_idr   r   r   s       r   Úfind_owner_by_userbot_idrL   Ô   s^   € ÙØÜ‹:€DØ
�+‰+‹-€CØ‡K�KØ?Ü	ˆZ‹Ðôð �,‰,‹.€CØ‡J�J„LÙŒ3ˆs�1‰v‹;Ð' 4Ð'r$   c                ó°   — t        «       }|j                  «       }|j                  dt        | «      f«       |j	                  «        |j                  «        y )Nz*DELETE FROM sessions WHERE owner_tg_id = ?)r   r   r   r    r   r.   )r"   r   r   s      r   Údelete_session_metarN   â   s=   € Ü‹:€DØ
�+‰+‹-€CØ‡K�KÐ<¼sÀ;Ó?OÐ>QÔRØ‡K�K„MØ‡J�J…Lr$   c                ó$   — dg g t        | «      d dœS )NT©ÚenabledÚkeywordsÚchatsÚalert_chat_idÚ	max_chars)r    r!   s    r   Ú_default_watchrV   ê   s    € àØØÜ˜[Ó)Øñð r$   c                óZ   — dj                  t        | xs d«      j                  «       «      S )Nú r(   )Újoinr   Úsplit)Úvalues    r   Ú_normalize_keywordr\   ô   s#   € Ø�8‰8”C˜š Ó$×*Ñ*Ó,Ó-Ð-r$   c                ó’  — t        | t        «      sy | j                  d«      }|dv ry 	 t        |«      }dj                  t        | j                  d«      xs |«      j                  «       «      d d }t        | j                  d«      xs d«      j                  «       d d }||xs t        |«      |d	œS # t        t
        f$ r Y y w xY w)
Nr&   ©Nr(   rX   Útitleéx   Úkindr(   é   )r&   r_   ra   )
Ú
isinstanceÚdictr-   r    Ú	TypeErrorr>   rY   r   rZ   Ústrip)r[   Úraw_idÚchat_idr_   ra   s        r   Ú_normalize_chatri   ø   s¿   € Ü�eœTÔ"ØØ�Y‰Y�t‹_€FØ�ÑØðÜ�f“+ˆð �H‰H”S˜Ÿ™ 7Ó+Ò6¨wÓ7×=Ñ=Ó?Ó@ÀÀ#ÐF€EÜˆu�y‰y˜Ó Ò& BÓ'×-Ñ-Ó/°°Ð4€DØ EÒ$9¬S°«\À4ÑHÐHøô	 ”zÐ"ò Ùðús   ©B4 Â4CÃCc                ó‚  — t        |«      }| s|S t        | t        «      r| }n	 t        j                  | «      }t        |t        «      s|S d|v rt        |j                  d«      «      |d<   g }t        «       }|j                  d«      xs g D ]Y  }t        |«      }|j                  «       }|r||v rŒ%|j                  |«       |j                  |d d «       t        |«      dk\  sŒY n ||d<   g }	t        «       }
|j                  d«      xs g D ]L  }t!        |«      }|r|d   |
v rŒ|
j                  |d   «       |	j                  |«       t        |	«      dk\  sŒL n |	|d<   |j                  d«      }|d	v rt#        |«      |d<   n	 t#        |«      |d<   d
|v rE|j                  d
«      }|d	v rd |d
<   |S 	 t#        |«      }|�|dk  rd |d
<   |S t%        |d«      |d
<   |S # t
        t        t        j                  f$ r |cY S w xY w# t
        t        f$ r t#        |«      |d<   Y Œ�w xY w# t
        t        f$ r d }Y Œ{w xY w)NrQ   rR   éP   é2   rS   r&   éd   rT   r^   rU   r   i   )rV   rc   rd   ÚjsonÚloadsre   r>   ÚJSONDecodeErrorÚboolr-   r@   r\   ÚcasefoldÚaddr<   Úlenri   r    Úmin)Úrawr"   ÚdataÚpayloadrR   ÚseenÚitemÚwordÚkeyrS   Úseen_idsÚchatÚalertÚraw_maxÚlimits                  r   Ú_parse_watchr‚     sq  € Ü˜+Ó&€DÙØˆÜ�#”tÔØ‰ð	Ü—j‘j “oˆGô �gœtÔ$ØˆØ�GÑÜ˜wŸ{™{¨9Ó5Ó6ˆˆY‰Ø€HÜ‹5€DØ—‘˜JÓ'Ò-¨2ò ˆÜ! $Ó'ˆØ�m‰m‹oˆÙ�s˜d‘{ØØ�‰�ŒØ�‰˜˜S˜b˜	Ô"Üˆx‹=˜BÓÙðð  €DˆÑØ€EÜ‹u€HØ—‘˜GÓ$Ò*¨ò ˆÜ˜tÓ$ˆÙ�t˜D‘z XÑ-ØØ�‰�T˜$‘ZÔ Ø�‰�TÔÜˆu‹:˜ÓÙðð €Dˆ�MØ�K‰K˜Ó(€EØ�
ÑÜ # KÓ 0ˆˆ_Òð	5Ü$'¨£JˆD�Ñ!ð �gÑØ—+‘+˜kÓ*ˆØ�jÑ Ø $ˆD�Ñð €KðÜ˜G›�ð ˆ} ¨¢
Ø$(��[Ñ!ð €Kô %(¨¨tÓ$4��[Ñ!Ø€Køôe œ:¤t×';Ñ';Ð<ò 	ØŠKð	ûôF œ:Ð&ò 	5Ü$'¨Ó$4ˆD�Ó!ð	5ûô œzÐ*ò Ø’ðús5   ¤G! ÆH Æ7H* Ç! HÈHÈH'È&H'È*H>È=H>c                óâ   — t        | «      } t        «       }|j                  «       }|j                  d| f«       |j	                  «       }|j                  «        t        |r
|d   | «      S d | «      S )Nz6SELECT value FROM watch_settings WHERE owner_tg_id = ?r   )r    r   r   r   r,   r.   r‚   )r"   r   r   r   s       r   Úget_watch_settingsr„   E  se   € Ü�kÓ"€KÜ‹:€DØ
�+‰+‹-€CØ‡K�KØ@Ø	ˆôð �,‰,‹.€CØ‡J�J„LÜ¡#˜˜A™°Ó=Ð=¨4°Ó=Ð=r$   c                ó  — t        | «      } t        | «      }t        |t        «      si }d|v r|d   n|d   d|v r|d   n|d   d|v r|d   n|d   d|v r|d   n|d   d|v r|d   n|d   dœ}t	        || «      }t        «       }|j                  «       }|j                  d| t        j                  |d¬	«      f«       |j                  «        |j                  «        t        j                  t        j                  |«      «      S )
NrQ   rR   rS   rT   rU   rP   z•
        INSERT INTO watch_settings (owner_tg_id, value) VALUES (?, ?)
        ON CONFLICT(owner_tg_id) DO UPDATE SET value = excluded.value
        F)Úensure_ascii)r    r„   rc   rd   r‚   r   r   r   rn   Údumpsr   r.   ro   )r"   rx   ÚcurrentÚmergedrw   r   r   s          r   Úsave_watch_settingsrŠ   R  s  € Ü�kÓ"€KÜ  Ó-€GÜ�gœtÔ$Øˆà)2°gÑ)=�7˜9Ò%À7È9ÑCUØ+5¸Ñ+@�G˜JÒ'ÀgÈjÑFYØ%,°Ñ%7�˜Ò!¸WÀWÑ=MØ5DÈÑ5O˜ Ò1ÐU\Ð]lÑUmØ-8¸GÑ-C�W˜[Ò)ÈÐQ\ÑI]ñ€Fô ˜ Ó,€DÜ‹:€DØ
�+‰+‹-€CØ‡K�Kð	ð 
”d—j‘j °EÔ:Ð;ôð 	‡K�K„MØ‡J�J„LÜ�:‰:”d—j‘j Ó&Ó'Ð'r$   c                óô   — t        | «      } t        j                  «       }t        «       }|j                  «       }|j	                  d| ||f«       |j                  «        |j                  «        t        | «      S )Nz�
        INSERT OR IGNORE INTO owners (tg_id, first_name, last_name, username, created_at, seen_at, balance)
        VALUES (?, '', '', '', ?, ?, 0)
        )r    r+   r   r   r   r   r.   r/   )r1   r2   r   r   s       r   Úensure_ownerrŒ   m  sd   € Ü�‹J€EÜ
�)‰)‹+€CÜ‹:€DØ
�+‰+‹-€CØ‡K�Kð	ð 
��SÐôð 	‡K�K„MØ‡J�J„LÜ�UÓÐr$   r(   ©ÚreasonÚactor_tg_idc          	     óä  — t        | «      } 	 t        t        |«      d«      }t        |«      dk  rt	        d«      ‚t        | «       t        «       }|j                  «       }|j                  d|| f«       |j                  d| ||xs dd d |t        j                  «       f«       |j                  «        |j                  «        t        | «      S # t        t        f$ r}t	        d«      |‚d }~ww xY w)	Né   u#   Ð�ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ� Ñ�ÑƒÐ¼Ð¼Ð°g{®Gáz„?u,   Ð¡ÑƒÐ¼Ð¼Ð° Ñ�Ð»Ð¸ÑˆÐºÐ¾Ð¼ Ð¼Ð°Ð»ÐµÐ½ÑŒÐºÐ°Ñ�zAUPDATE owners SET balance = ROUND(balance + ?, 2) WHERE tg_id = ?z
        INSERT INTO balance_log (owner_tg_id, amount, reason, actor_tg_id, created_at)
        VALUES (?, ?, ?, ?, ?)
        r(   r`   )r    Úroundr8   re   r>   ÚabsrŒ   r   r   r   r+   r   r.   r/   )r1   ÚamountrŽ   r�   ÚdeltaÚexcr   r   s           r   Úadd_balancer—   ~  så   € Ü�‹J€EðIÜ”e˜F“m QÓ'ˆô ˆ5ƒz�DÒÜÐGÓHÐHÜ�ÔÜ‹:€DØ
�+‰+‹-€CØ‡K�KØKØ	�ˆôð ‡K�Kð	ð 
�˜š " d sÐ+¨[¼$¿)¹)»+ÐFôð 	‡K�K„MØ‡J�J„LÜ�UÓÐøô) ”zÐ"ò IÜÐ>Ó?ÀSÐHûðIús   �C ÃC/ÃC*Ã*C/c                ó~  — dj                  t        | xs d«      j                  «       «      }t        «       }|j	                  «       }|rod|› d�}|j                  d«      j                  «       r*|j                  dt        |«      |||t        |«      f«       n<|j                  d|||t        |«      f«       n|j                  dt        |«      f«       |j                  «       D �cg c];  }t        |d   «      |d	   xs d|d
   xs d|d   xs dt        |d   xs d«      dœ‘Œ= }}|j                  «        |S c c}w )NrX   r(   ú%ú-a!  
                SELECT tg_id, first_name, last_name, username, balance, seen_at
                FROM owners
                WHERE tg_id = ? OR CAST(tg_id AS TEXT) LIKE ? OR username LIKE ? OR first_name LIKE ?
                ORDER BY seen_at DESC
                LIMIT ?
                a
  
                SELECT tg_id, first_name, last_name, username, balance, seen_at
                FROM owners
                WHERE username LIKE ? OR first_name LIKE ? OR last_name LIKE ?
                ORDER BY seen_at DESC
                LIMIT ?
                z§
            SELECT tg_id, first_name, last_name, username, balance, seen_at
            FROM owners
            ORDER BY seen_at DESC
            LIMIT ?
            r1   r'   r)   r*   r   r   r6   )rY   r   rZ   r   r   ÚlstripÚisdigitr   r    r   r8   r.   )Úqueryr�   Úneedler   r   Úliker   rA   s           r   Úlist_ownersr    ™  sF  € Ø�X‰X”c˜%š+ 2Ó&×,Ñ,Ó.Ó/€FÜ‹:€DØ
�+‰+‹-€CÙØ�6�(˜!ˆ}ˆØ�=‰=˜Ó×%Ñ%Ô'Ø�K‰Kðô �V“˜d D¨$´°E³
Ð;õ	ð �K‰Kðð �t˜T¤3 u£:Ð.õ	ð 	�‰ðô �‹ZˆMô	
ð" —<‘<“>ö	ð ô �c˜'‘lÓ#Ø˜lÑ+Ò1¨rØ˜[Ñ)Ò/¨RØ˜J™Ò-¨2Ü˜S ™^Ò0¨qÓ1ó	
ð	€Dð 	ð 	‡J�J„LØ€Kùò	s   Ã&A D:c           
     ó@  — t        «       }|j                  «       }|j                  dt        | «      t        |«      t	        |«      |xs d|xs dt        j
                  «       f«       |j                  «        |j                  «        t        | «      dt	        |«      dœS )Na  
        INSERT INTO invoices (invoice_id, owner_tg_id, amount_usd, status, pay_url, mini_url, created_at)
        VALUES (?, ?, ?, 'active', ?, ?, ?)
        ON CONFLICT(invoice_id) DO UPDATE SET
            pay_url = excluded.pay_url,
            mini_url = excluded.mini_url
        r(   Úactive)Ú
invoice_idrH   Ú
amount_usd)r   r   r   r    r8   r+   r   r.   )r£   r"   r¤   Úpay_urlÚmini_urlr   r   s          r   Úsave_invoicer§   Í  sƒ   € Ü‹:€DØ
�+‰+‹-€CØ‡K�Kð	ô 
ˆZ‹œ#˜kÓ*¬E°*Ó,=¸wº}È"ÈhÊnÐZ\Ô^b×^gÑ^gÓ^iÐjô	ð 	‡K�K„MØ‡J�J„LÜ˜j›/°XÌUÐS]ÓM^Ñ_Ð_r$   c                ó@  — t        «       }|j                  «       }|j                  dt        | «      f«       |j	                  «       }|j                  «        |sy t        |d   «      t        |d   «      t        |d   xs d«      |d   xs d|d   xs d	|d
   xs d	dœS )NzhSELECT invoice_id, owner_tg_id, amount_usd, status, pay_url, mini_url FROM invoices WHERE invoice_id = ?r£   r"   r¤   r   rH   r¢   r¥   r(   r¦   )r£   r"   r¤   rH   r¥   r¦   r7   )r£   r   r   r   s       r   Úget_invoicer©   ß  s£   € Ü‹:€DØ
�+‰+‹-€CØ‡K�KØrÜ	ˆZ‹Ðôð �,‰,‹.€CØ‡J�J„LÙØä˜#˜lÑ+Ó,Ü˜3˜}Ñ-Ó.Ü˜C Ñ-Ò2°Ó3Ø�h‘-Ò+ 8Ø�y‘>Ò' RØ˜
‘OÒ) rñð r$   c           	     ó6  — t        «       }|j                  «       }|j                  dt        | «      f«       |j	                  «       D �cg c]4  }t        |d   «      t        |d   «      t        |d   xs d«      |d   dœ‘Œ6 }}|j                  «        |S c c}w )Nz«
        SELECT invoice_id, owner_tg_id, amount_usd, status
        FROM invoices
        WHERE status = 'active'
        ORDER BY created_at DESC
        LIMIT ?
        r£   r"   r¤   r   rH   )r£   r"   r¤   rH   )r   r   r   r    r   r8   r.   )r�   r   r   r   rA   s        r   Úlist_active_invoicesr«   ô  s¡   € Ü‹:€DØ
�+‰+‹-€CØ‡K�Kð	ô 
ˆU‹ˆô	ð" —<‘<“>öð ô ˜c ,Ñ/Ó0Ü˜s =Ñ1Ó2Ü  LÑ 1Ò 6°QÓ7Ø˜(‘mó		
ð€Dð ð 	‡J�J„LØ€Kùòs   Á	9Bc                óœ  — t        | «      }|sy |d   dk(  r|S t        «       }|j                  «       }|j                  dt	        j                  «       t        | «      f«       |j                  }|j                  «        |j                  «        |st        | «      S t        |d   |d   d| › �d ¬«      }t        | «      xs |}||d<   d	|d
<   |S )NrH   ÚpaidzZUPDATE invoices SET status = 'paid', paid_at = ? WHERE invoice_id = ? AND status != 'paid'r"   r¤   zcrypto:r�   ÚownerTÚcredited)
r©   r   r   r   r+   r    Úrowcountr   r.   r—   )r£   Úinvoicer   r   Úchangedr®   s         r   Úmark_invoice_paidr³     sÓ   € Ü˜*Ó%€GÙØØˆxÑ˜FÒ"ØˆÜ‹:€DØ
�+‰+‹-€CØ‡K�KØdÜ	�‰‹”c˜*“oÐ&ôð �l‰l€GØ‡K�K„MØ‡J�J„LÙÜ˜:Ó&Ð&ÜØ�ÑØ�ÑØ˜˜Ð%Øô	€Eô ˜*Ó%Ò0¨€GØ€GˆGÑØ€GˆJÑØ€Nr$   )Úreturnzsqlite3.Connection)r"   r    r´   r   )r0   rd   r´   rd   )r1   r    r´   rd   )r´   z	list[int])
r"   r    rF   zOptional[str]rG   úOptional[dict]rH   r   r´   ÚNone)rK   r    r´   úOptional[int])r"   r    r´   r¶   )r"   r    r´   rd   )r´   r   )r´   rµ   )r"   r    rx   rd   r´   rd   )r1   r    rŽ   r   r�   r·   r´   rd   )r(   é(   )r�   r   r�   r    r´   ú
list[dict])r(   r(   )r£   r    r"   r    r¤   r8   r¥   r   r¦   r   r´   rd   )r£   r    r´   rµ   )r¸   )r�   r    r´   r¹   )!Ú__doc__Ú
__future__r   rn   r   r+   Útypingr   Úconfigr   r   r   r   r#   r4   r/   rD   rI   rL   rN   rV   r\   ri   r‚   r„   rŠ   rŒ   r—   r    r§   r©   r«   r³   © r$   r   ú<module>r¿      s–   ðÙ Qå "ã Û Û Ý ç 2Ñ 2óJóZ6ó
'óTó4*ó óB(óóó.óIó;ó|
>ó(ó6ð" 68ÐVZõ ô61ôh`ó$ô*ô4r$   