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.
Files changed (112) hide show
  1. {xync_client-0.0.57.dev11/xync_client.egg-info → xync_client-0.0.57.dev13}/PKG-INFO +1 -1
  2. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/agent.py +85 -116
  3. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13/xync_client.egg-info}/PKG-INFO +1 -1
  4. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/.env.sample +0 -0
  5. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/.gitignore +0 -0
  6. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/.pre-commit-config.yaml +0 -0
  7. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/README.md +0 -0
  8. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/makefile +0 -0
  9. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/pyproject.toml +0 -0
  10. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/setup.cfg +0 -0
  11. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestAgent.py +0 -0
  12. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestAsset.py +0 -0
  13. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestEx.py +0 -0
  14. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/TestOrder.py +0 -0
  15. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Binance/test_binance.py +0 -0
  16. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  17. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  18. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Gate/test_gate.py +0 -0
  19. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  20. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  21. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  22. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/__init__.py +0 -0
  23. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/tests/_todo_refact/_test_ex.py +0 -0
  24. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Agent.py +0 -0
  25. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Asset.py +0 -0
  26. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Auth.py +0 -0
  27. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/BaseTest.py +0 -0
  28. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Ex.py +0 -0
  29. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/InAgent.py +0 -0
  30. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/Order.py +0 -0
  31. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Abc/xtype.py +0 -0
  32. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/__init__.py +0 -0
  33. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/binance_async.py +0 -0
  34. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/earn_api.py +0 -0
  35. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/etype/ad.py +0 -0
  36. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/etype/pm.py +0 -0
  37. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/ex.py +0 -0
  38. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/exceptions.py +0 -0
  39. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/sapi.py +0 -0
  40. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Binance/web_c2c.py +0 -0
  41. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/__init__.py +0 -0
  42. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/agent.py +0 -0
  43. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/base.py +0 -0
  44. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/etype/ad.py +0 -0
  45. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/etype/pm.py +0 -0
  46. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/ex.py +0 -0
  47. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/req.mjs +0 -0
  48. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BingX/sign.js +0 -0
  49. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/__init__.py +0 -0
  50. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/agent.py +0 -0
  51. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/etype/ad.py +0 -0
  52. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitGet/ex.py +0 -0
  53. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/BitPapa/ex.py +0 -0
  54. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/InAgent.py +0 -0
  55. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/etype/ad.py +0 -0
  56. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/etype/cred.py +0 -0
  57. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/etype/order.py +0 -0
  58. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/ex.py +0 -0
  59. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/order.py +0 -0
  60. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/web_earn.py +0 -0
  61. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/web_p2p.py +0 -0
  62. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Bybit/ws.py +0 -0
  63. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gate/etype/ad.py +0 -0
  64. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gate/ex.py +0 -0
  65. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gate/premarket.py +0 -0
  66. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Gmail/__init__.py +0 -0
  67. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/agent.py +0 -0
  68. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/earn.py +0 -0
  69. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/__init__.py +0 -0
  70. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/ad.py +0 -0
  71. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/cred.py +0 -0
  72. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/pm.py +0 -0
  73. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/etype/test.py +0 -0
  74. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Htx/ex.py +0 -0
  75. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/etype/ad.py +0 -0
  76. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/etype/pm.py +0 -0
  77. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/ex.py +0 -0
  78. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/KuCoin/web.py +0 -0
  79. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Mexc/etype/ad.py +0 -0
  80. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Mexc/etype/pm.py +0 -0
  81. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Mexc/ex.py +0 -0
  82. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Okx/etype/ad.py +0 -0
  83. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Okx/etype/pm.py +0 -0
  84. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Okx/ex.py +0 -0
  85. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/.gitignore +0 -0
  86. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Alfa/__init__.py +0 -0
  87. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Alfa/state.json +0 -0
  88. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Ozon/__init__.py +0 -0
  89. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Sber/__init__.py +0 -0
  90. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  91. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Tinkoff/state.json +0 -0
  92. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/__init__.py +0 -0
  93. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  94. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  95. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/api.py +0 -0
  96. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/Pms/Volet/pl.py +0 -0
  97. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/agent.py +0 -0
  98. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/asset.py +0 -0
  99. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/auth.py +0 -0
  100. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/ex.py +0 -0
  101. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/inAgent.py +0 -0
  102. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/order.py +0 -0
  103. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/pyd.py +0 -0
  104. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/pyro.py +0 -0
  105. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/TgWallet/web.py +0 -0
  106. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/__init__.py +0 -0
  107. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/loader.py +0 -0
  108. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client/pm_unifier.py +0 -0
  109. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/SOURCES.txt +0 -0
  110. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/dependency_links.txt +0 -0
  111. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/requires.txt +0 -0
  112. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev13}/xync_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.57.dev11
3
+ Version: 0.0.57.dev13
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client
@@ -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, begin_time: int = None, end_time: int = None, status: int = None, side: int = None, token_id: str = None
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=1,
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 = order.confirmedPayTerm
414
- if not (credex := await models.CredEx.get_or_none(exid=cred.id, ex=self.ex_client.ex)):
415
- if not (crd := await models.Cred.get_or_none(pmcur__pm__pmex__exid=cred.paymentType)):
416
- extr = cred.bankName or cred.branchName or cred.qrcode or cred.payMessage or cred.paymentExt1
417
- crd = await models.Cred.create(
418
- detail=cred.accountNo,
419
- pmcur=await Pmcur.get(pm__pmex__exid=cred.paymentType, cur__ticker=ad.currencyId),
420
- person=ad_db.maker.person,
421
- name=cred.realName,
422
- extra=extr,
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
- credex = await models.CredEx.create(exid=cred.id, ex=self.ex_client.ex, cred=crd)
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
- taker, _ = await Actor.get_or_create(
427
- {"name": taker_nick}, person=taker_person, ex=self.ex_client.ex, exid=taker_id
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]), # todo: check
436
- "cred_id": credex.cred_id,
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(self, ad: Ad, rname: str = None, dr: Direction = None) -> tuple[models.Ad, bool]:
660
- sim = None
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 cleaned in {oc[0] for oc in self.all_conds.values()}:
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.exception("!!!!!!!!!", rest_uids)
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
- cond=new_cond,
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, True
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(ex=ex, cred__pmcur__pm__norm=n) for n in norms
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), # гонка в стакане покупки - мы продаем
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.57.dev11
3
+ Version: 0.0.57.dev13
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client