diff --git a/user_api/call2api.py b/user_api/call2api.py index 1485f27..7b60565 100644 --- a/user_api/call2api.py +++ b/user_api/call2api.py @@ -1,5 +1,5 @@ from aiohttp import ClientSession -from json import dumps, loads +from json import loads import asyncio from db import read, write diff --git a/user_api/call2user_api.py b/user_api/call2user_api.py index b55cc2b..c250338 100644 --- a/user_api/call2user_api.py +++ b/user_api/call2user_api.py @@ -4,49 +4,92 @@ # Именно здесь вы можете тыкать UserAPI. # Секция UserAPI - для вас. # +# ⚠️ Если вы не дружите с асинхроном ⚠️ +# То есть не знаете что такое await, async и т.п. +# То, пожалуйста, перейдите в call2user_api_sync.py +# # Если вы не находитесь на сервере (а вы не находитесь), вам нужно поменять url_prefix. # Сделать формата 'https://vpc-api.del.pw' (если эта ссылка не устарела) # # Секция SystemAPI и call2api.py вам не нужен, но можете его изучить. # Эта часть кода взаимодействует с SystemAPI, который недоступен. +# +# Для использования просто импортировать этот файл и использовать функции: +# ``` +# from call2user_api import * +# ... +# user = await user_in_db(username, user_token) +# ``` +# Можете переносить файл куда хотите, но вместе с db.py (функция read() + авто-создание конфигурации) # ---------------------- -global url_prefix -url_prefix = 'http://127.0.0.1:8010/' +# Загрузка префикса UserAPI +# (МЕНЯЙТЕ URL!!! если нужно, в config.json) +from db import read +import asyncio +CONFIG = asyncio.run(read()) +url_prefix = CONFIG['user_api_url'] -from call2api import call +# Библиотеки для работы call() +from aiohttp import ClientSession +from json import loads +async def call(api_url, data, pre=True, fix=True): + url = (url_prefix + api_url) if pre else api_url + async with ClientSession() as session: + async with session.post(url, json=data) as response: + text = await response.text() + try: + json = loads(text) + if 'detail' in json: + return json['detail'] + else: + return json + except: + if fix: + return text.replace('"', '') + else: + return text #------------------------------------------------------------ # UserAPI #------------------------------------------------------------ +# Получение информации о токене async def get_user_token_info(username, user_token): data = {'username': username, 'user_token': user_token} return await call('api/get_user_token_info/', data) +# Получение пользователя (ник, айди ТГ, ДС и т.п.) async def user_in_db(username, user_token): data = {'username': username, 'user_token': user_token} return await call('api/user_in_db/', data) +# Перевод монет async def transfer_coins(username, user_token, dst_username, amount): data = {'username': username, 'user_token': user_token, 'dst_username': dst_username, 'amount': amount} return await call('api/transfer_coins/', data) +# Получение глобальной статистики async def get_stats(username, user_token): data = {'username': username, 'user_token': user_token} return await call('api/get_stats/', data) +# Создание счёта на оплату, чтобы проверить оплачен ли он +# Использование в боте: /pay <ник> <сумма> async def create_invoice(username, user_token, amount=None): data = {'username': username, 'user_token': user_token} if amount: data['amount'] = amount return await call('api/create_invoice/', data) +# Удаление счёта на оплату по invoice_id async def delete_invoice(username, user_token, id): data = {'username': username, 'user_token': user_token, 'id': id} return await call('api/delete_invoice/', data) +# Получение информации о счёте на оплату: +# конечный получатель, сумма, статус (оплачен/нет: True/False) async def get_invoice(username, user_token, id): data = {'username': username, 'user_token': user_token, 'id': id} return await call('api/get_invoice/', data) @@ -56,6 +99,7 @@ async def get_invoice(username, user_token, id): #------------------------------------------------------------ # SystemAPI usage only #------------------------------------------------------------ +# Здесь вы ничего не используете, пропускайте async def register_user_token(token, user_token): data = {'token': token, 'user_token': user_token} return await call('api/register_user_token/', data) diff --git a/user_api/call2user_api_sync.py b/user_api/call2user_api_sync.py new file mode 100644 index 0000000..378bd5c --- /dev/null +++ b/user_api/call2user_api_sync.py @@ -0,0 +1,95 @@ +# HERE WE GO +# -------- RUS --------- +# ⚠️ Для тех, кто не понял ⚠️ +# Именно здесь вы можете тыкать UserAPI. +# Секция UserAPI - для вас. +# +# ⚠️ Если вы хотите с асинхрон ⚠️ +# Перейдите в call2user_api.py +# +# Если вы не находитесь на сервере (а вы не находитесь), вам нужно поменять url_prefix. +# Сделать формата 'https://vpc-api.del.pw' (если эта ссылка не устарела) +# +# Секция SystemAPI и call2api.py вам не нужен, но можете его изучить. +# Эта часть кода взаимодействует с SystemAPI, который недоступен. +# +# Для использования просто импортировать этот файл и использовать функции: +# ``` +# from call2user_api_sync import * +# ... +# user = user_in_db(username, user_token) +# ``` +# Можете переносить файл куда хотите, но вместе с db.py (функция read() + авто-создание конфигурации) +# ---------------------- + +# Загрузка префикса UserAPI +# (МЕНЯЙТЕ URL!!! если нужно, в config.json) +from db import read +import requests +from json import loads + +# Synchronous database read +CONFIG = read() +url_prefix = CONFIG['user_api_url'] + +def call(api_url, data, pre=True, fix=True): + url = (url_prefix + api_url) if pre else api_url + with requests.Session() as session: + response = session.post(url, json=data) + text = response.text + try: + json = loads(text) + if 'detail' in json: + return json['detail'] + else: + return json + except: + if fix: + return text.replace('"', '') + else: + return text + +#------------------------------------------------------------ +# UserAPI +#------------------------------------------------------------ +# Получение информации о токене +def get_user_token_info(username, user_token): + data = {'username': username, 'user_token': user_token} + return call('api/get_user_token_info/', data) + +# Получение пользователя (ник, айди ТГ, ДС и т.п.) +def user_in_db(username, user_token): + data = {'username': username, 'user_token': user_token} + return call('api/user_in_db/', data) + +# Перевод монет +def transfer_coins(username, user_token, + dst_username, amount): + data = {'username': username, 'user_token': user_token, + 'dst_username': dst_username, 'amount': amount} + return call('api/transfer_coins/', data) + +# Получение глобальной статистики +def get_stats(username, user_token): + data = {'username': username, 'user_token': user_token} + return call('api/get_stats/', data) + +# Создание счёта на оплату, чтобы проверить оплачен ли он +# Использование в боте: /pay <ник> <сумма> +def create_invoice(username, user_token, amount=None): + data = {'username': username, 'user_token': user_token} + if amount: + data['amount'] = amount + return call('api/create_invoice/', data) + +# Удаление счёта на оплату по invoice_id +def delete_invoice(username, user_token, id): + data = {'username': username, 'user_token': user_token, 'id': id} + return call('api/delete_invoice/', data) + +# Получение информации о счёте на оплату: +# конечный получатель, сумма, статус (оплачен/нет: True/False) +def get_invoice(username, user_token, id): + data = {'username': username, 'user_token': user_token, 'id': id} + return call('api/get_invoice/', data) +#------------------------- END ------------------------------ \ No newline at end of file diff --git a/user_api/db.py b/user_api/db.py index 53c3593..a919081 100644 --- a/user_api/db.py +++ b/user_api/db.py @@ -49,8 +49,9 @@ class UserToken(SQLModel, table=True): #------------------------------------------------------------ config_file = 'config.json' if not path.exists(config_file): - db = {'system_api_token': 'None', - 'system_api_url': 'None'} + db = {'system_api_token': 'You_can_skip_this', + 'system_api_url': 'You_can_skip_this', + 'user_api_url': 'https://vpc-api.del.pw/'} js = json.dumps(db, indent=2) with open(config_file, "w") as outfile: outfile.write(js)