xync-client 0.0.80.dev11__tar.gz → 0.0.80.dev13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. {xync_client-0.0.80.dev11/xync_client.egg-info → xync_client-0.0.80.dev13}/PKG-INFO +1 -1
  2. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/InAgent.py +3 -2
  3. xync_client-0.0.80.dev13/xync_client/Bybit/InAgent.py +109 -0
  4. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/agent.py +5 -5
  5. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/etype/order.py +57 -1
  6. xync_client-0.0.80.dev13/xync_client/Bybit/ws.py +34 -0
  7. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13/xync_client.egg-info}/PKG-INFO +1 -1
  8. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client.egg-info/SOURCES.txt +0 -2
  9. xync_client-0.0.80.dev11/videos/70a566eb-e9da-47d6-b9fa-1569b5eee48e.webm +0 -0
  10. xync_client-0.0.80.dev11/videos/e49ef853-97a0-4882-99de-9c5ce9795471.webm +0 -0
  11. xync_client-0.0.80.dev11/xync_client/Bybit/InAgent.py +0 -44
  12. xync_client-0.0.80.dev11/xync_client/Bybit/ws.py +0 -68
  13. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/.env.sample +0 -0
  14. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/.gitignore +0 -0
  15. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/.pre-commit-config.yaml +0 -0
  16. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/README.md +0 -0
  17. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/__init__.py +0 -0
  18. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/makefile +0 -0
  19. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/pyproject.toml +0 -0
  20. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/setup.cfg +0 -0
  21. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/TestAgent.py +0 -0
  22. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/TestAsset.py +0 -0
  23. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/TestEx.py +0 -0
  24. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/TestOrder.py +0 -0
  25. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/Binance/test_binance.py +0 -0
  26. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  27. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  28. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/Gate/test_gate.py +0 -0
  29. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  30. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  31. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/__init__.py +0 -0
  32. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/tests/_todo_refact/_test_ex.py +0 -0
  33. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/Agent.py +0 -0
  34. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/Asset.py +0 -0
  35. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/Auth.py +0 -0
  36. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/BaseTest.py +0 -0
  37. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/Ex.py +0 -0
  38. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/Exception.py +0 -0
  39. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/Order.py +0 -0
  40. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/PmAgent.py +0 -0
  41. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Abc/xtype.py +0 -0
  42. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/__init__.py +0 -0
  43. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/binance_async.py +0 -0
  44. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/earn_api.py +0 -0
  45. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/etype/ad.py +0 -0
  46. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/etype/pm.py +0 -0
  47. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/ex.py +0 -0
  48. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/exceptions.py +0 -0
  49. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/sapi.py +0 -0
  50. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Binance/web_c2c.py +0 -0
  51. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/__init__.py +0 -0
  52. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/agent.py +0 -0
  53. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/base.py +0 -0
  54. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/etype/ad.py +0 -0
  55. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/etype/pm.py +0 -0
  56. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/ex.py +0 -0
  57. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/req.mjs +0 -0
  58. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BingX/sign.js +0 -0
  59. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BitGet/__init__.py +0 -0
  60. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BitGet/agent.py +0 -0
  61. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BitGet/etype/ad.py +0 -0
  62. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BitGet/ex.py +0 -0
  63. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/BitPapa/ex.py +0 -0
  64. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/etype/ad.py +0 -0
  65. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/etype/cred.py +0 -0
  66. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/ex.py +0 -0
  67. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/order.py +0 -0
  68. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/web_earn.py +0 -0
  69. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Bybit/web_p2p.py +0 -0
  70. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Gate/etype/ad.py +0 -0
  71. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Gate/ex.py +0 -0
  72. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Gate/premarket.py +0 -0
  73. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Gmail/__init__.py +0 -0
  74. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/agent.py +0 -0
  75. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/earn.py +0 -0
  76. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/etype/__init__.py +0 -0
  77. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/etype/ad.py +0 -0
  78. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/etype/cred.py +0 -0
  79. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/etype/pm.py +0 -0
  80. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/etype/test.py +0 -0
  81. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Htx/ex.py +0 -0
  82. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/KuCoin/etype/ad.py +0 -0
  83. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/KuCoin/etype/pm.py +0 -0
  84. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/KuCoin/ex.py +0 -0
  85. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/KuCoin/web.py +0 -0
  86. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Mexc/etype/ad.py +0 -0
  87. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Mexc/etype/pm.py +0 -0
  88. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Mexc/ex.py +0 -0
  89. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Okx/etype/ad.py +0 -0
  90. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Okx/etype/pm.py +0 -0
  91. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Okx/ex.py +0 -0
  92. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/.gitignore +0 -0
  93. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Alfa/__init__.py +0 -0
  94. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Alfa/state.json +0 -0
  95. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/MTS/__init__.py +0 -0
  96. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Ozon/__init__.py +0 -0
  97. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Payeer/.gitignore +0 -0
  98. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Payeer/__init__.py +0 -0
  99. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Payeer/login.py +0 -0
  100. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Sber/__init__.py +0 -0
  101. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  102. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Volet/__init__.py +0 -0
  103. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  104. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  105. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Volet/api.py +0 -0
  106. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Volet/pl.py +0 -0
  107. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/Pms/Yandex/__init__.py +0 -0
  108. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/agent.py +0 -0
  109. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/asset.py +0 -0
  110. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/auth.py +0 -0
  111. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/ex.py +0 -0
  112. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/inAgent.py +0 -0
  113. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/order.py +0 -0
  114. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/pyd.py +0 -0
  115. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/pyro.py +0 -0
  116. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/TgWallet/web.py +0 -0
  117. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/__init__.py +0 -0
  118. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/loader.py +0 -0
  119. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client/pm_unifier.py +0 -0
  120. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client.egg-info/dependency_links.txt +0 -0
  121. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client.egg-info/requires.txt +0 -0
  122. {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev13}/xync_client.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.80.dev11
