xync-client 0.0.93.dev27__tar.gz → 0.0.93.dev29__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/.gitignore +2 -1
  2. {xync_client-0.0.93.dev27/xync_client.egg-info → xync_client-0.0.93.dev29}/PKG-INFO +1 -1
  3. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/InAgent.py +16 -4
  4. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/agent.py +3 -1
  5. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Payeer/__init__.py +7 -3
  6. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29/xync_client.egg-info}/PKG-INFO +1 -1
  7. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/.env.sample +0 -0
  8. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/.pre-commit-config.yaml +0 -0
  9. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/README.md +0 -0
  10. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/__init__.py +0 -0
  11. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/index.html +0 -0
  12. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/makefile +0 -0
  13. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/pyproject.toml +0 -0
  14. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/setup.cfg +0 -0
  15. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/TestAgent.py +0 -0
  16. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/TestAsset.py +0 -0
  17. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/TestEx.py +0 -0
  18. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/TestOrder.py +0 -0
  19. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/Binance/test_binance.py +0 -0
  20. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/Bybit/test_bybit.py +0 -0
  21. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/Bybit/test_bybit_p2p.py +0 -0
  22. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/Gate/test_gate.py +0 -0
  23. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/Wallet/test_agent.py +0 -0
  24. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/Wallet/test_ex.py +0 -0
  25. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/__init__.py +0 -0
  26. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/tests/_todo_refact/_test_ex.py +0 -0
  27. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/Agent.py +0 -0
  28. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/Asset.py +0 -0
  29. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/Auth.py +0 -0
  30. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/BaseTest.py +0 -0
  31. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/Ex.py +0 -0
  32. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/Exception.py +0 -0
  33. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/InAgent.py +0 -0
  34. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/Order.py +0 -0
  35. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/PmAgent.py +0 -0
  36. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Abc/xtype.py +0 -0
  37. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/__init__.py +0 -0
  38. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/binance_async.py +0 -0
  39. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/earn_api.py +0 -0
  40. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/etype/ad.py +0 -0
  41. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/etype/pm.py +0 -0
  42. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/ex.py +0 -0
  43. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/exceptions.py +0 -0
  44. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/sapi.py +0 -0
  45. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Binance/web_c2c.py +0 -0
  46. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/__init__.py +0 -0
  47. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/agent.py +0 -0
  48. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/base.py +0 -0
  49. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/etype/ad.py +0 -0
  50. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/etype/pm.py +0 -0
  51. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/ex.py +0 -0
  52. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/req.mjs +0 -0
  53. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BingX/sign.js +0 -0
  54. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BitGet/__init__.py +0 -0
  55. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BitGet/agent.py +0 -0
  56. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BitGet/etype/ad.py +0 -0
  57. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BitGet/ex.py +0 -0
  58. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/BitPapa/ex.py +0 -0
  59. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/etype/ad.py +0 -0
  60. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/etype/cred.py +0 -0
  61. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/etype/order.py +0 -0
  62. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/ex.py +0 -0
  63. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/order.py +0 -0
  64. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/web_earn.py +0 -0
  65. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/web_p2p.py +0 -0
  66. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Bybit/ws.py +0 -0
  67. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Gate/etype/ad.py +0 -0
  68. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Gate/ex.py +0 -0
  69. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Gate/premarket.py +0 -0
  70. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Gmail/__init__.py +0 -0
  71. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/agent.py +0 -0
  72. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/earn.py +0 -0
  73. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/etype/__init__.py +0 -0
  74. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/etype/ad.py +0 -0
  75. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/etype/cred.py +0 -0
  76. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/etype/pm.py +0 -0
  77. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/etype/test.py +0 -0
  78. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Htx/ex.py +0 -0
  79. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/KuCoin/etype/ad.py +0 -0
  80. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/KuCoin/etype/pm.py +0 -0
  81. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/KuCoin/ex.py +0 -0
  82. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/KuCoin/web.py +0 -0
  83. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Mexc/etype/ad.py +0 -0
  84. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Mexc/etype/pm.py +0 -0
  85. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Mexc/ex.py +0 -0
  86. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Okx/etype/ad.py +0 -0
  87. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Okx/etype/pm.py +0 -0
  88. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Okx/ex.py +0 -0
  89. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/.gitignore +0 -0
  90. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Alfa/__init__.py +0 -0
  91. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Alfa/state.json +0 -0
  92. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/MTS/__init__.py +0 -0
  93. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Ozon/__init__.py +0 -0
  94. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Payeer/.gitignore +0 -0
  95. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Payeer/api.py +0 -0
  96. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Payeer/login.py +0 -0
  97. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Sber/__init__.py +0 -0
  98. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Sber/utils.py +0 -0
  99. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Tinkoff/__init__.py +0 -0
  100. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Volet/__init__.py +0 -0
  101. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Volet/_todo_req/req.mjs +0 -0
  102. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Volet/_todo_req/req.py +0 -0
  103. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Volet/api.py +0 -0
  104. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Volet/pl.py +0 -0
  105. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Xync/__main__.py +0 -0
  106. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Xync/ed.py +0 -0
  107. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/Pms/Yandex/__init__.py +0 -0
  108. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/agent.py +0 -0
  109. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/asset.py +0 -0
  110. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/auth.py +0 -0
  111. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/ex.py +0 -0
  112. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/inAgent.py +0 -0
  113. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/order.py +0 -0
  114. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/pyd.py +0 -0
  115. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/pyro.py +0 -0
  116. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/TgWallet/web.py +0 -0
  117. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/__init__.py +0 -0
  118. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/loader.py +0 -0
  119. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client/pm_unifier.py +0 -0
  120. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client.egg-info/SOURCES.txt +0 -0
  121. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client.egg-info/dependency_links.txt +0 -0
  122. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client.egg-info/requires.txt +0 -0
  123. {xync_client-0.0.93.dev27 → xync_client-0.0.93.dev29}/xync_client.egg-info/top_level.txt +0 -0
