xync-client 0.0.57.dev11__tar.gz → 0.0.57.dev13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {xync_client-0.0.57.dev11/xync_client.egg-info → xync_client-0.0.57.dev13}/PKG-INFO +1 -1
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/agent.py +85 -116
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13/xync_client.egg-info}/PKG-INFO +1 -1
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/.env.sample +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/.gitignore +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/.pre-commit-config.yaml +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/README.md +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/makefile +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/pyproject.toml +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/setup.cfg +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestAgent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestAsset.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestEx.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestOrder.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Binance/test_binance.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Gate/test_gate.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Wallet/test_agent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Wallet/test_ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/_test_ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Agent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Asset.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Auth.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/BaseTest.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/InAgent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Order.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/xtype.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/binance_async.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/earn_api.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/etype/pm.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/exceptions.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/sapi.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/web_c2c.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/agent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/base.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/etype/pm.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/req.mjs +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/sign.js +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/agent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitPapa/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/InAgent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/etype/cred.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/etype/order.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/order.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/web_earn.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/web_p2p.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/ws.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gate/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gate/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gate/premarket.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gmail/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/agent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/earn.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/cred.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/pm.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/test.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/etype/pm.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/web.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Mexc/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Mexc/etype/pm.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Mexc/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Okx/etype/ad.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Okx/etype/pm.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Okx/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/.gitignore +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Alfa/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Alfa/state.json +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Ozon/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Sber/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Tinkoff/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Tinkoff/state.json +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/api.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/pl.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/agent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/asset.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/auth.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/ex.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/inAgent.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/order.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/pyd.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/pyro.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/web.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/__init__.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/loader.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/pm_unifier.py +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/SOURCES.txt +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/dependency_links.txt +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/requires.txt +0 -0
- {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/top_level.txt +0 -0
|
@@ -12,6 +12,7 @@ from asyncpg import ConnectionDoesNotExistError
|
|
|
12
12
|
from bybit_p2p import P2P
|
|
13
13
|
from bybit_p2p._exceptions import FailedRequestError
|
|
14
14
|
from pyro_client.client.file import FileClient
|
|
15
|
+
from tortoise.exceptions import IntegrityError
|
|
15
16
|
from tortoise.expressions import F, Q
|
|
16
17
|
from urllib3.exceptions import ReadTimeoutError
|
|
17
18
|
from x_model import init_db
|
|
@@ -383,11 +384,17 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
383
384
|
)
|
|
384
385
|
|
|
385
386
|
async def get_api_orders(
|
|
386
|
-
self,
|
|
387
|
+
self,
|
|
388
|
+
page: int = 1,
|
|
389
|
+
begin_time: int = None,
|
|
390
|
+
end_time: int = None,
|
|
391
|
+
status: int = None,
|
|
392
|
+
side: int = None,
|
|
393
|
+
token_id: str = None,
|
|
387
394
|
):
|
|
388
395
|
try:
|
|
389
396
|
lst = self.api.get_orders(
|
|
390
|
-
page=
|
|
397
|
+
page=page,
|
|
391
398
|
size=30,
|
|
392
399
|
# status=status, # 50 - завершено
|
|
393
400
|
# tokenId=token_id,
|
|
@@ -397,43 +404,62 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
397
404
|
)
|
|
398
405
|
except FailedRequestError as e:
|
|
399
406
|
if e.status_code == 10000:
|
|
400
|
-
await sleep(1, await self.get_api_orders(begin_time, end_time, status, side, token_id))
|
|
407
|
+
await sleep(1, await self.get_api_orders(page, begin_time, end_time, status, side, token_id))
|
|
401
408
|
ords = {int(o["id"]): OrderItem.model_validate(o) for o in lst["result"]["items"]}
|
|
402
409
|
for oid, o in ords.items():
|
|
403
410
|
fo = self.api.get_order_details(orderId=oid)
|
|
404
411
|
order = OrderFull.model_validate(fo["result"])
|
|
412
|
+
await sleep(0.5)
|
|
405
413
|
ad = Ad(**self.api.get_ad_details(itemId=order.itemId)["result"])
|
|
406
414
|
maker_name = o.buyerRealName, o.sellerRealName # ad.side
|
|
407
415
|
im_maker = order.makerUserId == o.userId
|
|
408
416
|
taker_id = (o.userId, o.targetUserId)[int(im_maker)]
|
|
409
417
|
taker_nick = (self.actor.name, o.targetNickName)[int(im_maker)]
|
|
410
|
-
ad_db, cond_isnew = await self.cond_upsert(ad, maker_name[ad.side])
|
|
418
|
+
ad_db, cond_isnew = await self.cond_upsert(ad, maker_name[ad.side], force=True)
|
|
411
419
|
if not ad_db:
|
|
412
420
|
...
|
|
413
|
-
cred
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
421
|
+
if (cred := order.confirmedPayTerm).paymentType:
|
|
422
|
+
if not (credex := await models.CredEx.get_or_none(exid=cred.id, ex=self.ex_client.ex)):
|
|
423
|
+
if (
|
|
424
|
+
await Pmcur.filter(
|
|
425
|
+
pm__pmexs__ex=self.ex_client.ex, pm__pmexs__exid=cred.paymentType, cur__ticker=ad.currencyId
|
|
426
|
+
).count()
|
|
427
|
+
!= 1
|
|
428
|
+
):
|
|
429
|
+
...
|
|
430
|
+
pmcur = await Pmcur.get(
|
|
431
|
+
pm__pmexs__ex=self.ex_client.ex, pm__pmexs__exid=cred.paymentType, cur__ticker=ad.currencyId
|
|
423
432
|
)
|
|
424
|
-
|
|
433
|
+
if not (
|
|
434
|
+
crd := await models.Cred.get_or_none(
|
|
435
|
+
pmcur=pmcur, person=ad_db.maker.person, detail=cred.accountNo
|
|
436
|
+
)
|
|
437
|
+
):
|
|
438
|
+
extr = cred.bankName or cred.branchName or cred.qrcode or cred.payMessage or cred.paymentExt1
|
|
439
|
+
crd = await models.Cred.create(
|
|
440
|
+
detail=cred.accountNo,
|
|
441
|
+
pmcur=pmcur,
|
|
442
|
+
person=ad_db.maker.person,
|
|
443
|
+
name=cred.realName,
|
|
444
|
+
extra=extr,
|
|
445
|
+
)
|
|
446
|
+
credex = await models.CredEx.create(exid=cred.id, ex=self.ex_client.ex, cred=crd)
|
|
425
447
|
taker_person, _ = await Person.get_or_create(name=maker_name[::-1][ad.side])
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
448
|
+
try:
|
|
449
|
+
taker, _ = await Actor.get_or_create(
|
|
450
|
+
{"name": taker_nick, "person": taker_person}, ex=self.ex_client.ex, exid=taker_id
|
|
451
|
+
)
|
|
452
|
+
except IntegrityError as e:
|
|
453
|
+
logging.error(e)
|
|
429
454
|
order_db, _ = await models.Order.update_or_create(
|
|
430
455
|
{
|
|
431
456
|
"amount": o.amount,
|
|
432
457
|
"status": OrderStatus[Statuses(o.status).name],
|
|
433
458
|
"created_at": int(o.createDate[:-3]),
|
|
434
|
-
"payed_at": int(order.transferDate[:-3]),
|
|
435
|
-
"confirmed_at": int(order.updateDate[:-3]),
|
|
436
|
-
"
|
|
459
|
+
"payed_at": order.transferDate != "0" and int(order.transferDate[:-3]),
|
|
460
|
+
"confirmed_at": Statuses(o.status) == Statuses.completed and int(order.updateDate[:-3]),
|
|
461
|
+
"appealed_at": o.status == 30 and int(order.updateDate[:-3]),
|
|
462
|
+
"cred_id": cred.paymentType and credex.cred_id or None,
|
|
437
463
|
"taker": taker,
|
|
438
464
|
},
|
|
439
465
|
exid=o.id,
|
|
@@ -454,7 +480,9 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
454
480
|
for m in msgs
|
|
455
481
|
]
|
|
456
482
|
_ = await models.Msg.bulk_create(msgs_db, ignore_conflicts=True)
|
|
457
|
-
|
|
483
|
+
logging.info(f"orders page#{page} imported ok!")
|
|
484
|
+
if len(ords) == 30:
|
|
485
|
+
await self.get_api_orders(page + 1, begin_time, end_time, status, side, token_id)
|
|
458
486
|
|
|
459
487
|
async def mad_upd(self, mad: Ad, attrs: dict, cxids: list[str]):
|
|
460
488
|
if not [setattr(mad, k, v) for k, v in attrs.items() if getattr(mad, k) != v]:
|
|
@@ -509,7 +537,7 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
509
537
|
):
|
|
510
538
|
k = (-1) ** int(is_sell) # on_buy=1, on_sell=-1
|
|
511
539
|
|
|
512
|
-
creds: dict[models.Pmex, models.CredEx] = await get_creds(pms, self.actor.ex)
|
|
540
|
+
creds: dict[models.Pmex, models.CredEx] = await get_creds(pms, self.actor.ex, curex.cur)
|
|
513
541
|
if not volume:
|
|
514
542
|
if is_sell: # гонка в стакане продажи - мы покупаем монету за ФИАТ
|
|
515
543
|
# todo: we using the only one fiat exactly from THE FIRST cred
|
|
@@ -598,7 +626,7 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
598
626
|
k = (-1) ** int(is_sell) # on_buy=1, on_sell=-1
|
|
599
627
|
|
|
600
628
|
if pms:
|
|
601
|
-
creds: dict[models.Pmex, models.CredEx] = await get_creds(pms, self.actor.ex)
|
|
629
|
+
creds: dict[models.Pmex, models.CredEx] = await get_creds(pms, self.actor.ex, curex.cur)
|
|
602
630
|
[str(p.exid) for p in creds.values()]
|
|
603
631
|
|
|
604
632
|
if is_sell: # гонка в стакане продажи - мы покупаем монету за ФИАТ
|
|
@@ -616,10 +644,6 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
616
644
|
pairex__pair__cur_id=curex.cur_id,
|
|
617
645
|
sell=is_sell,
|
|
618
646
|
)
|
|
619
|
-
self.all_conds = {
|
|
620
|
-
c.id: (c.raw_txt, {str(a.maker.exid) for a in c.ads})
|
|
621
|
-
for c in await Cond.all().prefetch_related("ads__maker")
|
|
622
|
-
}
|
|
623
647
|
while self.actor.person.user.status > 0: # todo: depends on rest asset/fiat
|
|
624
648
|
ads: list[Ad] = await self.ads(coinex, curex, is_sell, pms and list(creds.keys()))
|
|
625
649
|
|
|
@@ -656,10 +680,18 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
656
680
|
logging.warning("Connection failed. Restarting..")
|
|
657
681
|
await sleep(6)
|
|
658
682
|
|
|
659
|
-
async def cond_upsert(
|
|
660
|
-
|
|
683
|
+
async def cond_upsert(
|
|
684
|
+
self, ad: Ad, rname: str = None, dr: Direction = None, force: bool = False
|
|
685
|
+
) -> tuple[models.Ad, bool]:
|
|
686
|
+
sim, cid = None, None
|
|
661
687
|
# если точно такое условие уже есть в бд, ниче делать не надо
|
|
662
|
-
if not (cleaned := clean(ad.remark)) or
|
|
688
|
+
if not (cleaned := clean(ad.remark)) or (cid := {oc[0]: ci for ci, oc in self.all_conds.items()}.get(cleaned)):
|
|
689
|
+
if force:
|
|
690
|
+
return (
|
|
691
|
+
await models.Ad.get_or_none(exid=ad.id).prefetch_related("maker__person")
|
|
692
|
+
or await self.ad_create(ad, cid, rname, dr),
|
|
693
|
+
False,
|
|
694
|
+
)
|
|
663
695
|
return None, False
|
|
664
696
|
# если эта объява уже есть в бд
|
|
665
697
|
if ad_db := await models.Ad.get_or_none(exid=ad.id).prefetch_related("cond__ads__maker", "maker__person"):
|
|
@@ -676,7 +708,9 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
676
708
|
return ad_db, True
|
|
677
709
|
# проверка на всякий что точно нет такого условия
|
|
678
710
|
if new_cond := await Cond.get_or_none(raw_txt=cleaned):
|
|
679
|
-
logging.
|
|
711
|
+
logging.warning(f"Условие {new_cond.id} появилось в бд из других потоков")
|
|
712
|
+
if rest_ads and rest_uids:
|
|
713
|
+
logging.exception("И оно есть объявах других юезров", rest_ads, rest_uids)
|
|
680
714
|
# если других объяв со старым условием этой обявы нет, либо они все этого же юзера
|
|
681
715
|
# обновляем условие (в тч во всех ЕГО объявах)
|
|
682
716
|
ad_db.cond.last_ver = ad_db.cond.raw_txt
|
|
@@ -707,6 +741,13 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
707
741
|
|
|
708
742
|
new_cond = await Cond.create(raw_txt=cleaned)
|
|
709
743
|
self.all_conds[new_cond.id] = new_cond.raw_txt, {ad.userId}
|
|
744
|
+
# если нашелся похожий текст у другого юзера, добавим связь с % похожести
|
|
745
|
+
if sim:
|
|
746
|
+
await self.sim_new(new_cond.id, sim, old_cid)
|
|
747
|
+
|
|
748
|
+
return await self.ad_create(ad, new_cond.id), True
|
|
749
|
+
|
|
750
|
+
async def ad_create(self, ad: Ad, cid: int, rname: str = None, dr: Direction = None) -> models.Ad:
|
|
710
751
|
act_df = {}
|
|
711
752
|
if int(ad.userId) != self.actor.exid:
|
|
712
753
|
act_df |= {"name": ad.nickName}
|
|
@@ -718,7 +759,7 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
718
759
|
amount=float(ad.quantity) * float(ad.price),
|
|
719
760
|
min_fiat=ad.minAmount,
|
|
720
761
|
max_fiat=ad.maxAmount,
|
|
721
|
-
|
|
762
|
+
cond_id=cid,
|
|
722
763
|
exid=int(ad.id),
|
|
723
764
|
direction=dr
|
|
724
765
|
or await Direction.get(
|
|
@@ -729,13 +770,8 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
729
770
|
),
|
|
730
771
|
maker=actor,
|
|
731
772
|
)
|
|
732
|
-
|
|
733
|
-
# если нашелся похожий текст у другого юзера, добавим связь с % похожести
|
|
734
|
-
if sim:
|
|
735
|
-
await self.sim_new(new_cond.id, sim, old_cid)
|
|
736
|
-
|
|
737
773
|
await ad_db.fetch_related("cond", "maker__person")
|
|
738
|
-
return ad_db
|
|
774
|
+
return ad_db
|
|
739
775
|
|
|
740
776
|
async def sim_new(self, new_cid: int, sim: int, old_cid: int):
|
|
741
777
|
if not sim:
|
|
@@ -749,80 +785,6 @@ class AgentClient(BaseAgentClient): # Bybit client
|
|
|
749
785
|
sim_db.similarity = get_sim(new_txt, op_cond.raw_txt)
|
|
750
786
|
await sim_db.save()
|
|
751
787
|
|
|
752
|
-
#
|
|
753
|
-
# async def cond_upsert(
|
|
754
|
-
# self, ad: Ad, rname: str = None, dr: Direction = None, cid: int = 0
|
|
755
|
-
# ) -> tuple[models.Ad, bool]:
|
|
756
|
-
# sim = None
|
|
757
|
-
# dr = dr or await Direction.get(
|
|
758
|
-
# sell=ad.side,
|
|
759
|
-
# pairex__ex=self.ex_client.ex,
|
|
760
|
-
# pairex__pair__coin__ticker=ad.tokenId,
|
|
761
|
-
# pairex__pair__cur__ticker=ad.currencyId,
|
|
762
|
-
# )
|
|
763
|
-
# # если точно такого условия еще нет в бд
|
|
764
|
-
# old_conds = self.all_conds.copy() if cid else self.all_conds
|
|
765
|
-
# if cid: # если есть то это не текущий проверяемый cond
|
|
766
|
-
# old_conds.pop(cid)
|
|
767
|
-
# if (cleaned := clean(ad.remark)) and cleaned not in {oc[0] for oc in old_conds.values()}:
|
|
768
|
-
# # находим все старые тексты похожие на 90% и более
|
|
769
|
-
# if sim_connds := {
|
|
770
|
-
# old_cid: (txt, sim)
|
|
771
|
-
# for old_cid, (txt, uids) in old_conds.items()
|
|
772
|
-
# if len(cleaned) > 15
|
|
773
|
-
# and ad.userId not in uids
|
|
774
|
-
# and cid not in self.sim_conds.get(old_cid, {})
|
|
775
|
-
# and (sim := int((SequenceMatcher(None, cleaned, txt).ratio() - 0.9) * 10_000))
|
|
776
|
-
# > self.cond_sims.get(cid, (..., 0))[1]
|
|
777
|
-
# }:
|
|
778
|
-
# # если есть, берем самый похожий из них
|
|
779
|
-
# old_cid, (txt, sim) = max(sim_connds.items(), key=lambda x: x[1])
|
|
780
|
-
# old_ads = await models.Ad.filter(cond_id=old_cid, maker__exid=int(ad.userId)).prefetch_related("cond")
|
|
781
|
-
# for old_ad in old_ads:
|
|
782
|
-
# # и у этого чела есть объява с почти таким же текстом
|
|
783
|
-
# if old_ad.exid == int(ad.id): # и он изменил текст как раз в ней
|
|
784
|
-
# # заменяем текст без создания нового cond
|
|
785
|
-
# await old_ad.cond.update_or_create(raw_txt=cleaned)
|
|
786
|
-
# await old_ad.fetch_related("cond")
|
|
787
|
-
# return old_ad, False
|
|
788
|
-
# # но это не она, значит у него есть другая объява с похожим, но чуть отличающимся текстом
|
|
789
|
-
# logging.warning(f"ad#{ad.id}-cond#{old_cid} txt updated:\n{txt}\n|\n|\nV\n{cleaned}")
|
|
790
|
-
# if not cid:
|
|
791
|
-
# cond, isnew = await Cond.get_or_create(raw_txt=cleaned)
|
|
792
|
-
# cid = cond.id
|
|
793
|
-
# if isnew:
|
|
794
|
-
# self.all_conds[cid] = cond.raw_txt, {ad.userId}
|
|
795
|
-
# if sim and sim_connds: # если нашелся похожий текст у другого юзера, добавим связь с % похожести
|
|
796
|
-
# await CondSim.update_or_create({"similarity": sim, "cond_rel_id": old_cid}, cond_id=cid)
|
|
797
|
-
# self.cond_sims[cid] = old_cid, sim
|
|
798
|
-
# self.sim_conds[old_cid].add(cid)
|
|
799
|
-
# if not ad.price:
|
|
800
|
-
# return
|
|
801
|
-
# act_df = {"name": ad.nickName}
|
|
802
|
-
# if rname:
|
|
803
|
-
# act_df |= {"person": await Person.get_or_create(name=rname)}
|
|
804
|
-
# actor, _ = await Actor.update_or_create(act_df, exid=ad.userId, ex=self.ex_client.ex)
|
|
805
|
-
# ad_db, _ = await models.Ad.update_or_create(
|
|
806
|
-
# {
|
|
807
|
-
# "price": ad.price,
|
|
808
|
-
# "amount": float(ad.quantity) * float(ad.price),
|
|
809
|
-
# "min_fiat": ad.minAmount,
|
|
810
|
-
# "max_fiat": ad.maxAmount,
|
|
811
|
-
# "cond": cond,
|
|
812
|
-
# },
|
|
813
|
-
# exid=int(ad.id),
|
|
814
|
-
# direction=dr
|
|
815
|
-
# or await Direction.get(
|
|
816
|
-
# sell=ad.side,
|
|
817
|
-
# pairex__ex=self.ex_client.ex,
|
|
818
|
-
# pairex__pair__coin__ticker=ad.tokenId,
|
|
819
|
-
# pairex__pair__cur__ticker=ad.currency,
|
|
820
|
-
# ),
|
|
821
|
-
# maker=actor,
|
|
822
|
-
# )
|
|
823
|
-
# await ad_db.fetch_related("cond")
|
|
824
|
-
# return ad_db, isnew
|
|
825
|
-
|
|
826
788
|
async def actual_cond(self):
|
|
827
789
|
self.all_conds = {
|
|
828
790
|
c.id: (c.raw_txt, {str(a.maker.exid) for a in c.ads})
|
|
@@ -885,9 +847,12 @@ def listen(data: dict):
|
|
|
885
847
|
print(data)
|
|
886
848
|
|
|
887
849
|
|
|
888
|
-
async def get_creds(norms: list[str], ex: models.Ex) -> dict[models.Pmex, models.CredEx]:
|
|
850
|
+
async def get_creds(norms: list[str], ex: models.Ex, cur: Cur) -> dict[models.Pmex, models.CredEx]:
|
|
889
851
|
return {
|
|
890
|
-
await models.Pmex.get(ex=ex, pm__norm=n): await models.CredEx.get(
|
|
852
|
+
await models.Pmex.get(ex=ex, pm__norm=n): await models.CredEx.get(
|
|
853
|
+
ex=ex, cred__pmcur__pm__norm=n, pmcur__cur=cur
|
|
854
|
+
)
|
|
855
|
+
for n in norms
|
|
891
856
|
}
|
|
892
857
|
|
|
893
858
|
|
|
@@ -917,8 +882,12 @@ async def main():
|
|
|
917
882
|
# await models.Direction.get(
|
|
918
883
|
# pairex__ex=cl.actor.ex, pairex__pair__coin__ticker="USDT", pairex__pair__cur__ticker="RUB", sell=True
|
|
919
884
|
# )
|
|
885
|
+
cl.all_conds = {
|
|
886
|
+
c.id: (c.raw_txt, {str(a.maker.exid) for a in c.ads})
|
|
887
|
+
for c in await Cond.all().prefetch_related("ads__maker")
|
|
888
|
+
}
|
|
920
889
|
# await cl.set_creds()
|
|
921
|
-
await cl.get_api_orders()
|
|
890
|
+
await cl.get_api_orders(16)
|
|
922
891
|
# await cl.actual_cond()
|
|
923
892
|
await gather(
|
|
924
893
|
cl.battle(usdt, rub, False, ["volet"], 79.97), # гонка в стакане покупки - мы продаем
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Binance/test_binance.py
RENAMED
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Bybit/test_bybit.py
RENAMED
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Bybit/test_bybit_p2p.py
RENAMED
|
File without changes
|
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Htx/test_htx_p2p.py
RENAMED
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Wallet/test_agent.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/_todo_req/req.mjs
RENAMED
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/_todo_req/req.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|