xync-client 0.0.57.dev11__tar.gz → 0.0.57.dev12__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.dev12}/PKG-INFO +1 -1
  2. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/agent.py +61 -112
  3. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12/xync_client.egg-info}/PKG-INFO +1 -1
  4. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/.env.sample +0 -0
  5. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/.gitignore +0 -0
  6. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/.pre-commit-config.yaml +0 -0
  7. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/README.md +0 -0
  8. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/makefile +0 -0
  9. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/pyproject.toml +0 -0
  10. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/setup.cfg +0 -0
  11. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/TestAgent.py +0 -0
  12. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/TestAsset.py +0 -0
  13. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/TestEx.py +0 -0
  14. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/TestOrder.py +0 -0
  15. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/Binance/test_binance.py +0 -0
  16. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  17. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  18. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/Gate/test_gate.py +0 -0
  19. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  20. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  21. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  22. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/__init__.py +0 -0
  23. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/tests/_todo_refact/_test_ex.py +0 -0
  24. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/Agent.py +0 -0
  25. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/Asset.py +0 -0
  26. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/Auth.py +0 -0
  27. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/BaseTest.py +0 -0
  28. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/Ex.py +0 -0
  29. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/InAgent.py +0 -0
  30. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/Order.py +0 -0
  31. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Abc/xtype.py +0 -0
  32. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/__init__.py +0 -0
  33. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/binance_async.py +0 -0
  34. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/earn_api.py +0 -0
  35. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/etype/ad.py +0 -0
  36. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/etype/pm.py +0 -0
  37. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/ex.py +0 -0
  38. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/exceptions.py +0 -0
  39. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/sapi.py +0 -0
  40. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Binance/web_c2c.py +0 -0
  41. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/__init__.py +0 -0
  42. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/agent.py +0 -0
  43. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/base.py +0 -0
  44. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/etype/ad.py +0 -0
  45. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/etype/pm.py +0 -0
  46. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/ex.py +0 -0
  47. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/req.mjs +0 -0
  48. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BingX/sign.js +0 -0
  49. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BitGet/__init__.py +0 -0
  50. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BitGet/agent.py +0 -0
  51. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BitGet/etype/ad.py +0 -0
  52. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BitGet/ex.py +0 -0
  53. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/BitPapa/ex.py +0 -0
  54. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/InAgent.py +0 -0
  55. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/etype/ad.py +0 -0
  56. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/etype/cred.py +0 -0
  57. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/etype/order.py +0 -0
  58. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/ex.py +0 -0
  59. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/order.py +0 -0
  60. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/web_earn.py +0 -0
  61. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/web_p2p.py +0 -0
  62. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Bybit/ws.py +0 -0
  63. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Gate/etype/ad.py +0 -0
  64. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Gate/ex.py +0 -0
  65. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Gate/premarket.py +0 -0
  66. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Gmail/__init__.py +0 -0
  67. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/agent.py +0 -0
  68. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/earn.py +0 -0
  69. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/etype/__init__.py +0 -0
  70. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/etype/ad.py +0 -0
  71. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/etype/cred.py +0 -0
  72. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/etype/pm.py +0 -0
  73. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/etype/test.py +0 -0
  74. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Htx/ex.py +0 -0
  75. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/KuCoin/etype/ad.py +0 -0
  76. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/KuCoin/etype/pm.py +0 -0
  77. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/KuCoin/ex.py +0 -0
  78. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/KuCoin/web.py +0 -0
  79. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Mexc/etype/ad.py +0 -0
  80. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Mexc/etype/pm.py +0 -0
  81. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Mexc/ex.py +0 -0
  82. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Okx/etype/ad.py +0 -0
  83. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Okx/etype/pm.py +0 -0
  84. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Okx/ex.py +0 -0
  85. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/.gitignore +0 -0
  86. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Alfa/__init__.py +0 -0
  87. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Alfa/state.json +0 -0
  88. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Ozon/__init__.py +0 -0
  89. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Sber/__init__.py +0 -0
  90. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  91. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Tinkoff/state.json +0 -0
  92. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Volet/__init__.py +0 -0
  93. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  94. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  95. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Volet/api.py +0 -0
  96. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/Pms/Volet/pl.py +0 -0
  97. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/agent.py +0 -0
  98. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/asset.py +0 -0
  99. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/auth.py +0 -0
  100. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/ex.py +0 -0
  101. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/inAgent.py +0 -0
  102. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/order.py +0 -0
  103. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/pyd.py +0 -0
  104. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/pyro.py +0 -0
  105. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/TgWallet/web.py +0 -0
  106. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/__init__.py +0 -0
  107. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/loader.py +0 -0
  108. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client/pm_unifier.py +0 -0
  109. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client.egg-info/SOURCES.txt +0 -0
  110. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client.egg-info/dependency_links.txt +0 -0
  111. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/xync_client.egg-info/requires.txt +0 -0
  112. {xync_client-0.0.57.dev11 → xync_client-0.0.57.dev12}/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.dev12
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
@@ -383,11 +383,17 @@ class AgentClient(BaseAgentClient): # Bybit client
383
383
  )
384
384
 
