xync-client 0.0.80.dev11__tar.gz → 0.0.80.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 (122) hide show
  1. {xync_client-0.0.80.dev11/xync_client.egg-info → xync_client-0.0.80.dev14}/PKG-INFO +1 -1
  2. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/InAgent.py +3 -2
  3. xync_client-0.0.80.dev14/xync_client/Bybit/InAgent.py +111 -0
  4. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/agent.py +17 -20
  5. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/etype/ad.py +6 -0
  6. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/etype/order.py +58 -1
  7. xync_client-0.0.80.dev14/xync_client/Bybit/ws.py +34 -0
  8. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14/xync_client.egg-info}/PKG-INFO +1 -1
  9. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/SOURCES.txt +0 -2
  10. xync_client-0.0.80.dev11/videos/70a566eb-e9da-47d6-b9fa-1569b5eee48e.webm +0 -0
  11. xync_client-0.0.80.dev11/videos/e49ef853-97a0-4882-99de-9c5ce9795471.webm +0 -0
  12. xync_client-0.0.80.dev11/xync_client/Bybit/InAgent.py +0 -44
  13. xync_client-0.0.80.dev11/xync_client/Bybit/ws.py +0 -68
  14. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/.env.sample +0 -0
  15. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/.gitignore +0 -0
  16. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/.pre-commit-config.yaml +0 -0
  17. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/README.md +0 -0
  18. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/__init__.py +0 -0
  19. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/makefile +0 -0
  20. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/pyproject.toml +0 -0
  21. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/setup.cfg +0 -0
  22. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestAgent.py +0 -0
  23. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestAsset.py +0 -0
  24. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestEx.py +0 -0
  25. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestOrder.py +0 -0
  26. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Binance/test_binance.py +0 -0
  27. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  28. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  29. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Gate/test_gate.py +0 -0
  30. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  31. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  32. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/__init__.py +0 -0
  33. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/_test_ex.py +0 -0
  34. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Agent.py +0 -0
  35. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Asset.py +0 -0
  36. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Auth.py +0 -0
  37. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/BaseTest.py +0 -0
  38. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Ex.py +0 -0
  39. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Exception.py +0 -0
  40. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Order.py +0 -0
  41. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/PmAgent.py +0 -0
  42. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/xtype.py +0 -0
  43. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/__init__.py +0 -0
  44. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/binance_async.py +0 -0
  45. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/earn_api.py +0 -0
  46. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/etype/ad.py +0 -0
  47. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/etype/pm.py +0 -0
  48. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/ex.py +0 -0
  49. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/exceptions.py +0 -0
  50. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/sapi.py +0 -0
  51. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/web_c2c.py +0 -0
  52. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/__init__.py +0 -0
  53. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/agent.py +0 -0
  54. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/base.py +0 -0
  55. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/etype/ad.py +0 -0
  56. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/etype/pm.py +0 -0
  57. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/ex.py +0 -0
  58. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/req.mjs +0 -0
  59. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/sign.js +0 -0
  60. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/__init__.py +0 -0
  61. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/agent.py +0 -0
  62. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/etype/ad.py +0 -0
  63. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/ex.py +0 -0
  64. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitPapa/ex.py +0 -0
  65. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/etype/cred.py +0 -0
  66. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/ex.py +0 -0
  67. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/order.py +0 -0
  68. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/web_earn.py +0 -0
  69. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/web_p2p.py +0 -0
  70. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gate/etype/ad.py +0 -0
  71. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gate/ex.py +0 -0
  72. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gate/premarket.py +0 -0
  73. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gmail/__init__.py +0 -0
  74. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/agent.py +0 -0
  75. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/earn.py +0 -0
  76. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/__init__.py +0 -0
  77. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/ad.py +0 -0
  78. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/cred.py +0 -0
  79. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/pm.py +0 -0
  80. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/test.py +0 -0
  81. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/ex.py +0 -0
  82. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/etype/ad.py +0 -0
  83. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/etype/pm.py +0 -0
  84. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/ex.py +0 -0
  85. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/web.py +0 -0
  86. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Mexc/etype/ad.py +0 -0
  87. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Mexc/etype/pm.py +0 -0
  88. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Mexc/ex.py +0 -0
  89. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Okx/etype/ad.py +0 -0
  90. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Okx/etype/pm.py +0 -0
  91. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Okx/ex.py +0 -0
  92. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/.gitignore +0 -0
  93. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Alfa/__init__.py +0 -0
  94. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Alfa/state.json +0 -0
  95. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/MTS/__init__.py +0 -0
  96. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Ozon/__init__.py +0 -0
  97. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Payeer/.gitignore +0 -0
  98. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Payeer/__init__.py +0 -0
  99. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Payeer/login.py +0 -0
  100. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Sber/__init__.py +0 -0
  101. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  102. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/__init__.py +0 -0
  103. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  104. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  105. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/api.py +0 -0
  106. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/pl.py +0 -0
  107. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Yandex/__init__.py +0 -0
  108. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/agent.py +0 -0
  109. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/asset.py +0 -0
  110. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/auth.py +0 -0
  111. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/ex.py +0 -0
  112. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/inAgent.py +0 -0
  113. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/order.py +0 -0
  114. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/pyd.py +0 -0
  115. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/pyro.py +0 -0
  116. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/web.py +0 -0
  117. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/__init__.py +0 -0
  118. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/loader.py +0 -0
  119. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/pm_unifier.py +0 -0
  120. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/dependency_links.txt +0 -0
  121. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/requires.txt +0 -0
  122. {xync_client-0.0.80.dev11 → xync_client-0.0.80.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.80.dev11
3
+ Version: 0.0.80.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
@@ -1,13 +1,14 @@
1
1
  from abc import abstractmethod
2
2
 
3
+ from pyro_client.client.file import FileClient
3
4
  from xync_schema.models import Actor
4
5
 
5
6
  from xync_client.Abc.Agent import BaseAgentClient
6
7
 
7
8
 
8
9
  class BaseInAgentClient:
9
- def __init__(self, actor: Actor):
10
- self.agent_client: BaseAgentClient = actor.client()
10
+ def __init__(self, actor: Actor, bot: FileClient):
11
+ self.agent_client: BaseAgentClient = actor.client(bot)
11
12
 
12
13
  @abstractmethod
13
14
  async def start_listen(self) -> bool: ...
@@ -0,0 +1,111 @@
1
+ import json
2
+ from asyncio import run
3
+
4
+ import websockets
5
+ from pyro_client.client.file import FileClient
6
+ from xync_client.Bybit.etype.order import StatusChange, CountDown, SellerCancelChange, Read, Receive, Status
7
+
8
+ from xync_client.loader import TOKEN
9
+ from xync_schema import models
10
+
11
+ from xync_client.Abc.InAgent import BaseInAgentClient
12
+ from xync_client.Bybit.agent import AgentClient
13
+
14
+
15
+ class InAgentClient(BaseInAgentClient):
16
+ agent_client: AgentClient
17
+
18
+ async def start_listen(self):
19
+ t = await self.agent_client.ott()
20
+ ts = int(float(t["time_now"]) * 1000)
21
+ await self.ws_prv(self.agent_client.actor.agent.auth["deviceId"], t["result"], ts)
22
+
23
+ # 3N: [T] - Уведомление об одобрении запроса на сделку
24
+ async def request_accepted_notify(self) -> int: ... # id
25
+
26
+ async def ws_prv(self, did: str, tok: str, ts: int):
27
+ u = f"wss://ws2.bybit.com/private?appid=bybit&os=web&deviceid={did}&timestamp={ts}"
28
+ async with websockets.connect(u) as websocket:
29
+ auth_msg = json.dumps({"req_id": did, "op": "login", "args": [tok]})
30
+ await websocket.send(auth_msg)
31
+
32
+ sub_msg = json.dumps({"op": "subscribe", "args": ["FIAT_OTC_TOPIC", "FIAT_OTC_ONLINE_TOPIC"]})
33
+ await websocket.send(sub_msg)
34
+ sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"SUPER_DEAL"}']})
35
+ await websocket.send(sub_msg)
36
+ sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"OTC_ORDER_STATUS"}']})
37
+ await websocket.send(sub_msg)
38
+ sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"WEB_THREE_SELL"}']})
39
+ await websocket.send(sub_msg)
40
+ sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"APPEALED_CHANGE"}']})
41
+ await websocket.send(sub_msg)
42
+
43
+ sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.cashier.order"]})
44
+ await websocket.send(sub_msg)
45
+ sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.cashier.order-eftd-complete-privilege-event"]})
46
+ await websocket.send(sub_msg)
47
+ sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.cashier.order-savings-product-event"]})
48
+ await websocket.send(sub_msg)
49
+ sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.deal-core.order-savings-complete-event"]})
50
+ await websocket.send(sub_msg)
51
+
52
+ sub_msg = json.dumps({"op": "subscribe", "args": ["FIAT_OTC_TOPIC", "FIAT_OTC_ONLINE_TOPIC"]})
53
+ await websocket.send(sub_msg)
54
+
55
+ while resp := await websocket.recv():
56
+ if data := json.loads(resp):
57
+ match data.get("topic"):
58
+ case "OTC_ORDER_STATUS":
59
+ match data["type"]:
60
+ case "STATUS_CHANGE":
61
+ upd = StatusChange.model_validate(data["data"])
62
+ if upd.status == Status.ws:
63
+ ...
64
+ case "COUNT_DOWN":
65
+ upd = CountDown.model_validate(data["data"])
66
+ case _:
67
+ self.listen(data)
68
+ case "OTC_USER_CHAT_MSG":
69
+ match data["type"]:
70
+ case "RECEIVE":
71
+ upd = Receive.model_validate(data["data"])
72
+ case "READ":
73
+ upd = Read.model_validate(data["data"])
74
+ case "CLEAR":
75
+ pass
76
+ case _:
77
+ self.listen(data)
78
+ case "OTC_USER_CHAT_MSG_V2":
79
+ pass
80
+ case "SELLER_CANCEL_CHANGE":
81
+ upd = SellerCancelChange.model_validate(data["data"])
82
+ case None:
83
+ if not data.get("success"):
84
+ self.listen(data)
85
+ case _:
86
+ self.listen(data)
87
+
88
+ @staticmethod
89
+ def listen(data: dict):
90
+ print(data)
91
+
92
+
93
+ async def main():
94
+ from x_model import init_db
95
+ from xync_client.loader import TORM
96
+
97
+ _ = await init_db(TORM, True)
98
+ # pbot = PyroClient(bot)
99
+ # await pbot.app.start()
100
+ # await pbot.app.create_channel("tc")
101
+ # await pbot.app.stop()
102
+
103
+ actor = await models.Actor.filter(ex_id=9, agent__auth__isnull=False).prefetch_related("ex", "agent").first()
104
+ async with FileClient(TOKEN) as b:
105
+ cl: InAgentClient = actor.in_client(b)
106
+ _ = await cl.start_listen()
107
+ await cl.agent_client.close()
108
+
109
+
110
+ if __name__ == "__main__":
111
+ run(main())
@@ -25,7 +25,7 @@ from xync_schema.models import Actor, Cond, CondSim, Pmcur, PairSide
25
25
 
