o
    _i3F                     @   s  d dl Z d dlZd dlmZmZmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZmZmZmZmZ d dlZd dlZd dlZe eZeddZG d	d
 d
eZdZdd Ze Z dZ!de"de"fddZ#de"de	fddZ$de"de	fddZ%d:de&de"de'fddZ(de)de'fddZ*de"de"de	fd d!Z+d"e)de)dB fd#d$Z,d%e)de&de-fd&d'Z.e/ej0d(kd)ed*efd+d,Z1e2ej3d-ed*efd.d/Z4e/ej0d0kd)ed*efd1d2Z5e/ej0d3kd)ed*efd4d5Z6e/ej0d6kd)ed*ed7efd8d9Z7dS );    N)RouterFBot)CallbackQueryMessageInlineKeyboardMarkupInlineKeyboardButton)
FSMContext)StatesGroupState)get_user_languageget_language_textget_button_textadd_user_balanceget_user_balancepopolnit)namec                   @   s   e Zd Ze Ze ZdS )BalanceStatesN)__name__
__module____qualname__r   wait_amountwait_payment_method r   r   D/var/www/www-root/data/www/magazinbotpanel.site/handlers/popolnit.pyr      s    
r   zmenu:button9c               
   C   s   zOt jt jt} t j| d}td|  t|ddd%}t	|}|
d}t|r8d|d d  d	nd
 |W  d    W S 1 sHw   Y  W d S  tyj } ztd|  W Y d }~d S d }~ww )Nzcrypto_api.jsonzLooking for config at: rzutf-8)encodingcryptobot_tokenzToken loaded: 
   z...zToken not foundu/   Ошибка загрузки crypto_api.json: )ospathdirnameabspath__file__joinprintopenjsonloadget	Exceptionloggererror)current_dirconfig_pathfconfigtokener   r   r   load_cryptobot_token   s   

 (r3   zhttps://pay.crypt.bot/apilangreturnc              
   C   s   d}z@ddl m} t|}| }|d| f | }|  |r:|d r=t|d 	 r@t|d 	 }W |S W |S W |S W |S  t
