Skip to content

Commit f4b081f

Browse files
committed
API update and CLASS results
1. API updated to 1.5.1 2. Added parameter result_as_class, that allows getting call results as CLASS! 3. Minor fixes
1 parent cf50b9b commit f4b081f

6 files changed

Lines changed: 255 additions & 40 deletions

File tree

.github/workflows/setup_python.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
runs-on: ubuntu-latest
2121
strategy:
2222
matrix:
23-
python-version: [ '3.8','3.9', '3.10', '3.11', '3.12', 'pypy-3.9', 'pypy-3.10']
23+
python-version: [ '3.9', '3.10', '3.11', '3.12', 'pypy-3.9', 'pypy-3.10']
2424
name: ${{ matrix.python-version }} and tests
2525
steps:
2626
- uses: actions/checkout@v2

pyCryptoPayAPI/api.py

Lines changed: 106 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import requests
2+
try:
3+
from classes import *
4+
except:
5+
from classes import *
26

37
MAIN_API_URL = "https://pay.crypt.bot/api/"
48
TEST_API_URL = "https://testnet-pay.crypt.bot/api/"
@@ -18,19 +22,24 @@ class pyCryptoPayAPI:
1822
Crypto Pay API Client
1923
"""
2024

21-
def __init__(self, api_token, test_net = False, print_errors = False, timeout = None):
25+
def __init__(self, api_token, result_as_class = None, test_net = False, print_errors = False, timeout = None):
2226
"""
2327
Create the pyCryptoPayAPI instance.
2428
2529
:param api_token: API token obtained via @CryptoBot
30+
:param result_as_class: (Optional) If True, returns instances of classes, otherwise returns raw data
2631
:param test_net: (Optional) Use testnet instead of mainnet
2732
:param print_errors: (Optional) Print dumps on request errors
2833
:param timeout: (Optional) Request timeout
2934
"""
3035
self.api_token = api_token
36+
self.result_as_class = result_as_class if result_as_class else False
3137
self.test_net = test_net
3238
self.print_errors = print_errors
3339
self.timeout = timeout
40+
if result_as_class is None:
41+
print("Deprecation warning! The 'result_as_class' parameter should be set to False or True, default behaviour will be changed to 'True' in future versions!")
42+
3443

3544
def __request(self, method, **kwargs):
3645
if kwargs:
@@ -92,20 +101,25 @@ def get_me(self):
92101
:return: On success, returns basic information about an app.
93102
"""
94103
method = "getMe"
95-
return self.__request(method).get("result")
104+
result = self.__request(method).get("result")
105+
return Me(result) if self.result_as_class else result
96106

