o
    id                     @   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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e(e)e$e$f  fddZ*de$de(e)e$e$f  de+de	fddZ,de$de+de	fdd Z-dJde+d"e$de.fd#d$Z/d%e0de.fd&d'Z1de$d(e$de	fd)d*Z2d+e0de0dB fd,d-Z3d.e0de+de4fd/d0Z5e6ej7d1kd2ed3efd4d5Z8e9ej:d6ed3efd7d8Z;e6ej7d9kd2ed3efd:d;Z<e6ej7d<kd2ed3efd=d>Z=e6ej7d?kd2ed3efd@dAZ>e6ej7?ed2ed3efdBdCZ@e6ej7?e d2ed3efdDdEZAe6ej7dFkd2ed3edGefdHdIZBdS )K    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:button9zbalance_wallet:zbalance_back_nav:c               
   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   sf   t | dd}t | dd}t | dd}t| }tt|ddgt|d	dgt|d
dgt|tdggdS )uD   Создает клавиатуру с методами оплатыbutton13u   💳 CryptoBotbutton14u$   💳 Банковская картаbutton21   📞 Операторbalance_pay:cryptobotrF   balance_pay:cardbalance_pay:operatorrI   )r   rE   r   r   rK   )r4   button13_textbutton14_textbutton21_text	back_textr   r   r   build_payment_methods_keyboardD   s   rX   c               
   C   s   zUt d} |  }|d | s|   g W S |d | }|   g }|D ]'}|rR|d rR|d rRt|d  }t|d  }|rR|rR|	||f q+|W S  t
yq } ztd|  g W  Y d}~S d}~ww )uL   Получает список кошельков из таблицы walletsdata.dbzg
            SELECT name FROM sqlite_master 
            WHERE type='table' AND name='wallets'
        z,SELECT name, text FROM wallets ORDER BY namer      zget_wallets error: N)r9   r:   r;   r<   r=   r>   fetchallr?   r@   appendr*   r+   r,   )rB   rC   rowswalletsrD   r   rG   r2   r   r   r   get_walletsT   s0   


r_   r^   amountc              	   C   sd   g }|D ]\}}| t|t | d| dg qt d| }| tt| |dg t|dS )ud   Строит клавиатуру с кошельками для пополнения баланса:rF   zpayment:rI   )r\   r   BALANCE_WALLET_CB_PREFIXBALANCE_BACK_NAV_PREFIXrE   r   )r4   r^   r`   r]   r   rG   back_to_payment_cbr   r   r   build_wallets_keyboardu   s   
re   c                 C   s(   t  d| }ttt| |dggdS )uc   Строит клавиатуру с кнопкой назад для текста кошелькаzwallets:rF   rI   )rc   r   r   rE   )r4   r`   back_to_wallets_cbr   r   r   build_wallet_text_keyboard   s
   rg   #   Пополнение баланса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  )assetr`   ri   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*   )	r`   ri   urlrt   datasessionresponserv   r2   r   r   r   create_balance_invoice   sL   


2	r   
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 для пополнения баланса
    rj   Nz/getInvoicesrk   rZ   )invoice_idscount)rt   paramsz Check balance invoice response: ru   rv   itemsr   zCryptoBot check invoice error: )rw   r+   r,   rx   r?   ry   rz   r)   r'   r%   r*   )r   r|   rt   r   r~   r   rv   r2   r   r   r   check_balance_invoice   s:   

2r   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   r|   balance_check_cryptorF   rI   )r   r   r   rE   rK   )r4   r   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 реферера (пригласившего) пользователя
    rY   zCSELECT 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?rY   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   r`   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   
    Обрабатывает ввод суммы для пополнения
    rZ   u;   Минимальная сумма пополнения - 1$r   Nr`   text25+   Выберите способ оплаты:uH   Пожалуйста, введите число (например: 10.5)zError handling amount input: uA   Произошла ошибка. Попробуйте снова.)r   r   r   floatrG   r@   r   rL   update_datar   rX   r   r   r   