3
+ Version: 0.0.80.dev13
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client
@@ -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,109 @@
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
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
+ StatusChange.model_validate(data["data"])
62
+ case "COUNT_DOWN":
63
+ CountDown.model_validate(data["data"])
64
+ case _:
65
+ self.listen(data)
66
+ case "OTC_USER_CHAT_MSG":
67
+ match data["type"]:
68
+ case "RECEIVE":
69
+ Receive.model_validate(data["data"])
70
+ case "READ":
71
+ Read.model_validate(data["data"])
72
+ case "CLEAR":
73
+ pass
74
+ case _:
75
+ self.listen(data)
76
+ case "OTC_USER_CHAT_MSG_V2":
77
+ pass
78
+ case "SELLER_CANCEL_CHANGE":
79
+ SellerCancelChange.model_validate(data["data"])
80
+ case None:
81
+ if not data.get("success"):
82
+ self.listen(data)
83
+ case _:
84
+ self.listen(data)
85
+
86
+ @staticmethod
87
+ def listen(data: dict):
88
+ print(data)
89
+
90
+
91
+ async def main():
92
+ from x_model import init_db
93
+ from xync_client.loader import TORM
94
+
95
+ _ = await init_db(TORM, True)
96
+ # pbot = PyroClient(bot)
97
+ # await pbot.app.start()
98
+ # await pbot.app.create_channel("tc")
99
+ # await pbot.app.stop()
100
+
101
+ actor = await models.Actor.filter(ex_id=9, agent__auth__isnull=False).prefetch_related("ex", "agent").first()
102
+ async with FileClient(TOKEN) as b:
103
+ cl: InAgentClient = actor.in_client(b)
104
+ _ = await cl.start_listen()
105
+ await cl.agent_client.close()
106
+
107
+
108
+ if __name__ == "__main__":
109
+ run(main())
@@ -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
 
@@ -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,
@@ -1023,8 +1023,8 @@ async def main():
1023
1023
  # cl.get_api_orders(), # 10, 1738357200000, 1742504399999
1024
1024
  cl.battle(usdt, rub, False, ["volet"], 80.88), # гонка в стакане покупки - мы продаем
1025
1025
  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), # гонка в стакане продажи - мы покупаем
1026
+ cl.battle(usdt, rub, False, ["payeer"], 81.61), # гонка в стакане покупки - мы продаем
1027
+ cl.battle(usdt, rub, True, ["payeer"], 80.77), # гонка в стакане продажи - мы покупаем
1028
1028
  cl.battle(eth, rub, False, ["volet"], 300_000),
1029
1029
  cl.battle(eth, rub, True, ["volet"], 296_000),
1030
1030
  cl.battle(eth, rub, False, ["payeer"], 300_000),
@@ -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
@@ -273,3 +280,52 @@ class Message(BaseModel):
273
280
  read: Literal[0, 1]
274
281
  fileName: str
275
282
  onlyForCustomer: int
283
+
284
+
285
+ class _BaseChange(BaseModel):
286
+ userId: int
287
+ makerUserId: int
288
+ id: str
289
+ status: Status
290
+ createDate: int
291
+ side: int
292
+ appealedTimes: int
293
+ totalAppealedTimes: int
294
+
295
+
296
+ class StatusChange(_BaseChange):
297
+ appealVersion: int
298
+
299
+
300
+ class CountDown(_BaseChange):
301
+ cancelType: Literal["ACTIVE", "TIMEOUT"]
302
+
303
+
304
+ class _BaseMsg(BaseModel):
305
+ userId: int
306
+ orderId: str
307
+ message: str
308
+ msgUuid: str
309
+ msgUuId: str
310
+ createDate: str
311
+ contentType: str
312
+ roleType: Literal["user", "admin"]
313
+
314
+
315
+ class Receive(_BaseMsg):
316
+ id: int
317
+ msgCode: int
318
+ onlyForCustomer: int
319
+
320
+
321
+ class Read(_BaseMsg):
322
+ readAmount: int
323
+ read: Literal["111"]
324
+ orderStatus: Status
325
+
326
+
327
+ class SellerCancelChange(BaseModel):
328
+ userId: int
329
+ makerUserId: int
330
+ id: str
331
+ createDate: str
@@ -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.dev13
4
4
  Author-email: Mike Artemiev <mixartemev@gmail.com>
5
5
  Project-URL: Homepage, https://gitlab.com/XyncNet/client
6
6
  Project-URL: Repository, https://gitlab.com/XyncNet/client
@@ -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)