xync-client 0.0.57.dev12__tar.gz → 0.0.57.dev14__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.dev12/xync_client.egg-info → xync_client-0.0.57.dev14}/PKG-INFO +1 -1
  2. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/agent.py +102 -63
  3. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/etype/cred.py +6 -6
  4. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/etype/order.py +5 -3
  5. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14/xync_client.egg-info}/PKG-INFO +1 -1
  6. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/.env.sample +0 -0
  7. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/.gitignore +0 -0
  8. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/.pre-commit-config.yaml +0 -0
  9. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/README.md +0 -0
  10. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/makefile +0 -0
  11. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/pyproject.toml +0 -0
  12. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/setup.cfg +0 -0
  13. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/TestAgent.py +0 -0
  14. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/TestAsset.py +0 -0
  15. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/TestEx.py +0 -0
  16. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/TestOrder.py +0 -0
  17. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/Binance/test_binance.py +0 -0
  18. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  19. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  20. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/Gate/test_gate.py +0 -0
  21. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/Htx/test_htx_p2p.py +0 -0
  22. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  23. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  24. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/__init__.py +0 -0
  25. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/tests/_todo_refact/_test_ex.py +0 -0
  26. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/Agent.py +0 -0
  27. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/Asset.py +0 -0
  28. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/Auth.py +0 -0
  29. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/BaseTest.py +0 -0
  30. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/Ex.py +0 -0
  31. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/InAgent.py +0 -0
  32. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/Order.py +0 -0
  33. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Abc/xtype.py +0 -0
  34. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/__init__.py +0 -0
  35. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/binance_async.py +0 -0
  36. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/earn_api.py +0 -0
  37. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/etype/ad.py +0 -0
  38. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/etype/pm.py +0 -0
  39. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/ex.py +0 -0
  40. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/exceptions.py +0 -0
  41. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/sapi.py +0 -0
  42. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Binance/web_c2c.py +0 -0
  43. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/__init__.py +0 -0
  44. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/agent.py +0 -0
  45. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/base.py +0 -0
  46. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/etype/ad.py +0 -0
  47. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/etype/pm.py +0 -0
  48. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/ex.py +0 -0
  49. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/req.mjs +0 -0
  50. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BingX/sign.js +0 -0
  51. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BitGet/__init__.py +0 -0
  52. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BitGet/agent.py +0 -0
  53. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BitGet/etype/ad.py +0 -0
  54. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BitGet/ex.py +0 -0
  55. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/BitPapa/ex.py +0 -0
  56. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/InAgent.py +0 -0
  57. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/etype/ad.py +0 -0
  58. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/ex.py +0 -0
  59. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/order.py +0 -0
  60. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/web_earn.py +0 -0
  61. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/web_p2p.py +0 -0
  62. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Bybit/ws.py +0 -0
  63. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Gate/etype/ad.py +0 -0
  64. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Gate/ex.py +0 -0
  65. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Gate/premarket.py +0 -0
  66. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Gmail/__init__.py +0 -0
  67. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/agent.py +0 -0
  68. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/earn.py +0 -0
  69. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/etype/__init__.py +0 -0
  70. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/etype/ad.py +0 -0
  71. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/etype/cred.py +0 -0
  72. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/etype/pm.py +0 -0
  73. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/etype/test.py +0 -0
  74. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Htx/ex.py +0 -0
  75. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/KuCoin/etype/ad.py +0 -0
  76. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/KuCoin/etype/pm.py +0 -0
  77. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/KuCoin/ex.py +0 -0
  78. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/KuCoin/web.py +0 -0
  79. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Mexc/etype/ad.py +0 -0
  80. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Mexc/etype/pm.py +0 -0
  81. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Mexc/ex.py +0 -0
  82. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Okx/etype/ad.py +0 -0
  83. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Okx/etype/pm.py +0 -0
  84. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Okx/ex.py +0 -0
  85. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/.gitignore +0 -0
  86. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Alfa/__init__.py +0 -0
  87. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Alfa/state.json +0 -0
  88. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Ozon/__init__.py +0 -0
  89. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Sber/__init__.py +0 -0
  90. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  91. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Tinkoff/state.json +0 -0
  92. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Volet/__init__.py +0 -0
  93. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  94. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  95. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Volet/api.py +0 -0
  96. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/Pms/Volet/pl.py +0 -0
  97. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/agent.py +0 -0
  98. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/asset.py +0 -0
  99. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/auth.py +0 -0
  100. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/ex.py +0 -0
  101. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/inAgent.py +0 -0
  102. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/order.py +0 -0
  103. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/pyd.py +0 -0
  104. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/pyro.py +0 -0
  105. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/TgWallet/web.py +0 -0
  106. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/__init__.py +0 -0
  107. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/loader.py +0 -0
  108. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client/pm_unifier.py +0 -0
  109. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client.egg-info/SOURCES.txt +0 -0
  110. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client.egg-info/dependency_links.txt +0 -0
  111. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/xync_client.egg-info/requires.txt +0 -0
  112. {xync_client-0.0.57.dev12 → xync_client-0.0.57.dev14}/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.dev12
