53 lines
2.6 KiB
Python
53 lines
2.6 KiB
Python
import app.telegram.database.requests as rq
|
||
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
||
import logging.config
|
||
from logger_helper.logger_helper import LOGGING_CONFIG
|
||
from pybit.unified_trading import HTTP
|
||
|
||
logging.config.dictConfig(LOGGING_CONFIG)
|
||
logger = logging.getLogger("balance")
|
||
|
||
|
||
async def get_balance(tg_id: int, message) -> float:
|
||
"""
|
||
Асинхронно получает общий баланс пользователя на Bybit.
|
||
|
||
Процедура:
|
||
- Получает API ключ и секрет пользователя из базы данных.
|
||
- Если ключи не заданы, отправляет пользователю сообщение с предложением подключить платформу.
|
||
- Создает клиент Bybit с ключами.
|
||
- Запрашивает общий баланс по типу аккаунта UNIFIED.
|
||
- Если ответ успешен, возвращает баланс в виде float.
|
||
- При ошибках API или исключениях логирует ошибку и уведомляет пользователя.
|
||
|
||
:param tg_id: int - идентификатор пользователя Telegram
|
||
:param message: объект сообщения для отправки ответов пользователю
|
||
:return: float - общий баланс пользователя; 0 при ошибке или отсутствии ключей
|
||
"""
|
||
api_key = await rq.get_bybit_api_key(tg_id)
|
||
secret_key = await rq.get_bybit_secret_key(tg_id)
|
||
|
||
client = HTTP(
|
||
api_key=api_key,
|
||
api_secret=secret_key
|
||
)
|
||
|
||
if api_key == 'None' or secret_key == 'None':
|
||
await message.answer('⚠️ Подключите платформу для торговли',
|
||
reply_markup=inline_markup.connect_bybit_api_markup)
|
||
return 0
|
||
|
||
try:
|
||
response = client.get_wallet_balance(accountType='UNIFIED')
|
||
if response['retCode'] == 0:
|
||
total_balance = response['result']['list'][0].get('totalWalletBalance', '0')
|
||
return total_balance
|
||
else:
|
||
logger.error(f"Ошибка API: {response.get('retMsg')}")
|
||
await message.answer(f"⚠️ Ошибка API: {response.get('retMsg')}")
|
||
return 0
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при получении общего баланса: {e}")
|
||
await message.answer('⚠️ Ошибка при получении баланса')
|
||
return 0
|