xync-client 0.0.93.dev24__tar.gz → 0.0.93.dev26__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 (123) hide show
  1. {xync_client-0.0.93.dev24/xync_client.egg-info → xync_client-0.0.93.dev26}/PKG-INFO +1 -1
  2. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/TestEx.py +4 -4
  3. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/PmAgent.py +2 -3
  4. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/InAgent.py +74 -19
  5. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/agent.py +1 -1
  6. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/etype/ad.py +49 -0
  7. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Payeer/__init__.py +1 -1
  8. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26/xync_client.egg-info}/PKG-INFO +1 -1
  9. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/.env.sample +0 -0
  10. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/.gitignore +0 -0
  11. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/.pre-commit-config.yaml +0 -0
  12. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/README.md +0 -0
  13. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/__init__.py +0 -0
  14. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/index.html +0 -0
  15. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/makefile +0 -0
  16. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/pyproject.toml +0 -0
  17. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/setup.cfg +0 -0
  18. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/TestAgent.py +0 -0
  19. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/TestAsset.py +0 -0
  20. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/TestOrder.py +0 -0
  21. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/Binance/test_binance.py +0 -0
  22. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  23. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  24. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/Gate/test_gate.py +0 -0
  25. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  26. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  27. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/__init__.py +0 -0
  28. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/tests/_todo_refact/_test_ex.py +0 -0
  29. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/Agent.py +0 -0
  30. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/Asset.py +0 -0
  31. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/Auth.py +0 -0
  32. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/BaseTest.py +0 -0
  33. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/Ex.py +0 -0
  34. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/Exception.py +0 -0
  35. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/InAgent.py +0 -0
  36. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/Order.py +0 -0
  37. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Abc/xtype.py +0 -0
  38. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/__init__.py +0 -0
  39. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/binance_async.py +0 -0
  40. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/earn_api.py +0 -0
  41. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/etype/ad.py +0 -0
  42. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/etype/pm.py +0 -0
  43. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/ex.py +0 -0
  44. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/exceptions.py +0 -0
  45. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/sapi.py +0 -0
  46. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Binance/web_c2c.py +0 -0
  47. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/__init__.py +0 -0
  48. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/agent.py +0 -0
  49. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/base.py +0 -0
  50. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/etype/ad.py +0 -0
  51. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/etype/pm.py +0 -0
  52. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/ex.py +0 -0
  53. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/req.mjs +0 -0
  54. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BingX/sign.js +0 -0
  55. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BitGet/__init__.py +0 -0
  56. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BitGet/agent.py +0 -0
  57. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BitGet/etype/ad.py +0 -0
  58. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BitGet/ex.py +0 -0
  59. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/BitPapa/ex.py +0 -0
  60. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/etype/cred.py +0 -0
  61. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/etype/order.py +0 -0
  62. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/ex.py +0 -0
  63. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/order.py +0 -0
  64. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/web_earn.py +0 -0
  65. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/web_p2p.py +0 -0
  66. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Bybit/ws.py +0 -0
  67. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Gate/etype/ad.py +0 -0
  68. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Gate/ex.py +0 -0
  69. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Gate/premarket.py +0 -0
  70. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Gmail/__init__.py +0 -0
  71. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/agent.py +0 -0
  72. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/earn.py +0 -0
  73. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/etype/__init__.py +0 -0
  74. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/etype/ad.py +0 -0
  75. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/etype/cred.py +0 -0
  76. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/etype/pm.py +0 -0
  77. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/etype/test.py +0 -0
  78. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Htx/ex.py +0 -0
  79. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/KuCoin/etype/ad.py +0 -0
  80. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/KuCoin/etype/pm.py +0 -0
  81. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/KuCoin/ex.py +0 -0
  82. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/KuCoin/web.py +0 -0
  83. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Mexc/etype/ad.py +0 -0
  84. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Mexc/etype/pm.py +0 -0
  85. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Mexc/ex.py +0 -0
  86. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Okx/etype/ad.py +0 -0
  87. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Okx/etype/pm.py +0 -0
  88. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Okx/ex.py +0 -0
  89. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/.gitignore +0 -0
  90. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Alfa/__init__.py +0 -0
  91. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Alfa/state.json +0 -0
  92. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/MTS/__init__.py +0 -0
  93. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Ozon/__init__.py +0 -0
  94. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Payeer/.gitignore +0 -0
  95. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Payeer/api.py +0 -0
  96. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Payeer/login.py +0 -0
  97. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Sber/__init__.py +0 -0
  98. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Sber/utils.py +0 -0
  99. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  100. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Volet/__init__.py +0 -0
  101. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  102. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  103. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Volet/api.py +0 -0
  104. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Volet/pl.py +0 -0
  105. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Xync/__main__.py +0 -0
  106. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Xync/ed.py +0 -0
  107. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/Pms/Yandex/__init__.py +0 -0
  108. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/agent.py +0 -0
  109. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/asset.py +0 -0
  110. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/auth.py +0 -0
  111. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/ex.py +0 -0
  112. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/inAgent.py +0 -0
  113. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/order.py +0 -0
  114. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/pyd.py +0 -0
  115. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/pyro.py +0 -0
  116. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/TgWallet/web.py +0 -0
  117. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/__init__.py +0 -0
  118. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/loader.py +0 -0
  119. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client/pm_unifier.py +0 -0
  120. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client.egg-info/SOURCES.txt +0 -0
  121. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client.egg-info/dependency_links.txt +0 -0
  122. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/xync_client.egg-info/requires.txt +0 -0
  123. {xync_client-0.0.93.dev24 → xync_client-0.0.93.dev26}/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.93.dev24