y` } ztd|  d|  W Y d}~|S d}~ww )u3   Получает текст кнопки назадu   ⬅️ Назадr   )MENU_DBz+SELECT button9 FROM language WHERE name = ?z get_button9_text error for lang=: N)dbr6   sqlite3connectcursorexecutefetchoneclosestrstripr*   r+   r,   )r4   labelr6   conncurrowr2   r   r   r   get_button9_text,   s,   
 rE   c                 C   s   t tt| tdggdS )u@   Создает клавиатуру с кнопкой назадtextcallback_datainline_keyboard)r   r   rE   BACK_CB)r4   r   r   r   build_back_keyboard<   s   rL   c                 C   sN   t | dd}t | dd}t| }tt|ddgt|ddgt|tdggdS )	uD   Создает клавиатуру с методами оплатыbutton13u   💳 CryptoBotbutton14u$   💳 Банковская картаbalance_pay:cryptobotrF   balance_pay:cardrI   )r   rE   r   r   rK   )r4   button13_textbutton14_text	back_textr   r   r   build_payment_methods_keyboardB   s   rT   #   Пополнение балансаamountdescriptionc           	   
      s  t s
td dS t d}t dd}dt| |ddd	d	d
d}td|   zt 4 I dH p}|j|||d4 I dH L}|	 I dH }td|  |
drl|
dW  d  I dH  W  d  I dH  W S td|  	 W d  I dH  W d  I dH  W dS 1 I dH sw   Y  W d  I dH  W dS 1 I dH sw   Y  W dS  ty } ztd|  W Y d}~dS d}~ww )u]   
    Создает инвойс в CryptoBot для пополнения баланса
    CryptoBot token not loadedNz/createInvoicezapplication/json)Crypto-Pay-API-TokenzContent-TypeUSDTviewItemzhttps://t.me/your_botFi  )assetrV   rW   paid_btn_namepaid_btn_urlallow_commentsallow_anonymous
expires_inz%Creating balance invoice for amount: )headersr'   zCryptoBot API response: okresultzCryptoBot API error: zCryptoBot request error: )CRYPTOBOT_TOKENr+   r,   CRYPTOBOT_API_URLr?   r%   aiohttpClientSessionpostr'   r)   r*   )	rV   rW   urlrb   datasessionresponserd   r2   r   r   r   create_balance_invoiceP   sL   


2	rn   
invoice_idc              
      s  t s
td dS t d}dt i}t| dd}zt 4 I dH t}|j|||d4 I dH P}| I dH }t	d|  |d	rj|d
i drj|d
 d d W  d  I dH  W  d  I dH  W S 	 W d  I dH  W d  I dH  W dS 1 I dH sw   Y  W d  I dH  W dS 1 I dH sw   Y  W dS  t
y } ztd|  W Y d}~dS d}~ww )up   
    Проверяет статус инвойса в CryptoBot для пополнения баланса
    rX   Nz/getInvoicesrY      )invoice_idscount)rb   paramsz Check balance invoice response: rc   rd   itemsr   zCryptoBot check invoice error: )re   r+   r,   rf   r?   rg   rh   r)   r'   r%   r*   )ro   rj   rb   rs   rl   rm   rd   r2   r   r   r   check_balance_invoicez   s:   

2ru   invoice_urlc                 C   sN   t | dd}t | dd}tt||dgt|ddgtt| tdggd}|S )	u   
    Создает клавиатуру с кнопками оплаты и проверки для пополнения баланса
    button17u   💳 Оплатитьbutton15u#   ✅ Проверить оплату)rG   rj   balance_check_cryptorF   rI   )r   r   r   rE   rK   )r4   rv   pay_button_textcheck_button_textkeyboardr   r   r   build_balance_payment_keyboard   s   r}   user_idc              
   C   s   z(t d}| }|d| f | }|  |r&|d r&t|d W S W dS  tyF } zt	d|  d|  W Y d}~dS d}~ww )ud   
    Получает ID реферера (пригласившего) пользователя
    data.dbzCSELECT gen_referal_user_id FROM referals WHERE referals_user_id = ?r   Nz Error getting referrer for user r7   )
r9   r:   r;   r<   r=   r>   intr*   r+   r,   )r~   rB   rC   rD   r2   r   r   r   get_referrer_id   s   
r   referrer_idc              
   C   s   z0|d }t d}| }|d||| f |  |  td|  d| d| d W dS  tyN } zt	d	|  d
|  W Y d}~dS d}~ww )ua   
    Начисляет 10% бонус рефереру от суммы пополнения
    g?r   z_UPDATE users SET balance = balance + ?, referal_balance = referal_balance + ? WHERE user_id = ?zReferral bonus added: user  +z$ (10% from z$)Tz$Error adding referral bonus to user r7   NF)
r9   r:   r;   r<   commitr>   r+   infor*   r,   )r   rV   bonus_amountrB   rC   r2   r   r   r   add_referral_bonus   s    
r   zmenu:button8cbstatec                    s   | j j}t|}t|dpd}z
| j I dH  W n	 ty#   Y nw | jj|t|dI dH  |	t
jI dH  |  I dH  dS )uS   
    Открывает меню пополнения баланса (button8)
    text24uY   Введите сумму для пополнения баланса (минимум 1$):Nreply_markup)	from_useridr   r   messagedeleter*   answerrL   	set_stater   r   )r   r   r~   r4   r   r   r   r   open_balance_topup   s   r   r   c              
      s  | j j}t|}zDt| j }|dk r&d}| j|t|dI dH  W dS |j|dI dH  t	|dp5d}| j|t
|dI dH  |tjI dH  W dS  tye   d}| j|t|dI dH  Y dS  ty } ztd	|  d
}| j|t|dI dH  W Y d}~dS d}~ww )uR   
    Обрабатывает ввод суммы для пополнения
    rp   u;   Минимальная сумма пополнения - 1$r   N)rV   text25u+   Выберите способ оплаты:uH   Пожалуйста, введите число (например: 10.5)zError handling amount input: uA   Произошла ошибка. Попробуйте снова.)r   r   r   floatrG   r@   r   rL   update_datar   rT   r   r   r   
ValueErrorr*   r+   r,   )r   r   r~   r4   rV   
error_textr   r2   r   r   r   handle_amount_input   s,   &r   rO   c                    s`  | j j}t|}| I dH }|dd}|dkr&| jdddI dH  dS z
| j I dH  W n	 ty9   Y nw t	|d| dd	I dH }|rN|d
sbd}| j|I dH  |  I dH  dS t
d|d  d|d
   |j|d |dI dH  d| d}d}	| d|	 }