97107
def create_invoice(
98-
self, asset, amount,
108+
self, asset = None, amount = 0,
99109
description = None, hidden_message = None,
100110
paid_btn_name = None, paid_btn_url = None, payload = None,
101111
allow_comments = None, allow_anonymous = None,
102-
expires_in = None
112+
expires_in = None, currency_type = None, fiat = None,
113+
accepted_assets = None, swap_to = None
103114
):
104115
"""
105116
createInvoice method
106117
Use this method to create a new invoice.
107118
119+
:param currency_type: (String) Optional. Type of the price, can be “crypto” or “fiat”. Defaults to crypto.
108120
:param asset: (String) Currency code. Supported assets: “USDT”, “TON”, “BTC”, “ETH”, “BNB”, “TRX”, “BUSD” and “USDC”.
121+
:param fiat: (String) Optional. Required if currency_type is “fiat”. Fiat currency code. Supported fiat currencies: “USD”, “EUR”, “RUB”, “BYN”, “UAH”, “GBP”, “CNY”, “KZT”, “UZS”, “GEL”, “TRY”, “AMD”, “THB”, “INR”, “BRL”, “IDR”, “AZN”, “AED”, “PLN” and “ILS".
122+
:param accepted_assets: (String) Optional. List of cryptocurrency alphabetic codes separated by comma. Assets which can be used to pay the invoice. Available only if currency_type is “fiat”. Supported assets: “USDT”, “TON”, “BTC”, “ETH”, “BNB”, “TRX” and “USDC” (and “JET” for testnet). Defaults to all currencies.
109123
:param amount: (String) Amount of the invoice in float. For example: 125.50
110124
:param description: (String) Optional. Description for the invoice. User will see this description when they pay the invoice. Up to 1024 characters.
111125
:param hidden_message: (String) Optional. Text of the message that will be shown to a user after the invoice is paid. Up to 2o48 characters.
@@ -114,6 +128,7 @@ def create_invoice(
114128
openChannel – “View Channel”
115129
openBot – “Open Bot”
116130
callback – “Return”
131+
:param swap_to : (String) Optional. The asset that will be attempted to be swapped into after the user makes a payment (the swap is not guaranteed). Supported assets: "USDT", "TON", "TRX", "ETH", "SOL", "BTC", "LTC".
117132
:param paid_btn_url: (String) Optional. Required if paid_btn_name is used.URL to be opened when the button is pressed. You can set any success link (for example, a link to your bot). Starts with https or http.
118133
:param payload: (String) Optional. Any data you want to attach to the invoice (for example, user ID, payment ID, ect). Up to 4kb.
119134
:param allow_comments: (Boolean) Optional. Allow a user to add a comment to the payment. Default is true.
@@ -123,15 +138,24 @@ def create_invoice(
123138
"""
124139
method = "createInvoice"
125140
params = {
126-
"asset": asset,
127-
"amount": amount,
141+
"amount": amount if amount else 0,
128142
}
143+
if currency_type:
144+
params["currency_type"] = currency_type
145+
if asset:
146+
params["asset"] = asset
147+
if fiat:
148+
params["fiat"] = fiat
149+
if accepted_assets:
150+
params["accepted_assets"] = accepted_assets
129151
if description:
130152
params["description"] = description
131153
if hidden_message:
132154
params["hidden_message"] = hidden_message
133155
if paid_btn_name:
134156
params["paid_btn_name"] = paid_btn_name
157+
if swap_to:
158+
params["swap_to"] = swap_to
135159
if paid_btn_url:
136160
params["paid_btn_url"] = paid_btn_url
137161
if payload:
@@ -142,7 +166,8 @@ def create_invoice(
142166
params["allow_anonymous"] = allow_anonymous
143167
if expires_in:
144168
params["expires_in"] = expires_in
145-
return self.__request(method, **params).get("result")
169+
result = self.__request(method, **params).get("result")
170+
return Invoice(result) if self.result_as_class else result
146171

147172
def delete_invoice(self, invoice_id):
148173
"""
@@ -156,8 +181,8 @@ def delete_invoice(self, invoice_id):
156181
params = {
157182
"invoice_id": invoice_id
158183
}
159-
return self.__request(method, **params).get("result")
160-
184+
result = self.__request(method, **params).get("result")
185+
return result
161186

162187
def transfer(
163188
self, user_id , asset, amount, spend_id,
@@ -186,16 +211,18 @@ def transfer(
186211
params["comment"] = comment
187212
if disable_send_notification is not None:
188213
params["disable_send_notification"] = disable_send_notification
189-
return self.__request(method, **params).get("result")
214+
result = self.__request(method, **params).get("result")
215+
return Transfer(result) if self.result_as_class else result
190216

191217
def get_invoices(
192-
self, asset = None, invoice_ids = None, status = None, offset = None, count = None, return_items = False
218+
self, asset = None, fiat = None, invoice_ids = None, status = None, offset = None, count = None, return_items = False
193219
):
194220
"""
195221
getInvoices method
196222
Use this method to get invoices of your app.
197223
198-
:param asset: (String) Optional. Currency codes separated by comma. Supported assets: “USDT”, “TON”, “BTC”, “ETH”, “BNB”, “TRX”, “BUSD” and “USDC”. Defaults to all assets.
224+
:param asset: (String) Optional. Cryptocurrency alphabetic code. Supported assets: “USDT”, “TON”, “BTC”, “ETH”, “LTC”, “BNB”, “TRX” and “USDC” (and “JET” for testnet). Defaults to all currencies.
225+
:param fiat: (String) Optional. Fiat currency code. Supported fiat currencies: “USD”, “EUR”, “RUB”, “BYN”, “UAH”, “GBP”, “CNY”, “KZT”, “UZS”, “GEL”, “TRY”, “AMD”, “THB”, “INR”, “BRL”, “IDR”, “AZN”, “AED”, “PLN” and “ILS". Defaults to all currencies.
199226
:param invoice_ids: (String) Optional. Invoice IDs separated by comma.
200227
:param status: (String) Optional. Status of invoices to be returned. Available statuses: “active” and “paid”. Defaults to all statuses.
201228
:param offset: (Number) Optional. Offset needed to return a specific subset of invoices. Default is 0.
@@ -207,6 +234,8 @@ def get_invoices(
207234
params = {}
208235
if asset:
209236
params["asset"] = asset
237+
if fiat:
238+
params["fiat"] = fiat
210239
if invoice_ids:
211240
params["invoice_ids"] = invoice_ids
212241
if status:
@@ -216,13 +245,17 @@ def get_invoices(
216245
if count:
217246
params["count"] = count
218247
if params:
219-
res = self.__request(method, **params).get("result")
248+
result = self.__request(method, **params).get("result")
220249
else:
221-
res = self.__request(method).get("result")
222-
if res and return_items:
223-
return res.get("items")
250+
result = self.__request(method).get("result")
251+
if not result:
252+
return [] if return_items else None
253+
elif self.result_as_class:
254+
return [Invoice(item) for item in result.get("items", [])]
255+
elif return_items:
256+
return result.get("items")
224257
else:
225-
return res
258+
return result
226259

227260
def get_checks(
228261
self, asset = None, check_ids = None, status = None, offset = None, count = None, return_items = True
@@ -252,23 +285,28 @@ def get_checks(
252285
if count:
253286
params["count"] = count
254287
if params:
255-
res = self.__request(method, **params).get("result")
288+
result = self.__request(method, **params).get("result")
256289
else:
257-
res = self.__request(method).get("result")
258-
if res and return_items:
259-
return res.get("items")
290+
result = self.__request(method).get("result")
291+
if not result:
292+
return [] if return_items else None
293+
elif self.result_as_class:
294+
return [Check(item) for item in result.get("items", [])]
295+
elif return_items:
296+
return result.get("items")
260297
else:
261-
return res
298+
return result
262299

263300
def get_transfers(
264-
self, asset = None, transfer_ids = None, offset = None, count = None, return_items = True
301+
self, asset = None, transfer_ids = None, spend_id = None, offset = None, count = None, return_items = True
265302
):
266303
"""
267304
getTransfers method
268305
Use this method to get transfers created by your app.
269306
270307
:param asset: (String) Optional. Cryptocurrency alphabetic code.
271308
:param transfer_ids: (String) Optional. List of transfer IDs separated by comma.
309+
:param spend_id : (String) Optional. Unique UTF-8 transfer string.
272310
:param offset: (Number) Optional. Offset needed to return a specific subset of transfers. Defaults to 0.
273311
:param count: (Number) Optional. Number of transfers to be returned. Values between 1-1000 are accepted. Defaults to 100.
274312
:param return_items: (Boolean) Optional. Return items instead of the whole response. Default is True.
@@ -280,18 +318,24 @@ def get_transfers(
280318
params["asset"] = asset
281319
if transfer_ids:
282320
params["transfer_ids"] = transfer_ids
321+
if spend_id:
322+
params["spend_id"] = spend_id
283323
if offset:
284324
params["offset"] = offset
285325
if count:
286326
params["count"] = count
287327
if params:
288-
res = self.__request(method, **params).get("result")
328+
result = self.__request(method, **params).get("result")
289329
else:
290-
res = self.__request(method).get("result")
291-
if res and return_items:
292-
return res.get("items")
330+
result = self.__request(method).get("result")
331+
if not result:
332+
return [] if return_items else None
333+
elif self.result_as_class:
334+
return [Transfer(item) for item in result.get("items", [])]
335+
elif return_items:
336+
return result.get("items")
293337
else:
294-
return res
338+
return result
295339

296340
def get_balance(self):
297341
"""
@@ -301,7 +345,13 @@ def get_balance(self):
301345
:return: Returns array of assets.
302346
"""
303347
method = "getBalance"
304-
return self.__request(method).get("result")
348+
result = self.__request(method).get("result")
349+
if not result:
350+
return []
351+
elif self.result_as_class:
352+
return [Balance(item) for item in result]
353+
else:
354+
return result
305355

306356
def get_exchange_rates(self):
307357
"""
@@ -311,7 +361,13 @@ def get_exchange_rates(self):
311361
:return: Returns array of currencies.
312362
"""
313363
method = "getExchangeRates"
314-
return self.__request(method).get("result")
364+
result = self.__request(method).get("result")
365+
if not result:
366+
return []
367+
elif self.result_as_class:
368+
return [ExchangeRate(item) for item in result]
369+
else:
370+
return result
315371

316372
def get_currencies(self):
317373
"""
@@ -345,7 +401,8 @@ def create_check(
345401
params["pin_to_user_id"] = pin_to_user_id
346402
if pin_to_username:
347403
params["pin_to_username"] = pin_to_username
348-
return self.__request(method, **params).get("result")
404+
result = self.__request(method, **params).get("result")
405+
return Check(result) if self.result_as_class else result
349406

350407
def delete_check(self, check_id):
351408
"""
@@ -361,3 +418,21 @@ def delete_check(self, check_id):
361418
"check_id": check_id
362419
}
363420
return self.__request(method, **params).get("result")
421+
422+
def get_stats(self, start_at = None, end_at = None):
423+
"""
424+
getStats method
425+
Use this method to get app statistics.
426+
427+
:param start_at: (DateTime/String) Optional. Date from which start calculating statistics in ISO 8601 format. Defaults is current date minus 24 hours.
428+
:param end_at: (DateTime/String) Optional. The date on which to finish calculating statistics in ISO 8601 format. Defaults is current date.
429+
:return: Returns AppStats.
430+
"""
431+
method = "getStats"
432+
params = {}
433+
if start_at:
434+
params["start_at"] = start_at
435+
if end_at:
436+
params["end_at"] = end_at
437+
result = self.__request(method, **params).get("result")
438+
return AppStats(result) if self.result_as_class else result

0 commit comments

Comments
 (0)