3
+ Version: 0.0.93.dev26
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
@@ -129,13 +129,13 @@ class TestEx(BaseTest):
129
129
  pmex_exids = await models.Pmex.filter(ex=client.ex, pm_id__in=pm_ids).values_list("exid", flat=True)
130
130
  # получаем объявления по этому направлению
131
131
  ads = await client.ads(coinex.exid, curex.exid, race.road.ad.pair_side.is_sell, pmex_exids)
132
+ # if race.vm_filter:
133
+ # ads = [ad for ad in ads if "VA" in ad.authTag]
134
+ # client.overprice_filter(ads, race.ceil, k) # обрезаем сверху все ads дороже нашего потолка
132
135
  # определяем место нашего объявления в списке
133
136
  places = [i for i, ad in enumerate(ads) if int(ad.userId) == race.road.ad.maker.exid]
134
137
  if not places:
135
138
  errors[race.id] = None
136
139
  elif places[0] != race.target_place:
137
140
  errors[race.id] = places[0]
138
- if errors:
139
- assert False, "Гонка " + ", ".join(f"#{rid} на {plc} месте" for rid, plc in errors.items())
140
- else:
141
- print("Успешно")
141
+ assert not errors, "Гонка " + ", ".join(f"#{rid} на {plc} месте" for rid, plc in errors.items())
@@ -1,5 +1,4 @@
1
1
  from abc import abstractmethod, ABCMeta
2
- from asyncio import get_running_loop
3
2
  from decimal import Decimal
4
3
  from enum import StrEnum
5
4
 
@@ -50,8 +49,8 @@ class PmAgentClient(metaclass=ABCMeta):
50
49
  if not self.page.url.startswith(self.pages.SEND): # Если в итоге не удалось попасть на отправку
51
50
  await self.bot.send(self.norm + " not logged in!", self.uid, photo=await self.page.screenshot())
52
51
  raise LoginFailedException(f"User {self.agent.user_id} has not logged in")
53
- loop = get_running_loop()
54
- loop.create_task(self._idle()) # Бесконечно пасёмся в фоне на странице отправки, что бы куки не протухли
52
+ # loop = get_running_loop()
53
+ # loop.create_task(self._idle()) # Бесконечно пасёмся в фоне на странице отправки, что бы куки не протухли
55
54
  self._is_started = True
56
55
  return self
57
56
 
@@ -1,6 +1,7 @@
1
1
  import json
2
2
  import logging
3
- from datetime import datetime
3
+ import re
4
+ from datetime import datetime, timezone
4
5
 
5
6
  import websockets
6
7
  from asyncio import run
@@ -27,9 +28,6 @@ from xync_client.Abc.InAgent import BaseInAgentClient
27
28
  from xync_client.Bybit.agent import AgentClient
28
29
 
29
30
 
30
- done = set()
31
-
32
-
33
31
  class InAgentClient(BaseInAgentClient):
34
32
  agent_client: AgentClient
35
33
 
@@ -72,7 +70,7 @@ class InAgentClient(BaseInAgentClient):
72
70
  while resp := await websocket.recv():