26
26
  from xync_client.Abc.Agent import BaseAgentClient
27
27
  from xync_client.Abc.xtype import BaseOrderReq, FlatDict
28
- from xync_client.Bybit.etype.ad import AdPostRequest, AdUpdateRequest, AdDeleteRequest, Ad
28
+ from xync_client.Bybit.etype.ad import AdPostRequest, AdUpdateRequest, AdDeleteRequest, Ad, AdStatus
29
29
  from xync_client.Bybit.etype.cred import CredEpyd
30
30
  from xync_client.Bybit.etype.order import (
31
31
  OrderRequest,
@@ -35,7 +35,7 @@ from xync_client.Bybit.etype.order import (
35
35
  OrderItem,
36
36
  OrderFull,
37
37
  Message,
38
- Statuses,
38
+ Status,
39
39
  )
40
40
  from xync_client.loader import TORM, TOKEN
41
41
 
@@ -44,11 +44,6 @@ class NoMakerException(Exception):
44
44
  pass
45
45
 
46
46
 
47
- class AdsStatus(IntEnum):
48
- REST = 0
49
- WORKING = 1
50
-
51
-
52
47
  class AgentClient(BaseAgentClient): # Bybit client
53
48
  host = "api2.bybit.com"
54
49
  headers = {"cookie": ";"} # rewrite token for public methods
@@ -194,8 +189,8 @@ class AgentClient(BaseAgentClient): # Bybit client
194
189
  delete = await self._post("/fiat/otc/user/payment/new_delete", data)
195
190
  return delete
196
191
 
197
- async def switch_ads(self, new_status: AdsStatus) -> dict:
198
- data = {"workStatus": new_status.name}
192
+ async def switch_ads(self, new_status: AdStatus) -> dict:
193
+ data = {"workStatus": new_status.name} # todo: переделать на апи, там status 0 -> 1
199
194
  res = await self._post("/fiat/otc/maker/work-config/switch", data)
200
195
  return res
201
196
 
@@ -219,9 +214,14 @@ class AgentClient(BaseAgentClient): # Bybit client
219
214
  ads = [ad for ad in list_ads if set(ad["payments"]) - {"5", "51"}]
220
215
  return float(ads[0]["price"])
221
216
 
222
- def get_user_ads(self, active: bool = True) -> list:
223
- uo = self._post("/fiat/otc/item/personal/list", {"page": "1", "size": "10", "status": "2" if active else "0"})
224
- return uo["result"]["items"]
217
+ def my_ads(self, active: bool = True, page: int = 1) -> list[Ad]:
218
+ res = self.api.get_ads_list(size="30", page=str(page), status=AdStatus.active if active else AdStatus.sold_out)[
219
+ "result"
220
+ ]
221
+ ads = [Ad.model_validate(ad) for ad in res["items"]]
222
+ if res["count"] > 30 * page:
223
+ ads.extend(self.my_ads(active, page + 1))
224
+ return ads
225
225
 
226
226
  def get_security_token_create(self):
227
227
  data = self._post("/fiat/otc/item/create", self.create_ad_body)
@@ -479,10 +479,10 @@ class AgentClient(BaseAgentClient): # Bybit client
479
479
  order_db, _ = await models.Order.update_or_create(
480
480
  {
481
481
  "amount": o.amount,
482
- "status": OrderStatus[Statuses(o.status).name],
482
+ "status": OrderStatus[Status(o.status).name],
483
483
  "created_at": int(o.createDate[:-3]),
484
484
  "payed_at": order.transferDate != "0" and int(order.transferDate[:-3]) or None,
485
- "confirmed_at": Statuses(o.status) == Statuses.completed and int(order.updateDate[:-3]) or None,
485
+ "confirmed_at": Status(o.status) == Status.completed and int(order.updateDate[:-3]) or None,
486
486
  "appealed_at": o.status == 30 and int(order.updateDate[:-3]) or None,
487
487
  "cred_id": ecredex.paymentType and credex.cred_id or None,
488
488
  "taker": taker,
@@ -960,10 +960,6 @@ def step(mad, cad) -> float:
960
960
  )
961
961
 
962
962
 
963
- def listen(data: dict):
964
- print(data)
965
-
966
-
967
963
  class ExcCode(IntEnum):
968
964
  FixPriceLimit = 912120022
969
965
  RareLimit = 912120050
@@ -983,6 +979,7 @@ async def main():
983
979
  b: FileClient
984
980
  b.add_handler(MessageHandler(cond_start_handler, command("cond")))
985
981
  cl: AgentClient = actor.client(b)
982
+ cl.my_ads(False)
986
983
  # await cl.ex_client.set_pmcurexs(cookies=actor.agent.auth["cookies"]) # 617 -> 639
987
984
  # await cl.set_creds()
988
985
  # await cl.ex_client.set_pairs()
@@ -1023,8 +1020,8 @@ async def main():
1023
1020
  # cl.get_api_orders(), # 10, 1738357200000, 1742504399999
1024
1021
  cl.battle(usdt, rub, False, ["volet"], 80.88), # гонка в стакане покупки - мы продаем
1025
1022
  cl.battle(usdt, rub, True, ["volet"], 80.47), # гонка в стакане продажи - мы покупаем
1026
- cl.battle(usdt, rub, False, ["payeer"], 81.3), # гонка в стакане покупки - мы продаем
1027
- cl.battle(usdt, rub, True, ["payeer"], 80.46), # гонка в стакане продажи - мы покупаем
1023
+ cl.battle(usdt, rub, False, ["payeer"], 81.49), # гонка в стакане покупки - мы продаем
1024
+ cl.battle(usdt, rub, True, ["payeer"], 80.7), # гонка в стакане продажи - мы покупаем
1028
1025
  cl.battle(eth, rub, False, ["volet"], 300_000),
1029
1026
  cl.battle(eth, rub, True, ["volet"], 296_000),
1030
1027
  cl.battle(eth, rub, False, ["payeer"], 300_000),
@@ -1,3 +1,4 @@
1
+ from enum import StrEnum
1
2
  from typing import List, Optional, Any, Literal
2
3
  from pydantic import BaseModel
3
4
  from xync_schema.xtype import BaseAd
@@ -5,6 +6,11 @@ from xync_schema.xtype import BaseAd
5
6
  from xync_client.Abc.xtype import BaseAdUpdate
6
7
 
7
8
 
9
+ class AdStatus(StrEnum):
10
+ sold_out = "1"
11
+ active = "2"
12
+
13
+
8
14
  class AdsReq(BaseModel):
9
15
  tokenId: str
10
16
  currencyId: str
@@ -7,7 +7,14 @@ from pydantic import BaseModel
7
7
  from xync_client.Bybit.etype.cred import CredEpyd
8
8
 
9
9
 
10
- class Statuses(IntEnum):
10
+ class Topic(IntEnum):
11
+ OTC_USER_CHAT_MSG = 1
12
+ OTC_ORDER_STATUS_V2 = 2
13
+ OTC_ORDER_STATUS = 3
14
+ SELLER_CANCEL_CHANGE = 4
15
+
16
+
17
+ class Status(IntEnum):
11
18
  deleted = 40 # order canceled
12
19
  created = 10 # waiting for buyer to pay
13
20
  appealable = 20 # waiting for seller to release
@@ -21,6 +28,7 @@ class Statuses(IntEnum):
21
28
  request_canceled = 40
22
29
  requested = 10
23
30
  seller_appeal_disputed_by_buyer = 30
31
+ ws = 1
24
32
 
25
33
 
26
34
  class OrderRequest(BaseModel):
@@ -273,3 +281,52 @@ class Message(BaseModel):
273
281
  read: Literal[0, 1]
274
282
  fileName: str
275
283
  onlyForCustomer: int
284
+
285
+
286
+ class _BaseChange(BaseModel):
287
+ userId: int
288
+ makerUserId: int
289
+ id: str
290
+ status: Status
291
+ createDate: int
292
+ side: int
293
+ appealedTimes: int
294
+ totalAppealedTimes: int
295
+
296
+
297
+ class StatusChange(_BaseChange):
298
+ appealVersion: int = None
299
+
300
+
301
+ class CountDown(_BaseChange):
302
+ cancelType: Literal["ACTIVE", "TIMEOUT", ""]
303
+
304
+
305
+ class _BaseMsg(BaseModel):
306
+ userId: int
307
+ orderId: str
308
+ message: str = None
309
+ msgUuid: str
310
+ msgUuId: str
311
+ createDate: str
312
+ contentType: str
313
+ roleType: Literal["user", "sys", "alarm"]
314
+
315
+
316
+ class Receive(_BaseMsg):
317
+ id: int
318
+ msgCode: int
319
+ onlyForCustomer: int
320
+
321
+
322
+ class Read(_BaseMsg):
323
+ readAmount: int
324
+ read: Literal["111", "101"]
325
+ orderStatus: Status
326
+
327
+
328
+ class SellerCancelChange(BaseModel):
329
+ userId: int
330
+ makerUserId: int
331
+ id: str
332
+ createDate: int
@@ -0,0 +1,34 @@
1
+ import hmac
2
+ import json
3
+ import websockets
4
+ from time import time
5
+
6
+
7
+ async def pub():
8
+ async with websockets.connect("wss://stream.bybit.com/v5/public/spot") as websocket:
9
+ sub_msg = json.dumps(
10
+ {"op": "subscribe", "req_id": "1", "args": ["tickers.BTCUSDT", "tickers.ETHUSDT", "tickers.TONUSDT"]}
11
+ )
12
+ await websocket.send(sub_msg)
13
+ p = {}
14
+ while resp := await websocket.recv():
15
+ if data := json.loads(resp).get("data"):
16
+ p[data["symbol"]] = data["lastPrice"]
17
+ print(f"BTC: {p.get('BTCUSDT')}\nETH: {p.get('ETHUSDT')}\nTON: {p.get('TONUSDT')}", end="\033[F\033[F")
18
+
19
+
20
+ async def priv(key: str, sec: str):
21
+ async with websockets.connect("wss://stream.bybit.com/v5/private") as websocket:
22
+ expires = int((time() + 5) * 1000)
23
+ # Generate signature.
24
+ signature = str(
25
+ hmac.new(bytes(sec, "utf-8"), bytes(f"GET/realtime{expires}", "utf-8"), digestmod="sha256").hexdigest()
26
+ )
27
+ auth_msg = json.dumps({"op": "auth", "args": [key, expires, signature]})
28
+ await websocket.send(auth_msg)
29
+ await websocket.send(json.dumps({"req_id": "100001", "op": "ping"}))
30
+ sub_msg = json.dumps({"op": "subscribe", "args": ["wallet"]})
31
+ await websocket.send(sub_msg)
32
+ while resp := await websocket.recv():
33
+ if data := json.loads(resp).get("data"):
34
+ print(data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.80.dev11
3
+ Version: 0.0.80.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
@@ -17,8 +17,6 @@ tests/_todo_refact/Bybit/test_bybit_p2p.py
17
17
  tests/_todo_refact/Gate/test_gate.py
18
18
  tests/_todo_refact/Wallet/test_agent.py
19
19
  tests/_todo_refact/Wallet/test_ex.py
20
- videos/70a566eb-e9da-47d6-b9fa-1569b5eee48e.webm
21
- videos/e49ef853-97a0-4882-99de-9c5ce9795471.webm
22
20
  xync_client/__init__.py
23
21
  xync_client/loader.py
24
22
  xync_client/pm_unifier.py
@@ -1,44 +0,0 @@
1
- from asyncio import run
2
-
3
- from x_model import init_db
4
- from xync_schema import models
5
-
6
- from xync_client.Abc.InAgent import BaseInAgentClient
7
- from xync_client.Bybit.agent import AgentClient
8
- from xync_client.Bybit.ws import prv
9
- from xync_client.loader import PG_DSN
10
-
11
-
12
- class InAgentClient(BaseInAgentClient):
13
- agent_client: AgentClient
14
-
15
- async def start_listen(self):
16
- t = await self.agent_client.ott()
17
- ts = int(float(t["time_now"]) * 1000)
18
- await prv(self.agent_client.actor.agent.auth["deviceId"], t["result"], ts, listen)
19
-
20
- # 3N: [T] - Уведомление об одобрении запроса на сделку
21
- async def request_accepted_notify(self) -> int: ... # id
22
-
23
-
24
- def listen(data: dict):
25
- print(data)
26
-
27
-
28
- async def main():
29
- from xync_schema import TORM
30
-
31
- _ = await init_db(TORM, True)
32
- # pbot = PyroClient(bot)
33
- # await pbot.app.start()
34
- # await pbot.app.create_channel("tc")
35
- # await pbot.app.stop()
36
-
37
- actor = await models.Actor.filter(ex_id=9, agent__auth__isnull=False).prefetch_related("ex", "agent").first()
38
- cl: InAgentClient = actor.in_client()
39
- _ = await cl.start_listen()
40
- await cl.agent_client.close()
41
-
42
-
43
- if __name__ == "__main__":
44
- run(main())
@@ -1,68 +0,0 @@
1
- import hmac
2
- import json
3
- import websockets
4
- from time import time
5
-
6
-
7
- async def pub():
8
- async with websockets.connect("wss://stream.bybit.com/v5/public/spot") as websocket:
9
- sub_msg = json.dumps(
10
- {"op": "subscribe", "req_id": "1", "args": ["tickers.BTCUSDT", "tickers.ETHUSDT", "tickers.TONUSDT"]}
11
- )
12
- await websocket.send(sub_msg)
13
- p = {}
14
- while resp := await websocket.recv():
15
- if data := json.loads(resp).get("data"):
16
- p[data["symbol"]] = data["lastPrice"]
17
- print(f"BTC: {p.get('BTCUSDT')}\nETH: {p.get('ETHUSDT')}\nTON: {p.get('TONUSDT')}", end="\033[F\033[F")
18
-
19
-
20
- async def priv(key: str, sec: str):
21
- async with websockets.connect("wss://stream.bybit.com/v5/private") as websocket:
22
- expires = int((time() + 5) * 1000)
23
- # Generate signature.
24
- signature = str(
25
- hmac.new(bytes(sec, "utf-8"), bytes(f"GET/realtime{expires}", "utf-8"), digestmod="sha256").hexdigest()
26
- )
27
- auth_msg = json.dumps({"op": "auth", "args": [key, expires, signature]})
28
- await websocket.send(auth_msg)
29
- await websocket.send(json.dumps({"req_id": "100001", "op": "ping"}))
30
- sub_msg = json.dumps({"op": "subscribe", "args": ["wallet"]})
31
- await websocket.send(sub_msg)
32
- while resp := await websocket.recv():
33
- if data := json.loads(resp).get("data"):
34
- print(data)
35
-
36
-
37
- async def prv(did: str, tok: str, ts: int, cb: callable):
38
- u = f"wss://ws2.bybit.com/private?appid=bybit&os=web&deviceid={did}&timestamp={ts}"
39
- async with websockets.connect(u) as websocket:
40
- auth_msg = json.dumps({"req_id": did, "op": "login", "args": [tok]})
41
- await websocket.send(auth_msg)
42
-
43
- sub_msg = json.dumps({"op": "subscribe", "args": ["FIAT_OTC_TOPIC", "FIAT_OTC_ONLINE_TOPIC"]})
44
- await websocket.send(sub_msg)
45
- sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"SUPER_DEAL"}']})
46
- await websocket.send(sub_msg)
47
- sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"OTC_ORDER_STATUS"}']})
48
- await websocket.send(sub_msg)
49
- sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"WEB_THREE_SELL"}']})
50
- await websocket.send(sub_msg)
51
- sub_msg = json.dumps({"op": "input", "args": ["FIAT_OTC_TOPIC", '{"topic":"APPEALED_CHANGE"}']})
52
- await websocket.send(sub_msg)
53
-
54
- sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.cashier.order"]})
55
- await websocket.send(sub_msg)
56
- sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.cashier.order-eftd-complete-privilege-event"]})
57
- await websocket.send(sub_msg)
58
- sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.cashier.order-savings-product-event"]})
59
- await websocket.send(sub_msg)
60
- sub_msg = json.dumps({"op": "subscribe", "args": ["fiat.deal-core.order-savings-complete-event"]})
61
- await websocket.send(sub_msg)
62
-
63
- sub_msg = json.dumps({"op": "subscribe", "args": ["FIAT_OTC_TOPIC", "FIAT_OTC_ONLINE_TOPIC"]})
64
- await websocket.send(sub_msg)
65
-
66
- while resp := await websocket.recv():
67
- if data := json.loads(resp).get("data"):
68
- cb(data)