ValueErrorr*   r+   r,   )r   r   r   r4   r`   
error_textr   r2   r   r   r   handle_amount_input(  s,   &r   rQ   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 для пополнения баланса
    Nr`   r   )   Ошибка: неверная суммаT
show_alertu)   Пополнение баланса на $)r`   ri   pay_urluY   Ошибка: не удалось создать инвойс для пополненияzBalance topup invoice created: r   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*   r   r%   r   r   
message_id)r   r   r   r4   
state_datar`   invoicer   amount_textdescription_textpayment_textr   payment_messager   r   r   handle_balance_cryptobotO  sD   
r   rR   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   
    Обработчик выбора банковской карты для пополнения баланса
    Nr`   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   r`   r   info_messager   r   r   handle_balance_card  s&   r   rS   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}|sGt
|dd	}t }|rft|||}| jj||d
I dH  td| d nd}	| jj|	t|d
I dH  |  I dH  dS )ui   
    Обработчик выбора оператора для пополнения баланса
    Nr`   r   r   Tr   text34rO   rP   r   z.Displayed operator wallets for balance topup: r   A   Способы оплаты временно недоступны)r   r   r   r   r)   r   r   r   r*   r   r   r_   re   r%   rL   )
r   r   r   r4   r   r`   text34_contentr^   kbr   r   r   r   handle_balance_operator  s0   
r   c                    s   | j j}t|}| jttd }z|dd\}}t|}W n ty4   | j	dddI dH  Y dS w z
| j
 I dH  W n	 tyH   Y nw t }d}	|D ]\}
}|
|kr\|}	 nqP|	rxd| d	|	 }t||}| j
j	||d
I dH  nd}| j
j	|t|d
I dH  | 	 I dH  dS )u   Обработчик выбора кошелька для пополнения баланса - показывает текст кошелькаNra   rZ   u*   Ошибка выбора кошелькаTr    u.   💳 Пополнение баланса на z$

r   u<   Информация о кошельке не найдена)r   r   r   r}   lenrb   splitr   r*   r   r   r   r_   rg   rL   )r   r   r   r4   payloadwallet_name
amount_strr`   r^   wallet_textr   rG   full_messager   r   r   r   r   on_balance_wallet_clicked  s<   
r   c                    sf  | j j}t|}| jttd }|d}t|dk r3| jjdt	|dI dH  |  I dH  dS |d }t
|d }z
| j I dH  W n	 tyP   Y nw |j|dI dH  |d	krut|d
pdd}t|}	| jj||	dI dH  n5|dkrt|dpt|dd}
t }|rt|||}	| jj|
|	dI dH  nd}| jj|t	|dI dH  |  I dH  dS )u]   Обработчик навигации назад для пополнения балансаNra      u)   Возврат в главное менюr   r   rZ   r   paymentr   r   r^   r   rO   rP   r   )r   r   r   r}   r   rc   r   r   r   rL   r   r   r*   r   r   rX   r   r_   re   )r   r   r   r4   r   partsnav_typer`   r   r   r   r^   r   r   r   r   balance_back_navigation_handler  s<   
r   r   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   r   r   r   r   r   r   )r   r   r   r   r4   r   r   r`   payment_message_idr2   r   invoice_datar   balance_updatednew_balancer   bonus_addedr   success_messager   r   r   handle_balance_crypto_check)  sn   




r   )rh   )Cloggingr9   aiogramr   r   r   aiogram.typesr   r   r   r   aiogram.fsm.contextr	   aiogram.fsm.stater
   r   r8   r   r   r   r   r   ry   r'   r   	getLoggerr   r+   routerr   rK   rb   rc   r3   rw   rx   r?   rE   rL   rX   listtupler_   r   re   rg   dictr   r   r   r   r   boolr   callback_queryr}   r   r   r   r   r   r   r   
startswithr   r   r   r   r   r   r   <module>   s\    

&!
* 
&8((.