385
385
  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
386
+ self,
387
+ page: int = 1,
388
+ begin_time: int = None,
389
+ end_time: int = None,
390
+ status: int = None,
391
+ side: int = None,
392
+ token_id: str = None,
387
393
  ):
388
394
  try:
389
395
  lst = self.api.get_orders(
390
- page=1,
396
+ page=page,
391
397
  size=30,
392
398
  # status=status, # 50 - завершено
393
399
  # tokenId=token_id,
@@ -397,7 +403,7 @@ class AgentClient(BaseAgentClient): # Bybit client
397
403
  )
398
404
  except FailedRequestError as e:
399
405
  if e.status_code == 10000:
400
- await sleep(1, await self.get_api_orders(begin_time, end_time, status, side, token_id))
406
+ await sleep(1, await self.get_api_orders(page, begin_time, end_time, status, side, token_id))
401
407
  ords = {int(o["id"]): OrderItem.model_validate(o) for o in lst["result"]["items"]}
402
408
  for oid, o in ords.items():
403
409
  fo = self.api.get_order_details(orderId=oid)
@@ -407,21 +413,26 @@ class AgentClient(BaseAgentClient): # Bybit client
407
413
  im_maker = order.makerUserId == o.userId
408
414
  taker_id = (o.userId, o.targetUserId)[int(im_maker)]
409
415
  taker_nick = (self.actor.name, o.targetNickName)[int(im_maker)]
410
- ad_db, cond_isnew = await self.cond_upsert(ad, maker_name[ad.side])
416
+ ad_db, cond_isnew = await self.cond_upsert(ad, maker_name[ad.side], force=True)
411
417
  if not ad_db:
412
418
  ...
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,
423
- )
424
- credex = await models.CredEx.create(exid=cred.id, ex=self.ex_client.ex, cred=crd)
419
+ if (cred := order.confirmedPayTerm).paymentType:
420
+ if not (credex := await models.CredEx.get_or_none(exid=cred.id, ex=self.ex_client.ex)):
421
+ pmcur = await Pmcur.get(pm__pmexs__exid=cred.paymentType, cur__ticker=ad.currencyId)
422
+ if not (
423
+ crd := await models.Cred.get_or_none(
424
+ pmcur=pmcur, person=ad_db.maker.person, detail=cred.accountNo
425
+ )
426
+ ):
427
+ extr = cred.bankName or cred.branchName or cred.qrcode or cred.payMessage or cred.paymentExt1
428
+ crd = await models.Cred.create(
429
+ detail=cred.accountNo,
430
+ pmcur=pmcur,
431
+ person=ad_db.maker.person,
432
+ name=cred.realName,
433
+ extra=extr,
434
+ )
435
+ credex = await models.CredEx.create(exid=cred.id, ex=self.ex_client.ex, cred=crd)
425
436
  taker_person, _ = await Person.get_or_create(name=maker_name[::-1][ad.side])
426
437
  taker, _ = await Actor.get_or_create(
427
438
  {"name": taker_nick}, person=taker_person, ex=self.ex_client.ex, exid=taker_id
@@ -431,9 +442,10 @@ class AgentClient(BaseAgentClient): # Bybit client
431
442
  "amount": o.amount,
432
443
  "status": OrderStatus[Statuses(o.status).name],
433
444
  "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,
445
+ "payed_at": order.transferDate != "0" and int(order.transferDate[:-3]),
446
+ "confirmed_at": Statuses(o.status) == Statuses.completed and int(order.updateDate[:-3]),
447
+ "appealed_at": o.status == 30 and int(order.updateDate[:-3]),
448
+ "cred_id": cred.paymentType and credex.cred_id or None,
437
449
  "taker": taker,
438
450
  },
439
451
  exid=o.id,
@@ -454,7 +466,9 @@ class AgentClient(BaseAgentClient): # Bybit client
454
466
  for m in msgs
455
467
  ]
456
468
  _ = await models.Msg.bulk_create(msgs_db, ignore_conflicts=True)
457
- ...
469
+ logging.info(f"orders page#{page} imported ok!")
470
+ if len(ords) == 30:
471
+ await self.get_api_orders(page + 1, begin_time, end_time, status, side, token_id)
458
472
 
459
473
  async def mad_upd(self, mad: Ad, attrs: dict, cxids: list[str]):
460
474
  if not [setattr(mad, k, v) for k, v in attrs.items() if getattr(mad, k) != v]:
@@ -616,10 +630,6 @@ class AgentClient(BaseAgentClient): # Bybit client
616
630
  pairex__pair__cur_id=curex.cur_id,
617
631
  sell=is_sell,
618
632
  )
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
633
  while self.actor.person.user.status > 0: # todo: depends on rest asset/fiat
624
634
  ads: list[Ad] = await self.ads(coinex, curex, is_sell, pms and list(creds.keys()))
625
635
 
@@ -656,10 +666,14 @@ class AgentClient(BaseAgentClient): # Bybit client
656
666
  logging.warning("Connection failed. Restarting..")
657
667
  await sleep(6)
658
668
 