73
71
  if data := json.loads(resp):
74
72
  upd, order_db = None, None
75
- logging.info(f"{datetime.now()} New update: {data.get('topic')}:{data.get('type')}")
73
+ logging.info(f" {datetime.now().strftime('%H:%M:%S')} upd: {data.get('topic')}:{data.get('type')}")
76
74
  match data.get("topic"):
77
75
  case "OTC_ORDER_STATUS":
78
76
  match data["type"]:
@@ -85,16 +83,32 @@ class InAgentClient(BaseInAgentClient):
85
83
  ) or await self.agent_client.create_order(order)
86
84
  match upd.status:
87
85
  case StatusApi.created:
88
- # order_db = await self.agent_client.create_order(order)
89
86
  logging.info(f"Order {order.id} created at {order.createDate}")
87
+ if upd.side == 1: # я покупатель - ждем мою оплату
88
+ dest = order.paymentTermList[0].accountNo
89
+ if not re.match(r"^P\d{8,10}$", dest):
90
+ continue
91
+ await order_db.fetch_related("cred__pmcur__cur")
92
+ if order_db.status in (OrderStatus.created, OrderStatus.requested):
93
+ await self.send_payment(order_db, dest)
94
+ ...
90
95
  case StatusApi.wait_for_buyer:
91
96
  if upd.side == 0: # ждем когда покупатель оплатит
92
97
  if not (pmacdx := await self.get_pma_by_cdex(order)):
93
98
  continue
94
99
  pma, cdx = pmacdx
95
100
  am, tid = pma.check_in(Decimal(order.amount), cdx.cred.pmcur.cur.ticker)
96
- if tid and tid not in done:
97
- done.add(tid)
101
+ if not tid:
102
+ continue
103
+ t, is_new = await models.Transfer.update_or_create(
104
+ dict(
105
+ amount=int(float(order.amount)) * 100,
106
+ accepted_at=datetime.now(timezone.utc),
107
+ ),
108
+ order=order_db,
109
+ pmid=tid,
110
+ )
111
+ if is_new:
98
112
  self.agent_client.api.release_assets(orderId=upd.id)
99
113
  logging.info(
100
114
  f"Order {order.id} created, paid before #{tid}:{am} at {order.createDate}, and RELEASED at {datetime.now()}"
@@ -104,14 +118,7 @@ class InAgentClient(BaseInAgentClient):
104
118
  f"Order {order.id} created at {order.createDate} but no paid yet"
105
119
  )
106
120
  elif upd.side == 1: # я покупатель - ждем мою оплату
107
- pma = self.pmacs.get(order.paymentTermList[0].paymentType)
108
- int_am = int(Decimal(order.amount))
109
- await pma.send(
110
- dest=order.paymentTermList[0].accountNo,
111
- amount=int_am,
112
- cur=cdx.cred.pmcur.cur.ticker,
113
- )
114
- logging.warning(f"Order {order.id} PAID at {datetime.now()}: {int_am}")
121
+ continue # logging.warning(f"Order {order.id} PAID at {datetime.now()}: {int_am}")
115
122
  else:
116
123
  ...
117
124
  # todo: check is always canceling
@@ -138,6 +145,8 @@ class InAgentClient(BaseInAgentClient):
138
145
  ).save()
139
146
  logging.info(f"Order {order.id} completed at {order_db.confirmed_at}")
140
147
  case StatusApi.wait_for_seller:
148
+ if order_db.status == OrderStatus.paid:
149
+ continue
141
150
  await order_db.update_from_dict(
142
151
  {
143
152
  "status": OrderStatus.paid,
@@ -155,7 +164,26 @@ class InAgentClient(BaseInAgentClient):
155
164
  match data["type"]:
156
165
  case "RECEIVE":
157
166
  upd = Receive.model_validate(data["data"])
158
-
167
+ if order_db := await models.Order.get_or_none(
168
+ exid=upd.orderId, ad__maker__ex=self.agent_client.actor.ex
169
+ ).prefetch_related("ad__pair_side", "cred__pmcur__cur"):
170
+ im_taker = order_db.taker_id == self.agent_client.actor.id
171
+ im_buyer = order_db.ad.pair_side.is_sell == im_taker
172
+ if order_db.ad.auto_msg != upd.message and upd.roleType not in ("sys", "alarm"):
173
+ msg, _ = await models.Msg.update_or_create(
174
+ {
175
+ "sent_at": int(float(upd.createDate) / 1000),
176
+ "to_maker": upd.userId == self.agent_client.actor.exid and im_taker,
177
+ },
178
+ txt=upd.message,
179
+ order=order_db,
180
+ )
181
+ if not upd.message:
182
+ ...
183
+ if im_buyer and re.match(r"^P\d{8,10}$", upd.message):
184
+ if order_db.status in (OrderStatus.created, OrderStatus.requested):
185
+ await self.send_payment(order_db, upd.message)
186
+ ...
159
187
  case "READ":
160
188
  upd = Read.model_validate(data["data"])
161
189
  # if upd.status not in (StatusWs.created, StatusWs.canceled, 10, StatusWs.completed):
@@ -166,7 +194,7 @@ class InAgentClient(BaseInAgentClient):
166
194
  order = OrderFull.model_validate(order)
167
195
 
168
196
  case "CLEAR":
169
- pass
197
+ continue
170
198
  case _:
171
199
  self.listen(data)
172
200
  case "OTC_USER_CHAT_MSG_V2":
@@ -192,6 +220,27 @@ class InAgentClient(BaseInAgentClient):
192
220
  if not upd:
193
221
  logging.warning(data, "NOT PROCESSED UPDATE")
194
222
 
223
+ async def send_payment(self, order_db: models.Order, dest) -> tuple[PmAgentClient, models.CredEx]:
224
+ int_am = int(float(order_db.amount))
225
+ pma, cur = await self.get_pma_by_pmex(order_db)
226
+ tid, img = await pma.send(dest=dest, amount=int_am, cur=cur)
227
+ t, is_new = await models.Transfer.update_or_create(
228
+ {"amount": int_am * 100},
229
+ order=order_db,
230
+ pmid=tid,
231
+ )
232
+ pmex = await models.Pmex.get(pm_id=order_db.cred.pmcur.pm_id, ex=self.agent_client.actor.ex)
233
+ credex = await models.CredEx.get(cred=order_db.cred, ex=self.agent_client.actor.ex)
234
+ self.agent_client.api.mark_as_paid(
235
+ orderId=str(order_db.exid),
236
+ paymentType=pmex.exid, # pmex.exid
237
+ paymentId=str(credex.exid), # credex.exid
238
+ )
239
+ order_db.status = OrderStatus.paid
240
+ order_db.payed_at = datetime.now(timezone.utc)
241
+ await order_db.save()
242
+ logging.warning(f"Order {order_db.exid} PAID at {datetime.now()}: {int_am}")
243
+
195
244
  async def get_pma_by_cdex(self, order: OrderFull) -> tuple[PmAgentClient, models.CredEx]:
196
245
  cdxs = await models.CredEx.filter(
197
246
  ex=self.agent_client.ex_client.ex,
@@ -206,6 +255,12 @@ class InAgentClient(BaseInAgentClient):
206
255
  else:
207
256
  return pmas[0], cdxs[0]
208
257
 
258
+ async def get_pma_by_pmex(self, order_db: models.Order) -> tuple[PmAgentClient, str]:
259
+ pma = self.pmacs.get(order_db.cred.pmcur.pm_id)
260
+ if pma:
261
+ return pma, order_db.cred.pmcur.cur.ticker
262
+ logging.error(f"No pm_agents for {order_db.cred.pmcur.pm_id}")
263
+
209
264
  @staticmethod
210
265
  def listen(data: dict | None):
211
266
  # print(data)
@@ -235,7 +290,7 @@ async def main():
235
290
  # await cl.agent_client.export_my_ads()
236
291
  payeer_cl = Client(actor.person.user.username_id)
237
292
  for pma in actor.person.user.pm_agents:
238
- cl.pmacs[pma.pm_id] = await payeer_cl.start(await async_playwright().start(), False)
293
+ cl.pmacs[pma.pm_id] = await payeer_cl.start(await async_playwright().start(), True)
239
294
 
240
295
  _ = await cl.start_listen()
241
296
  await cl.agent_client.close()
@@ -635,7 +635,7 @@ class AgentClient(BaseAgentClient): # Bybit client
635
635
  # если гонка дольше Х минут не обновлялась, обновляем ее (и ее пары) потолок
636
636
  expiration = datetime.now(timezone.utc) - timedelta(minutes=15)
637
637
  if not race.ceil or race.updated_at < expiration:
638
- ceils, hp, vmf, zplace = await self.get_ceils(coinex, curex, pmexs, 0.0025, True)
638
+ ceils, hp, vmf, zplace = await self.get_ceils(coinex, curex, pmexs, 0.001, True)
639
639
  race.ceil = ceils[int(taker_side)]
640
640
  await race.save()
641
641
  # upd pair race
@@ -126,6 +126,55 @@ class Ad(BaseAd):
126
126
  verificationOrderLabels: List[Any] = None # for initial actualize
127
127
  verificationOrderSwitch: bool = None # for initial actualize
128
128
  version: int = None # for initial actualize
129
+ #
130
+ #
131
+ # class Ad(BaseAd):
132
+ # accountId: str = None # for initial actualize
133
+ # authStatus: int = None # for initial actualize
134
+ # authTag: List[str] = None # for initial actualize
135
+ # ban: bool = None # for initial actualize
136
+ # baned: bool = None # for initial actualize
137
+ # blocked: str = None # for initial actualize
138
+ # createDate: str = None # for initial actualize
139
+ # currencyId: str = None # for initial actualize
140
+ # executedQuantity: str = None # for initial actualize
141
+ # fee: str = None # for initial actualize
142
+ # finishNum: int = None # for initial actualize
143
+ # frozenQuantity: str = None # for initial actualize
144
+ # exid: str = Field(serialization_alias="id")
145
+ # isOnline: bool = None # for initial actualize
146
+ # itemType: str = None # for initial actualize
147
+ # lastLogoutTime: str = None # for initial actualize
148
+ # quantity: str = Field(serialization_alias="lastQuantity")
149
+ # makerContact: bool = None # for initial actualize
150
+ # max_fiat: str = Field(serialization_alias="maxAmount")
151
+ # min_fiat: str = Field(serialization_alias="minAmount")
152
+ # nickName: str = None # for initial actualize
153
+ # orderNum: int = None # for initial actualize
154
+ # paymentPeriod: int = None # for initial actualize
155
+ # payments: List[str] = None # for initial actualize
156
+ # premium: str = None # for initial actualize
157
+ # price: str = None # for initial actualize
158
+ # priceType: Literal[0, 1] = None # for initial actualize # 0 - fix rate, 1 - floating
159
+ # allQuantity: str = Field(serialization_alias="quantity") # for initial actualize
160
+ # recentExecuteRate: int = None # for initial actualize
161
+ # recentOrderNum: int = None # for initial actualize
162
+ # recommend: bool = None # for initial actualize
163
+ # recommendTag: str = None # for initial actualize
164
+ # auto_msg: str = Field(serialization_alias="remark")
165
+ # is_sell: Literal[0, 1] = Field(serialization_alias="side") # for initial actualize # 0 - покупка, 1 - продажа (для мейкера, т.е КАКАЯ объява)
166
+ # status: Literal[10, 20, 30] # 10: online; 20: offline; 30: completed
167
+ # symbolInfo: SymbolInfo = None # for initial actualize
168
+ # tokenId: str = None # for initial actualize
169
+ # tokenName: str = None # for initial actualize
170
+ # tradingPreferenceSet: TradingPreferenceSet | None = None # for initial actualize
171
+ # userId: str = Field(serialization_alias="maker__exid")
172
+ # userMaskId: str = None # for initial actualize
173
+ # userType: str = None # for initial actualize
174
+ # verificationOrderAmount: str = None # for initial actualize
175
+ # verificationOrderLabels: List[Any] = None # for initial actualize
176
+ # verificationOrderSwitch: bool = None # for initial actualize
177
+ # version: int = None # for initial actualize
129
178
 
130
179
  @field_serializer("status")
131
180
  def status(self, status, _info) -> xtype.AdStatus:
@@ -35,7 +35,7 @@ class Client(PmAgentClient):
35
35
  await self.page.context.add_cookies([cookie])
36
36
  await self.page.goto(self.pages.SEND)
37
37
 
38
- async def send(self, dest: str, amount: int, cur: str):
38
+ async def send(self, dest: str, amount: int, cur: str) -> tuple[int, bytes]:
39
39
  page = self.page
40
40
  if not page.url.startswith(self.pages.SEND):
41
41
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.93.dev24
3
+ Version: 0.0.93.dev26
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