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