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.
- {xync_client-0.0.80.dev11/xync_client.egg-info → xync_client-0.0.80.dev14}/PKG-INFO +1 -1
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/InAgent.py +3 -2
- xync_client-0.0.80.dev14/xync_client/Bybit/InAgent.py +111 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/agent.py +17 -20
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/etype/ad.py +6 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/etype/order.py +58 -1
- xync_client-0.0.80.dev14/xync_client/Bybit/ws.py +34 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14/xync_client.egg-info}/PKG-INFO +1 -1
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/SOURCES.txt +0 -2
- xync_client-0.0.80.dev11/videos/70a566eb-e9da-47d6-b9fa-1569b5eee48e.webm +0 -0
- xync_client-0.0.80.dev11/videos/e49ef853-97a0-4882-99de-9c5ce9795471.webm +0 -0
- xync_client-0.0.80.dev11/xync_client/Bybit/InAgent.py +0 -44
- xync_client-0.0.80.dev11/xync_client/Bybit/ws.py +0 -68
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/.env.sample +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/.gitignore +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/.pre-commit-config.yaml +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/README.md +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/makefile +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/pyproject.toml +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/setup.cfg +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestAgent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestAsset.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestEx.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/TestOrder.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Binance/test_binance.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Gate/test_gate.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Wallet/test_agent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Wallet/test_ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/_test_ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Agent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Asset.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Auth.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/BaseTest.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Exception.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/Order.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/PmAgent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Abc/xtype.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/binance_async.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/earn_api.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/etype/pm.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/exceptions.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/sapi.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Binance/web_c2c.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/agent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/base.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/etype/pm.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/req.mjs +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BingX/sign.js +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/agent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitGet/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/BitPapa/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/etype/cred.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/order.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/web_earn.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Bybit/web_p2p.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gate/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gate/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gate/premarket.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Gmail/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/agent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/earn.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/cred.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/pm.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/etype/test.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Htx/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/etype/pm.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/KuCoin/web.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Mexc/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Mexc/etype/pm.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Mexc/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Okx/etype/ad.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Okx/etype/pm.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Okx/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/.gitignore +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Alfa/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Alfa/state.json +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/MTS/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Ozon/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Payeer/.gitignore +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Payeer/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Payeer/login.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Sber/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Tinkoff/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/api.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/pl.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Yandex/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/agent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/asset.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/auth.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/ex.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/inAgent.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/order.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/pyd.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/pyro.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/TgWallet/web.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/__init__.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/loader.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/pm_unifier.py +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/dependency_links.txt +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/requires.txt +0 -0
- {xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/top_level.txt +0 -0
|
@@ -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}×tamp={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
|
-
|
|
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:
|
|
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
|
|
223
|
-
|
|
224
|
-
|
|
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[
|
|
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":
|
|
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.
|
|
1027
|
-
cl.battle(usdt, rub, True, ["payeer"], 80.
|
|
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
|
|
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)
|
|
@@ -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
|
|
Binary file
|
|
Binary file
|
|
@@ -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}×tamp={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)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Binance/test_binance.py
RENAMED
|
File without changes
|
{xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Bybit/test_bybit.py
RENAMED
|
File without changes
|
{xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Bybit/test_bybit_p2p.py
RENAMED
|
File without changes
|
|
File without changes
|
{xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/tests/_todo_refact/Wallet/test_agent.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/_todo_req/req.mjs
RENAMED
|
File without changes
|
{xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client/Pms/Volet/_todo_req/req.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{xync_client-0.0.80.dev11 → xync_client-0.0.80.dev14}/xync_client.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|