t||d
 }| jj|
|dI dH }|j|jdI dH  |  I dH  dS )u`   
    Обработчик выбора CryptoBot для пополнения баланса
    NrV   r   )   Ошибка: неверная суммаT
show_alertu)   Пополнение баланса на $)rV   rW   pay_urluY   Ошибка: не удалось создать инвойс для пополненияzBalance topup invoice created: ro   z, URL: )balance_invoice_idbalance_amountu   Оплатите u1   $ USDT для пополнения балансаu9   Для оплаты нажмите кнопку ниже:z

r   )balance_payment_message_id)r   r   r   get_datar)   r   r   r   r*   rn   r%   r   r}   
message_id)r   r   r~   r4   
state_datarV   invoicer   amount_textdescription_textpayment_textr|   payment_messager   r   r   handle_balance_cryptobot  sD   
r   rP   c                    s   | j j}t|}| I dH }|dd}|dkr&| jdddI dH  dS z
| j I dH  W n	 ty9   Y nw t	|dp@d}| d	| d
}| jj|t
|dI dH  td| d| d
 | I dH  |  I dH  dS )uv   
    Обработчик выбора банковской карты для пополнения баланса
    NrV   r   r   Tr   text26uU   Для пополнения баланса следуйте инструкциям...u#   

Сумма пополнения: r   r   z.Card payment selected for balance topup: user z
, amount: )r   r   r   r   r)   r   r   r   r*   r   rL   r%   clear)r   r   r~   r4   r   rV   r   info_messager   r   r   handle_balance_cardI  s&   r   ry   botc              
      s  | j j}t|}td td|  | I dH }|d}|dd}|d}td| d	|  z%|rM|j| jjj|d
I dH  td|  n| j	 I dH  td W n t
ys }	 ztd|	  W Y d}	~	nd}	~	ww |st|dp|d}
| jj|
t|dI dH  td dS t|I dH }|st|dpd}
| jj|
t|dI dH  td dS |dd}td|  |dkr/t||}|rt|}t|}|rt||}|rtd| d| d ntd|  t|dpd}| d| d| d}| jj|t|dI dH  td| d | d!| d n-d"}
| jj|
t|dI dH  nt|dp6d}
| jj|
t|dI dH  td#| d$ | I dH  |  I dH  dS )%uq   
    Обработчик проверки оплаты CryptoBot для пополнения баланса
    z=== BALANCE CRYPTO CHECK ===zUser: Nr   r   r   r   zInvoice ID: z
, Amount: )chat_idr   zDeleted payment message: zDeleted current messagez Error deleting payment message: text16u   Оплата не прошлаr   zNo invoice ID in statezInvoice check failedstatusactivezInvoice status: paidzReferral bonus added: z got 10% from r   z Failed to add referral bonus to r   u-   Баланс успешно пополнен!u   

Пополнено: u   $
Текущий баланс: z&Balance topped up via CryptoBot: user r   z$, new balance: u0   Ошибка пополнения балансаzPayment not completed (status: ))r   r   r   r%   r   r)   delete_messager   chatr   r*   r   r   rL   ru   r   r   r   r   r   )r   r   r   r~   r4   r   ro   rV   payment_message_idr2   r   invoice_datar   balance_updatednew_balancer   bonus_addedr   success_messager   r   r   handle_balance_crypto_checki  sn   




r   )rU   )8loggingr9   aiogramr   r   r   aiogram.typesr   r   r   r   aiogram.fsm.contextr	   aiogram.fsm.stater
   r   r8   r   r   r   r   r   rg   r'   r   	getLoggerr   r+   routerr   rK   r3   re   rf   r?   rE   rL   rT   r   dictrn   r   ru   r}   r   boolr   callback_queryrk   r   r   r   r   r   r   r   r   r   r   r   <module>   sF    

* 
&8