3
+ Version: 0.0.57.dev14
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, MultipleObjectsReturned
15
16
  from tortoise.expressions import F, Q
16
17
  from urllib3.exceptions import ReadTimeoutError
17
18
  from x_model import init_db
@@ -121,41 +122,42 @@ class AgentClient(BaseAgentClient): # Bybit client
121
122
  return data
122
123
  return [CredEpyd.model_validate(credex) for credex in data["result"]]
123
124
 
124
- async def cred_epyd2db(self, cred: CredEpyd) -> models.CredEx:
125
- if cred.paymentType not in (416,):
126
- if not (
127
- pmex := await models.Pmex.get_or_none(exid=cred.paymentType, ex=self.ex_client.ex).prefetch_related(
128
- "pm__curs"
129
- )
130
- ):
131
- raise HTTPException(f"No Pmex {cred.paymentType} on ex#{self.ex_client.ex.name}", 404)
132
- if cred_old := await models.Cred.get_or_none(
133
- credexs__exid=cred.id, credexs__ex=self.actor.ex
134
- ).prefetch_related("pmcur"):
135
- cur_id = cred_old.pmcur.cur_id
136
- else: # is new Cred
137
- cur_id = (
138
- pmex.pm.df_cur_id
139
- or (pmex.pm.country_id and await pmex.pm.country.cur_id)
140
- or (cred.currencyBalance and await models.Cur.get_or_none(ticker=cred.currencyBalance[0]))
141
- or (0 < len(pmex.pm.curs) < 20 and pmex.pm.curs[-1].id)
142
- )
143
- if not cur_id:
144
- raise Exception(f"Set default cur for {pmex.name}")
145
- if not (pmcur := await models.Pmcur.get_or_none(cur_id=cur_id, pm_id=pmex.pm_id)):
146
- raise HTTPException(f"No Pmcur with cur#{cred.currencyBalance} and pm#{cred.paymentType}", 404)
147
- dct = {
148
- "pmcur_id": pmcur.id,
149
- "name": cred.paymentConfigVo.paymentName,
150
- "person_id": self.actor.person_id,
151
- "detail": cred.accountNo,
152
- "extra": cred.branchName or cred.bankName,
153
- } # todo: WTD with multicur pms?
154
- cred_in = models.Cred.validate(dct, False)
155
- cred_db, _ = await models.Cred.update_or_create(**cred_in.df_unq())
156
- credex_in = models.CredEx.validate({"exid": cred.id, "cred_id": cred_db.id, "ex_id": self.actor.ex.id})
157
- credex_db, _ = await models.CredEx.update_or_create(**credex_in.df_unq())
158
- return credex_db
125
+ async def cred_epyd2db(self, ecdx: CredEpyd, pers_id: int = None, cur_id: int = None) -> models.CredEx | None:
126
+ if ecdx.paymentType in (416,):
127
+ return None
128
+ if not (
129
+ pmex := await models.Pmex.get_or_none(exid=ecdx.paymentType, ex=self.ex_client.ex).prefetch_related(
130
+ "pm__curs"
131
+ )
132
+ ):
133
+ raise HTTPException(f"No Pmex {ecdx.paymentType} on ex#{self.ex_client.ex.name}", 404)
134
+ if cred_old := await models.Cred.get_or_none(credexs__exid=ecdx.id, credexs__ex=self.actor.ex).prefetch_related(
135
+ "pmcur"
136
+ ):
137
+ cur_id = cred_old.pmcur.cur_id
138
+ elif not cur_id: # is new Cred
139
+ cur_id = (
140
+ pmex.pm.df_cur_id
141
+ or (pmex.pm.country_id and await pmex.pm.country.cur_id)
142
+ or (ecdx.currencyBalance and await models.Cur.get_or_none(ticker=ecdx.currencyBalance[0]))
143
+ or (0 < len(pmex.pm.curs) < 20 and pmex.pm.curs[-1].id)
144
+ )
145
+ if not cur_id:
146
+ raise Exception(f"Set default cur for {pmex.name}")
147
+ if not (pmcur := await models.Pmcur.get_or_none(cur_id=cur_id, pm_id=pmex.pm_id)):
148
+ raise HTTPException(f"No Pmcur with cur#{ecdx.currencyBalance} and pm#{ecdx.paymentType}", 404)
149
+ dct = {
150
+ "pmcur_id": pmcur.id,
151
+ "name": ecdx.paymentConfigVo.paymentName,
152
+ "person_id": pers_id or self.actor.person_id,
153
+ "detail": ecdx.accountNo,
154
+ "extra": ecdx.branchName or ecdx.bankName or ecdx.qrcode or ecdx.payMessage or ecdx.paymentExt1,
155
+ } # todo: WTD with multicur pms?
156
+ cred_in = models.Cred.validate(dct, False)
157
+ cred_db, _ = await models.Cred.update_or_create(**cred_in.df_unq())
158
+ credex_in = models.CredEx.validate({"exid": ecdx.id, "cred_id": cred_db.id, "ex_id": self.actor.ex.id})
159
+ credex_db, _ = await models.CredEx.update_or_create(**credex_in.df_unq())
160
+ return credex_db
159
161
 