659
- async def cond_upsert(self, ad: Ad, rname: str = None, dr: Direction = None) -> tuple[models.Ad, bool]:
660
- sim = None
669
+ async def cond_upsert(
670
+ self, ad: Ad, rname: str = None, dr: Direction = None, force: bool = False
671
+ ) -> tuple[models.Ad, bool]:
672
+ sim, cid = None, None
661
673
  # если точно такое условие уже есть в бд, ниче делать не надо
662
- if not (cleaned := clean(ad.remark)) or cleaned in {oc[0] for oc in self.all_conds.values()}:
674
+ if not (cleaned := clean(ad.remark)) or (cid := {oc[0]: ci for ci, oc in self.all_conds.items()}.get(cleaned)):
675
+ if force:
676
+ return await models.Ad.get_or_none(exid=ad.id) or await self.ad_create(ad, cid, rname, dr), False
663
677
  return None, False
664
678
  # если эта объява уже есть в бд
665
679
  if ad_db := await models.Ad.get_or_none(exid=ad.id).prefetch_related("cond__ads__maker", "maker__person"):
@@ -676,7 +690,9 @@ class AgentClient(BaseAgentClient): # Bybit client
676
690
  return ad_db, True
677
691
  # проверка на всякий что точно нет такого условия
678
692
  if new_cond := await Cond.get_or_none(raw_txt=cleaned):
679
- logging.exception("!!!!!!!!!", rest_uids)
693
+ logging.warning(f"Условие {new_cond.id} появилось в бд из других потоков")
694
+ if rest_ads and rest_uids:
695
+ logging.exception("И оно есть объявах других юезров", rest_ads, rest_uids)
680
696
  # если других объяв со старым условием этой обявы нет, либо они все этого же юзера
681
697
  # обновляем условие (в тч во всех ЕГО объявах)
682
698
  ad_db.cond.last_ver = ad_db.cond.raw_txt
@@ -707,18 +723,28 @@ class AgentClient(BaseAgentClient): # Bybit client
707
723
 
708
724
  new_cond = await Cond.create(raw_txt=cleaned)
709
725
  self.all_conds[new_cond.id] = new_cond.raw_txt, {ad.userId}
726
+ ad_db = await self.ad_create(ad, new_cond.id)
727
+
728
+ # если нашелся похожий текст у другого юзера, добавим связь с % похожести
729
+ if sim:
730
+ await self.sim_new(new_cond.id, sim, old_cid)
731
+
732
+ await ad_db.fetch_related("cond", "maker__person")
733
+ return ad_db, True
734
+
735
+ async def ad_create(self, ad: Ad, cid: int, rname: str = None, dr: Direction = None) -> models.Ad:
710
736
  act_df = {}
711
737
  if int(ad.userId) != self.actor.exid:
712
738
  act_df |= {"name": ad.nickName}
713
739
  if rname:
714
740
  act_df |= {"person": (await Person.get_or_create(name=rname))[0]}
715
741
  actor, _ = await Actor.update_or_create(act_df, exid=ad.userId, ex=self.ex_client.ex)
716
- ad_db = await models.Ad.create(
742
+ return await models.Ad.create(
717
743
  price=ad.price,
718
744
  amount=float(ad.quantity) * float(ad.price),
719
745
  min_fiat=ad.minAmount,
720
746
  max_fiat=ad.maxAmount,
721
- cond=new_cond,
747
+ cond_id=cid,
722
748
  exid=int(ad.id),
723
749
  direction=dr
724
750
  or await Direction.get(
@@ -730,13 +756,6 @@ class AgentClient(BaseAgentClient): # Bybit client
730
756
  maker=actor,
731
757
  )
732
758
 
733
- # если нашелся похожий текст у другого юзера, добавим связь с % похожести
734
- if sim:
735
- await self.sim_new(new_cond.id, sim, old_cid)
736
-
737
- await ad_db.fetch_related("cond", "maker__person")
738
- return ad_db, True
739
-
740
759
  async def sim_new(self, new_cid: int, sim: int, old_cid: int):
741
760
  if not sim:
742
761
  return None
@@ -749,80 +768,6 @@ class AgentClient(BaseAgentClient): # Bybit client
749
768
  sim_db.similarity = get_sim(new_txt, op_cond.raw_txt)
750
769
  await sim_db.save()
751
770
 
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
771
  async def actual_cond(self):
827
772
  self.all_conds = {
828
773
  c.id: (c.raw_txt, {str(a.maker.exid) for a in c.ads})
@@ -917,8 +862,12 @@ async def main():
917
862
  # await models.Direction.get(
918
863
  # pairex__ex=cl.actor.ex, pairex__pair__coin__ticker="USDT", pairex__pair__cur__ticker="RUB", sell=True
919
864
  # )
865
+ cl.all_conds = {
866
+ c.id: (c.raw_txt, {str(a.maker.exid) for a in c.ads})
867
+ for c in await Cond.all().prefetch_related("ads__maker")
868
+ }
920
869
  # await cl.set_creds()
921
- await cl.get_api_orders()
870
+ await cl.get_api_orders(2)
922
871
  # await cl.actual_cond()
923
872
  await gather(
924
873
  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.dev12
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