@@ -9,4 +9,5 @@ __pycache__
9
9
  .vscode
10
10
  /xync_client/Gate/res.js
11
11
  /tests/res.js
12
- *.session*
12
+ *.session*
13
+ tmp/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.93.dev27
3
+ Version: 0.0.93.dev29
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
@@ -2,6 +2,7 @@ import json
2
2
  import logging
3
3
  import re
4
4
  from datetime import datetime, timezone
5
+ # from uuid import uuid4
5
6
 
6
7
  import websockets
7
8
  from asyncio import run
@@ -129,7 +130,9 @@ class InAgentClient(BaseInAgentClient):
129
130
  await order_db.update_from_dict(
130
131
  {
131
132
  "status": OrderStatus.appealed_by_seller,
132
- "appealed_at": int(float(order.updateDate) / 1000),
133
+ "appealed_at": datetime.fromtimestamp(
134
+ float(order.updateDate) / 1000
135
+ ),
133
136
  }
134
137
  ).save()
135
138
  logging.info(f"Order {order.id} appealed at {order_db.appealed_at}")
@@ -140,7 +143,9 @@ class InAgentClient(BaseInAgentClient):
140
143
  await order_db.update_from_dict(
141
144
  {
142
145
  "status": OrderStatus.completed,
143
- "confirmed_at": int(float(order.updateDate) / 1000),
146
+ "confirmed_at": datetime.fromtimestamp(
147
+ float(order.updateDate) / 1000
148
+ ),
144
149
  }
145
150
  ).save()
146
151
  logging.info(f"Order {order.id} completed at {order_db.confirmed_at}")
@@ -150,7 +155,9 @@ class InAgentClient(BaseInAgentClient):
150
155
  await order_db.update_from_dict(
151
156
  {
152
157
  "status": OrderStatus.paid,
153
- "payed_at": int(float(order.transferDate) / 1000),
158
+ "payed_at": datetime.fromtimestamp(
159
+ float(order.transferDate) / 1000
160
+ ),
154
161
  }
155
162
  ).save()
156
163
  logging.info(f"Order {order.id} payed at {order_db.payed_at}")
@@ -172,9 +179,9 @@ class InAgentClient(BaseInAgentClient):
172
179
  if order_db.ad.auto_msg != upd.message and upd.roleType not in ("sys", "alarm"):
173
180
  msg, _ = await models.Msg.update_or_create(
174
181
  {
175
- "sent_at": int(float(upd.createDate) / 1000),
176
182
  "to_maker": upd.userId == self.agent_client.actor.exid and im_taker,
177
183
  },
184
+ sent_at=datetime.fromtimestamp(float(upd.createDate) / 1000),
178
185
  txt=upd.message,
179
186
  order=order_db,
180
187
  )
@@ -239,6 +246,11 @@ class InAgentClient(BaseInAgentClient):
239
246
  order_db.status = OrderStatus.paid