160
162
  # 25: Список реквизитов моих платежных методов
161
163
  async def set_creds(self) -> list[models.CredEx]:
@@ -408,35 +410,60 @@ class AgentClient(BaseAgentClient): # Bybit client
408
410
  for oid, o in ords.items():
409
411
  fo = self.api.get_order_details(orderId=oid)
410
412
  order = OrderFull.model_validate(fo["result"])
413
+ await sleep(0.5)
411
414
  ad = Ad(**self.api.get_ad_details(itemId=order.itemId)["result"])
412
- maker_name = o.buyerRealName, o.sellerRealName # ad.side
415
+ maker_name = o.buyerRealName, o.sellerRealName
416
+ seller_person, _ = await Person.get_or_create(name=o.sellerRealName)
413
417
  im_maker = order.makerUserId == o.userId
414
418
  taker_id = (o.userId, o.targetUserId)[int(im_maker)]
415
419
  taker_nick = (self.actor.name, o.targetNickName)[int(im_maker)]
416
420
  ad_db, cond_isnew = await self.cond_upsert(ad, maker_name[ad.side], force=True)
417
421
  if not ad_db:
418
422
  ...
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)
423
+ ecredex: CredEpyd = order.confirmedPayTerm
424
+ if ecredex.paymentType:
425
+ if not (credex := await models.CredEx.get_or_none(exid=ecredex.id, ex=self.ex_client.ex)):
426
+ # cur_id = await Cur.get(ticker=ad.currencyId).values_list('id', flat=True)
427
+ # await self.cred_epyd2db(ecredex, ad_db.maker.person_id, cur_id)
428
+ if (
429
+ await Pmcur.filter(
430
+ pm__pmexs__ex=self.ex_client.ex,
431
+ pm__pmexs__exid=ecredex.paymentType,
432
+ cur__ticker=ad.currencyId,
433
+ ).count()
434
+ != 1
435
+ ):
436
+ ...
437
+ pmcur = await Pmcur.get(
438
+ pm__pmexs__ex=self.ex_client.ex, pm__pmexs__exid=ecredex.paymentType, cur__ticker=ad.currencyId
439
+ )
422
440
  if not (
423
441
  crd := await models.Cred.get_or_none(
424
- pmcur=pmcur, person=ad_db.maker.person, detail=cred.accountNo
442
+ pmcur=pmcur, person=seller_person, detail=ecredex.accountNo
425
443
  )
426
444
  ):