240
247
  order_db.payed_at = datetime.now(timezone.utc)
241
248
  await order_db.save()
249
+ # models.Fiat.get()
250
+ # if res := self.agent_client.api.upload_chat_file(upload_file=f"tmp/{dest}.png").get('result'):
251
+ # self.agent_client.api.send_chat_message(
252
+ # orderId=str(order_db.exid), contentType="pic", message=res['url'], msgUuid=uuid4().hex
253
+ # )
242
254
  logging.warning(f"Order {order_db.exid} PAID at {datetime.now()}: {int_am}")
243
255
 
244
256
  async def get_pma_by_cdex(self, order: OrderFull) -> tuple[PmAgentClient, models.CredEx]:
@@ -590,6 +590,8 @@ class AgentClient(BaseAgentClient): # Bybit client
590
590
  # чью цену будем обгонять, предыдущей или слещующей объявы?
591
591
  # cad: Ad = ads[place] if cur_plc > place else ads[cur_plc]
592
592
  # переделал пока на жесткую установку целевого места, даже если текущее выше:
593
+ if len(ads) <= target_place:
594
+ logging.error(f"target place {target_place} not found in ads list {ads}")
593
595
  cad: Ad = ads[target_place]
594
596
  # а цена обгоняемой объявы не выше нашего потолка?
595
597
  if (Decimal(cad.price) - ceil) * k <= 0:
@@ -634,7 +636,7 @@ class AgentClient(BaseAgentClient): # Bybit client
634
636
  continue
635
637
  # если гонка дольше Х минут не обновлялась, обновляем ее (и ее пары) потолок
636
638
  expiration = datetime.now(timezone.utc) - timedelta(minutes=15)
637
- if not race.ceil or race.updated_at < expiration:
639
+ if race.updated_at < expiration:
638
640
  ceils, hp, vmf, zplace = await self.get_ceils(coinex, curex, pmexs, 0.001, True)
639
641
  race.ceil = ceils[int(taker_side)]
640
642
  await race.save()
@@ -51,15 +51,17 @@ class Client(PmAgentClient):
51
51
  if float(amount) <= float(fiat_accounts[0].replace(",", "").strip()):
52
52
  await page.locator('input[name="param_ACCOUNT_NUMBER"]').fill(dest)
53
53
  await page.locator("select[name=curr_receive]").select_option(value=cur)
54
+ sleep(0.9)
54
55
  await page.locator('input[name="sum_receive"]').fill(str(amount))
56
+ sleep(0.1)
55
57
  await page.click(".btn.n-form--btn.n-form--btn-mod")
56
58
  sleep(0.5)
57
59
  await page.click(".btn.n-form--btn.n-form--btn-mod")
58
- sleep(1)
60
+ sleep(1.2)
59
61
  if await page.locator(".input4").count():
60
62
  await page.locator(".input4").fill(self.agent.auth.get("master_key"))
61
63
  await page.click(".ok.button_green2")
62
- sleep(0.5)
64
+ sleep(0.1)
63
65
  await page.locator(".note_txt").wait_for(state="visible")
64
66
  if await page.locator('.note_txt:has-text("successfully completed")').count():
65
67
  transaction = await page.locator(".note_txt").all_text_contents()
@@ -68,7 +70,7 @@ class Client(PmAgentClient):
68
70
  await page.click(f".history-id-{trans_num} a.link")
69
71
  sleep(1)
70
72
  receipt = await page.query_selector(".ui-dialog.ui-corner-all")
71
- return trans_num, await receipt.screenshot()
73
+ return trans_num, await receipt.screenshot(path=f"tmp/{dest}.png")
72
74
  else:
73
75
  await self.bot.send("Payeer хз", self.uid, photo=await self.page.screenshot())
74
76
  return -1
@@ -115,6 +117,8 @@ async def main(uid: int):
115
117
  dest, amount, cur = "P1132982965", 2, "RUB"
116
118
  res = await pyr.send(dest, amount, cur)
117
119
  res = await pyr.send(dest, amount, cur)
120
+ res = await pyr.send(dest, amount, cur)
121
+ res = await pyr.send(dest, amount, cur)
118
122
  if len(res) > 1 and isinstance(res[1], bytes):
119
123
  await pyr.bot.send(f"Transaction #{res[0]}", uid, photo=res[1])
120
124
  elif res[0] > 0:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-client
3
- Version: 0.0.93.dev27
3
+ Version: 0.0.93.dev29
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