427
- extr = cred.bankName or cred.branchName or cred.qrcode or cred.payMessage or cred.paymentExt1
445
+ extr = (
446
+ ecredex.bankName
447
+ or ecredex.branchName
448
+ or ecredex.qrcode
449
+ or ecredex.payMessage
450
+ or ecredex.paymentExt1
451
+ )
428
452
  crd = await models.Cred.create(
429
- detail=cred.accountNo,
453
+ detail=ecredex.accountNo,
430
454
  pmcur=pmcur,
431
455
  person=ad_db.maker.person,
432
- name=cred.realName,
456
+ name=ecredex.realName,
433
457
  extra=extr,
434
458
  )
435
- credex = await models.CredEx.create(exid=cred.id, ex=self.ex_client.ex, cred=crd)
459
+ credex = await models.CredEx.create(exid=ecredex.id, ex=self.ex_client.ex, cred=crd)
436
460
  taker_person, _ = await Person.get_or_create(name=maker_name[::-1][ad.side])
437
- taker, _ = await Actor.get_or_create(
438
- {"name": taker_nick}, person=taker_person, ex=self.ex_client.ex, exid=taker_id
439
- )
461
+ try:
462
+ taker, _ = await Actor.get_or_create(
463
+ {"name": taker_nick, "person": taker_person}, ex=self.ex_client.ex, exid=taker_id
464
+ )
465
+ except IntegrityError as e:
466
+ logging.error(e)
440
467
  order_db, _ = await models.Order.update_or_create(
441
468
  {
442
469
  "amount": o.amount,
@@ -445,7 +472,7 @@ class AgentClient(BaseAgentClient): # Bybit client
445
472
  "payed_at": order.transferDate != "0" and int(order.transferDate[:-3]),
446
473
  "confirmed_at": Statuses(o.status) == Statuses.completed and int(order.updateDate[:-3]),
447
474
  "appealed_at": o.status == 30 and int(order.updateDate[:-3]),
448
- "cred_id": cred.paymentType and credex.cred_id or None,
475
+ "cred_id": ecredex.paymentType and credex.cred_id or None,
449
476
  "taker": taker,
450
477
  },
451
478
  exid=o.id,
@@ -523,7 +550,7 @@ class AgentClient(BaseAgentClient): # Bybit client
523
550
  ):
524
551
  k = (-1) ** int(is_sell) # on_buy=1, on_sell=-1
525
552
 
526
- creds: dict[models.Pmex, models.CredEx] = await get_creds(pms, self.actor.ex)
553
+ creds: dict[models.Pmex, models.CredEx] = await self.get_credexs_by_norms(pms, curex.cur_id)
527
554
  if not volume:
528
555
  if is_sell: # гонка в стакане продажи - мы покупаем монету за ФИАТ
529
556
  # todo: we using the only one fiat exactly from THE FIRST cred
@@ -612,7 +639,7 @@ class AgentClient(BaseAgentClient): # Bybit client
612
639
  k = (-1) ** int(is_sell) # on_buy=1, on_sell=-1
613
640
 
614
641
  if pms:
615
- creds: dict[models.Pmex, models.CredEx] = await get_creds(pms, self.actor.ex)
642
+ creds: dict[models.Pmex, models.CredEx] = await self.get_credexs_by_norms(pms, curex.cur_id)
616
643
  [str(p.exid) for p in creds.values()]
617
644
 
618
645
  if is_sell: # гонка в стакане продажи - мы покупаем монету за ФИАТ
@@ -673,7 +700,11 @@ class AgentClient(BaseAgentClient): # Bybit client
673
700
  # если точно такое условие уже есть в бд, ниче делать не надо
674
701
  if not (cleaned := clean(ad.remark)) or (cid := {oc[0]: ci for ci, oc in self.all_conds.items()}.get(cleaned)):
675
702
  if force:
676
- return await models.Ad.get_or_none(exid=ad.id) or await self.ad_create(ad, cid, rname, dr), False
703
+ return (
704
+ await models.Ad.get_or_none(exid=ad.id).prefetch_related("maker__person")
705
+ or await self.ad_create(ad, cid, rname, dr),
706
+ False,
707
+ )
677
708
  return None, False
678
709
  # если эта объява уже есть в бд
679
710
  if ad_db := await models.Ad.get_or_none(exid=ad.id).prefetch_related("cond__ads__maker", "maker__person"):
@@ -723,14 +754,11 @@ class AgentClient(BaseAgentClient): # Bybit client
723
754
 
724
755
  new_cond = await Cond.create(raw_txt=cleaned)
725
756
  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
757
  # если нашелся похожий текст у другого юзера, добавим связь с % похожести
729
758
  if sim:
730
759
  await self.sim_new(new_cond.id, sim, old_cid)
731
760
 
732
- await ad_db.fetch_related("cond", "maker__person")
733
- return ad_db, True
761
+ return await self.ad_create(ad, new_cond.id), True
734
762
 
735
763
  async def ad_create(self, ad: Ad, cid: int, rname: str = None, dr: Direction = None) -> models.Ad:
736
764
  act_df = {}
@@ -739,7 +767,7 @@ class AgentClient(BaseAgentClient): # Bybit client
739
767
  if rname:
740
768
  act_df |= {"person": (await Person.get_or_create(name=rname))[0]}
741
769
  actor, _ = await Actor.update_or_create(act_df, exid=ad.userId, ex=self.ex_client.ex)
742
- return await models.Ad.create(
770
+ ad_db = await models.Ad.create(
743
771
  price=ad.price,
744
772
  amount=float(ad.quantity) * float(ad.price),
745
773
  min_fiat=ad.minAmount,
@@ -755,6 +783,8 @@ class AgentClient(BaseAgentClient): # Bybit client
755
783
  ),
756
784
  maker=actor,
757
785
  )
786
+ await ad_db.fetch_related("cond", "maker__person")
787
+ return ad_db
758
788
 
759
789
  async def sim_new(self, new_cid: int, sim: int, old_cid: int):
760
790
  if not sim:
@@ -786,6 +816,20 @@ class AgentClient(BaseAgentClient): # Bybit client
786
816
  ad = Ad(id=str(ad_db.exid), userId=str(ad_db.maker.exid), remark=ad_db.cond.raw_txt)
787
817
  await self.cond_upsert(ad, dr=dr, cid=ad_db.cond_id)
788
818
 
819
+ async def get_credexs_by_norms(self, norms: list[str], cur_id: int) -> dict[models.Pmex, models.CredEx] | None:
820
+ try:
821
+ return {
822
+ await models.Pmex.get(pm__norm=n, ex=self.ex_client.ex): await models.CredEx.get(
823
+ ex=self.ex_client.ex,
824
+ cred__pmcur__pm__norm=n,
825
+ cred__person_id=self.actor.person_id,
826
+ cred__pmcur__cur_id=cur_id,
827
+ )
828
+ for n in norms
829
+ }
830
+ except MultipleObjectsReturned as e:
831
+ logging.exception(e)
832
+
789
833
 
790
834
  def get_sim(s1, s2) -> int:
791
835
  sim = int((SequenceMatcher(None, s1, s2).ratio() - 0.9) * 10_000)
@@ -830,18 +874,13 @@ def listen(data: dict):
830
874
  print(data)
831
875
 
832
876
 
833
- async def get_creds(norms: list[str], ex: models.Ex) -> dict[models.Pmex, models.CredEx]:
834
- return {
835
- await models.Pmex.get(ex=ex, pm__norm=n): await models.CredEx.get(ex=ex, cred__pmcur__pm__norm=n) for n in norms
836
- }
837
-
838
-
839
877
  class ExcCode(IntEnum):
840
878
  FixPriceLimit = 912120022
841
879
  RareLimit = 912120050
842
880
  InsufficientAmount = 912120024
843
881
  Timestamp = 10002
844
882
  IP = 10010
883
+ Quantity = 912300019
845
884
 
846
885
 
847
886
  async def main():
@@ -867,7 +906,6 @@ async def main():
867
906
  for c in await Cond.all().prefetch_related("ads__maker")
868
907
  }
869
908
  # await cl.set_creds()
870
- await cl.get_api_orders(2)
871
909
  # await cl.actual_cond()
872
910
  await gather(
873
911
  cl.battle(usdt, rub, False, ["volet"], 79.97), # гонка в стакане покупки - мы продаем
@@ -880,6 +918,7 @@ async def main():
880
918
  cl.battle(usdc, rub, True, ["volet"], 79),
881
919
  cl.take(usdt, rub, False, ceil=80.5, volume=360),
882
920
  cl.take(usdt, rub, True, ceil=80.5, volume=360),
921
+ cl.get_api_orders(1),
883
922
  )
884
923
 
885
924
  bor = BaseOrderReq(
@@ -45,7 +45,6 @@ class CredEpyd(CredExOut):
45
45
  businessName: str
46
46
  concept: str
47
47
  online: str
48
- countNo: str
49
48
  paymentExt1: str
50
49
  paymentExt2: str
51
50
  paymentExt3: str
@@ -53,8 +52,9 @@ class CredEpyd(CredExOut):
53
52
  paymentExt5: str
54
53
  paymentExt6: str
55
54
  paymentTemplateVersion: int
56
- hasPaymentTemplateChanged: bool
57
- paymentConfigVo: PaymentConfigVo
58
- realNameVerified: bool
59
- channel: str
60
- currencyBalance: list[str]
55
+ countNo: str = None # only for my cred
56
+ hasPaymentTemplateChanged: bool = None # only for my cred
57
+ paymentConfigVo: PaymentConfigVo # only for my cred
58
+ realNameVerified: bool = None # only for my cred
59
+ channel: str = None # only for my cred
60
+ currencyBalance: list[str] = None # only for my cred
@@ -4,6 +4,8 @@ from typing import Literal
4
4
 
5
5
  from pydantic import BaseModel
6
6
 
7
+ from xync_client.Bybit.etype.cred import CredEpyd
8
+
7
9
 
8
10
  class Statuses(IntEnum):
9
11
  deleted = 40 # order canceled
@@ -183,7 +185,7 @@ class OrderFull(OrderItem):
183
185
  payCode: str
184
186
  paymentType: int
185
187
  transferDate: str
186
- paymentTermList: list[PaymentTerm]
188
+ paymentTermList: list[CredEpyd]
187
189
  remark: str
188
190
  recentOrderNum: int
189
191
  recentExecuteRate: int
@@ -192,8 +194,8 @@ class OrderFull(OrderItem):
192
194
  appealNickName: str
193
195
  canAppeal: str
194
196
  totalAppealTimes: str
195
- paymentTermResult: PaymentTerm
196
- confirmedPayTerm: PaymentTerm
197
+ paymentTermResult: CredEpyd
198
+ confirmedPayTerm: CredEpyd
197
199
  appealedTimes: str
198
200
  orderFinishMinute: int
199
201
  makerFee: str
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.57.dev12
3
+ Version: 0.0.57.dev14
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