xync-bot 0.3.24.dev4__tar.gz → 0.3.24.dev6__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.

Potentially problematic release.


This version of xync-bot might be problematic. Click here for more details.

Files changed (29) hide show
  1. {xync_bot-0.3.24.dev4/xync_bot.egg-info → xync_bot-0.3.24.dev6}/PKG-INFO +1 -1
  2. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/__init__.py +19 -4
  3. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/pay/cd.py +1 -1
  4. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/pay/dep.py +49 -0
  5. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/pay/handler.py +103 -118
  6. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/pay/window.py +46 -57
  7. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6/xync_bot.egg-info}/PKG-INFO +1 -1
  8. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/.env.dist +0 -0
  9. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/.gitignore +0 -0
  10. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/.pre-commit-config.yaml +0 -0
  11. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/makefile +0 -0
  12. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/pyproject.toml +0 -0
  13. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/setup.cfg +0 -0
  14. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/test_main.http +0 -0
  15. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/__init__.py +0 -0
  16. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/loader.py +0 -0
  17. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/cond/__init__.py +0 -0
  18. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/cond/func.py +0 -0
  19. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/main.py +0 -0
  20. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/order.py +0 -0
  21. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/photo.py +0 -0
  22. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/vpn.py +0 -0
  23. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/routers/xicon.png +0 -0
  24. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/shared.py +0 -0
  25. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot/typs.py +0 -0
  26. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot.egg-info/SOURCES.txt +0 -0
  27. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot.egg-info/dependency_links.txt +0 -0
  28. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot.egg-info/requires.txt +0 -0
  29. {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev6}/xync_bot.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-bot
3
- Version: 0.3.24.dev4
3
+ Version: 0.3.24.dev6
4
4
  Summary: Telegram bot with web app for xync net
5
5
  Author-email: Artemiev <mixartemev@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -1,3 +1,4 @@
1
+ from aiogram.types import Message
1
2
  from tortoise.functions import Min
2
3
  from x_model.func import ArrayAgg
3
4
  from xync_schema import models
@@ -37,6 +38,13 @@ class SingleStore(type):
37
38
  .group_by("cur_id")
38
39
  .values_list("cur_id", "ids")
39
40
  }
41
+ cls._store.curpms = {
42
+ cur_id: ids
43
+ for cur_id, ids in await models.Pmcur.filter(cur_id__in=curs.keys())
44
+ .annotate(ids=ArrayAgg("id"))
45
+ .group_by("cur_id")
46
+ .values_list("cur_id", "ids")
47
+ }
40
48
 
41
49
  return cls._store
42
50
 
@@ -54,22 +62,29 @@ class Store:
54
62
  msg_id: int = None
55
63
  user: models.User = None
56
64
  actors: dict[int, models.Actor] = None # key=ex_id
65
+ ex_actors: dict[int, list[int]] = None # key=ex_id
66
+ creds: dict[int, models.Cred] = None # key=id
67
+ cur_creds: dict[int, list[int]] = None # pmcur_id:[cred_ids]
57
68
 
58
69
  class Current:
59
70
  is_target: bool = None
60
71
  is_fiat: bool = None
72
+ msg_to_del: Message = None
61
73
 
62
74
  class Payment:
63
75
  t_cur_id: int = None
64
76
  s_cur_id: int = None
65
77
  t_coin_id: int = None
66
78
  s_coin_id: int = None
67
- t_pm_id: int = None
68
- s_pm_id: int = None
79
+ t_pmcur_id: int = None
80
+ s_pmcur_id: int = None
69
81
  t_ex_id: int = None
70
82
  s_ex_id: int = None
71
- addr: models.Addr = None
72
- cred: models.Cred = None
83
+ amount: int | float = None
84
+ ppo: int = None
85
+ addr_id: int = None
86
+ cred_dtl: str = None
87
+ cred_id: int = None
73
88
 
74
89
  glob: Global
75
90
  perm: Permanent = Permanent()
@@ -3,7 +3,7 @@ from aiogram.filters.callback_data import CallbackData
3
3
  from xync_bot.routers.pay.dep import PayStep, ActionType
4
4
 
5
5
 
6
- class TargetType(CallbackData, prefix="target"):
6
+ class MoneyType(CallbackData, prefix="target"):
7
7
  is_fiat: int # bool
8
8
  is_target: int # bool
9
9
 
@@ -1,6 +1,12 @@
1
+ from asyncio import gather
1
2
  from enum import IntEnum
2
3
 
4
+ from aiogram.exceptions import TelegramBadRequest
3
5
  from aiogram.fsm.state import StatesGroup, State
6
+ from aiogram.types import Message, InlineKeyboardMarkup
7
+ from pyrogram.types import CallbackQuery
8
+ from x_model.func import ArrayAgg
9
+ from xync_schema import models
4
10
 
5
11
 
6
12
  class Report(StatesGroup):
@@ -68,3 +74,46 @@ flags = {
68
74
  "PHP": "🇵🇭",
69
75
  "USD": "🇺🇸",
70
76
  }
77
+
78
+
79
+ async def fill_creds(person_id: int) -> tuple[dict[int, models.Cred], dict[int, list[int]]]:
80
+ cq = models.Cred.filter(person_id=person_id)
81
+ creds = {c.id: c for c in await cq}
82
+ cur_creds = {
83
+ pci: ids
84
+ for pci, ids in await cq.annotate(ids=ArrayAgg("id")).group_by("pmcur_id").values_list("pmcur_id", "ids")
85
+ }
86
+ return creds, cur_creds
87
+
88
+
89
+ async def fill_actors(person_id: int) -> tuple[dict[int, models.Actor], dict[int, list[int]]]:
90
+ aq = models.Actor.filter(person_id=person_id)
91
+ actors = {a.id: a for a in await aq}
92
+ ex_act_ids = {
93
+ exi: ids for exi, ids in await aq.annotate(ids=ArrayAgg("id")).group_by("ex_id").values_list("ex_id", "ids")
94
+ }
95
+ return actors, ex_act_ids
96
+
97
+
98
+ async def edit(msg: Message, txt: str, rm: InlineKeyboardMarkup):
99
+ await gather(msg.edit_text(txt), msg.edit_reply_markup(reply_markup=rm))
100
+
101
+
102
+ async def ans(cbq: CallbackQuery, txt: str = None):
103
+ await cbq.answer(txt, cache_time=99)
104
+
105
+
106
+ async def dlt(msg: Message):
107
+ await msg.delete()
108
+
109
+
110
+ async def edt(msg: Message, txt: str, rm: InlineKeyboardMarkup):
111
+ if msg.message_id == msg.bot.store.perm.msg_id:
112
+ await msg.edit_text(txt, reply_markup=rm)
113
+ else: # окно вызвано в ответ на текст, а не кнопку
114
+ try:
115
+ await msg.bot.edit_message_text(
116
+ txt, chat_id=msg.chat.id, message_id=msg.bot.store.perm.msg_id, reply_markup=rm
117
+ )
118
+ except TelegramBadRequest as e:
119
+ print(msg.bot.store.perm.msg_id, e)
@@ -1,4 +1,4 @@
1
- from asyncio import create_task
1
+ from asyncio import create_task, gather
2
2
  from datetime import timedelta, datetime
3
3
 
4
4
  import PGram
@@ -6,8 +6,11 @@ from aiogram import Router, F
6
6
  from aiogram.filters import Command
7
7
  from aiogram.types import Message, CallbackQuery
8
8
  from aiogram.fsm.context import FSMContext
9
+ from xync_bot.routers.pay.dep import fill_creds, fill_actors, dlt, ans
9
10
  from xync_schema import models
10
11
  from aiogram.utils.keyboard import InlineKeyboardBuilder
12
+
13
+ from xync_bot import Store
11
14
  from xync_bot.routers.pay import cd, dep, window
12
15
 
13
16
  pay = Router()
@@ -16,173 +19,166 @@ pay = Router()
16
19
  @pay.message(Command("pay"))
17
20
  async def h_start(msg: Message):
18
21
  """Step 1: Select target type"""
19
- msg.bot.store.curr.is_target = True
20
- await msg.delete()
21
- await window.type_select(msg)
22
+ store: Store = msg.bot.store
23
+ store.curr.is_target = True
24
+ await gather(window.type_select(msg), dlt(msg))
25
+ store.perm.user = await models.User.get(username_id=msg.from_user.id)
26
+ store.perm.creds, store.perm.cur_creds = await fill_creds(store.perm.user.person_id)
22
27
 
23
28
 
24
- @pay.callback_query(cd.TargetType.filter(F.is_fiat))
29
+ @pay.callback_query(cd.MoneyType.filter(F.is_fiat))
25
30
  async def h_got_fiat_type(query: CallbackQuery, bot: PGram):
26
31
  """Step 2f: Select cur"""
27
- await query.answer("Понял, фиат")
28
32
  bot.store.curr.is_fiat = True
29
- await window.cur_select(query.message)
33
+ await gather(window.cur_select(query.message), ans(query, "Понял, фиат"))
30
34
 
31
35
 
32
- @pay.callback_query(cd.TargetType.filter(F.is_fiat.__eq__(0)))
36
+ @pay.callback_query(cd.MoneyType.filter(F.is_fiat.__eq__(0)))
33
37
  async def h_got_crypto_type(query: CallbackQuery, bot: PGram):
34
38
  """Step 2c: Select coin"""
35
39
  bot.store.curr.is_fiat = False
36
- await query.answer("Понял, крипта")
37
- await window.coin_select(query.message)
40
+ (bot.store.perm.actors, bot.store.perm.cur_creds), *_ = await gather(
41
+ fill_actors(bot.store.perm.user.person_id), window.coin_select(query.message), ans(query, "Понял, крипта")
42
+ )
38
43
 
39
44
 
40
45
  @pay.callback_query(cd.Coin.filter())
41
46
  async def h_got_coin(query: CallbackQuery, callback_data: cd.Coin, bot: PGram):
42
47
  """Step 3c: Select target ex"""
43
- setattr(bot.store.curr, ("t" if bot.store.curr.is_target else "s") + "_coin_id", callback_data.id)
44
- await query.answer("Эта монета есть на следующих биржах")
45
- await window.ex_select(query.message)
48
+ setattr(bot.store.pay, ("t" if bot.store.curr.is_target else "s") + "_coin_id", callback_data.id)
49
+ await gather(window.ex_select(query.message), ans(query, "Эта монета есть на следующих биржах"))
46
50
 
47
51
 
48
52
  @pay.callback_query(cd.Cur.filter())
49
53
  async def h_got_cur(query: CallbackQuery, callback_data: cd.Cur, bot: PGram):
50
54
  """Step 3f: Select target pm"""
51
- setattr(bot.store.curr, ("t" if bot.store.curr.is_target else "s") + "_cur_id", callback_data.id)
52
- await query.answer("Вот платежные системы доступные для этой валюты")
53
- await window.pm(query.message)
55
+ setattr(bot.store.pay, ("t" if bot.store.curr.is_target else "s") + "_cur_id", callback_data.id)
56
+ await gather(window.pm(query.message), ans(query, "Вот платежные системы доступные для этой валюты"))
54
57
 
55
58
 
56
59
  @pay.callback_query(cd.Pm.filter(F.is_target))
57
60
  async def h_got_target_pm(query: CallbackQuery, callback_data: cd.Pm, state: FSMContext):
58
61
  """Step 4f: Fill target cred.detail"""
59
- await query.message.delete()
60
- await state.update_data(t_pmcur_id=callback_data.pmcur_id, t_name=callback_data.name)
61
- await query.answer("Теперь нужны реквизиты")
62
- await window.fill_cred_dtl(query.message, state)
62
+ query.message.bot.store.pay.t_pmcur_id = callback_data.pmcur_id
63
+ await gather(
64
+ window.fill_cred_dtl(query.message),
65
+ ans(query, "Теперь нужны реквизиты"),
66
+ state.set_state(dep.CredState.detail),
67
+ )
63
68
 
64
69
 
65
70
  @pay.callback_query(cd.Cred.filter())
66
71
  async def h_got_cred(query: CallbackQuery, callback_data: cd.Cred, state: FSMContext):
67
- await query.message.delete()
68
- await state.update_data(cred_id=callback_data.id)
69
- await query.answer("Теперь нужна сумма")
70
- await window.amount(query.message, state)
72
+ query.message.bot.store.pay.cred_id = callback_data.id
73
+ await gather(
74
+ window.amount(query.message), ans(query, "Теперь нужна сумма"), state.set_state(dep.PaymentState.amount)
75
+ )
71
76
 
72
77
 
73
78
  @pay.message(dep.CredState.detail)
74
79
  async def h_got_cred_dtl(msg: Message, state: FSMContext):
75
80
  """Step 4.1f: Fill target cred.name"""
76
- while True:
77
- if msg.text.isdigit():
78
- await state.update_data(detail=int(msg.text))
79
- break
80
- else:
81
- await msg.answer("Пожалуйста, введите корректное число")
82
- return
83
- await window.fill_cred_name(msg, state)
81
+ msg.bot.store.pay.cred_dtl = msg.text
82
+ await gather(window.fill_cred_name(msg), dlt(msg), state.set_state(dep.CredState.name))
84
83
 
85
84
 
86
85
  @pay.message(dep.CredState.name)
87
86
  async def h_got_cred_name(msg: Message, state: FSMContext):
88
87
  """Step 5f: Save target cred"""
89
- data = await state.get_data()
90
- await state.set_state(None)
88
+ store: Store = msg.bot.store
91
89
  cred, _ = await models.Cred.update_or_create(
92
- {"name": msg.text}, detail=data["detail"], person_id=data["person_id"], pmcur_id=data["t_pmcur_id"]
90
+ {"name": msg.text},
91
+ detail=store.pay.cred_dtl,
92
+ person_id=store.perm.user.person_id,
93
+ pmcur_id=store.pay.t_pmcur_id,
93
94
  )
94
- await state.update_data(cred_id=cred.id)
95
- await window.amount(msg, state)
95
+ msg.bot.store.pay.cred_id = cred.id
96
+ await gather(window.amount(msg), dlt(msg), state.set_state(dep.PaymentState.amount))
96
97
 
97
98
 
98
99
  @pay.callback_query(cd.Ex.filter())
99
- async def h_got_ex(query: CallbackQuery, callback_data: cd.Ex, state: FSMContext):
100
+ async def h_got_ex(query: CallbackQuery, callback_data: cd.Ex):
100
101
  """Step 4c: Save target"""
101
- await query.message.delete()
102
- if is_target := await state.get_value("is_target"):
103
- await state.update_data(t_name=callback_data.name)
104
- await state.update_data({("t" if is_target else "s") + "_ex_id": callback_data.id})
105
- await query.answer(f"Биржа {callback_data.name} выбрана")
106
- await (window.amount(query.message, state) if is_target else window.set_ppo(query.message))
102
+ store: Store = query.message.bot.store
103
+ ist = store.curr.is_target
104
+ setattr(store, ("t" if ist else "s") + "_ex_id", callback_data.id)
105
+ await gather(
106
+ (window.amount if ist else window.set_ppo)(query.message),
107
+ ans(query, f"Биржа {store.glob.exs[callback_data.id]} выбрана"),
108
+ )
107
109
 
108
110
 
109
111
  @pay.message(dep.PaymentState.amount)
110
112
  async def h_got_amount(msg: Message, state: FSMContext):
111
113
  """Step 6: Save target amount"""
112
- while True:
113
- if msg.text.isdigit():
114
- await state.update_data(amount=int(msg.text))
115
- break
116
- else:
117
- await msg.answer("Пожалуйста, введите корректное число")
118
- return
119
- await state.set_state(None)
114
+ store: Store = msg.bot.store
115
+ if not msg.text.isnumeric():
116
+ store.curr.msg_to_del = await msg.answer("Пожалуйста, введите корректное число")
117
+ return
118
+ if store.curr.msg_to_del:
119
+ await store.curr.msg_to_del.delete()
120
+ store.pay.amount = float(msg.text)
120
121
  """Step 7: Select source type"""
121
- await state.update_data(is_target=False)
122
- if await state.get_value("is_fiat"):
123
- await window.type_select(msg, False)
124
- else:
125
- await window.cur_select(msg, state) # сразу выбор валюты источника, тк если цель крипта
122
+ store.curr.is_target = False
123
+ await gather((window.type_select if store.curr.is_fiat else window.cur_select)(msg), dlt(msg), state.clear())
126
124
 
127
125
 
128
126
  @pay.callback_query(cd.Pm.filter(F.is_target.__eq__(0)))
129
- async def h_got_source_pm(query: CallbackQuery, callback_data: cd.Pm, state: FSMContext):
130
- await query.message.delete()
131
- await state.update_data(s_pmcur_id=callback_data.pmcur_id)
132
- await query.answer(callback_data.name)
133
- await window.set_ppo(query.message)
127
+ async def h_got_source_pm(query: CallbackQuery, callback_data: cd.Pm):
128
+ store: Store = query.message.bot.store
129
+ store.pay.s_pmcur_id = callback_data.pmcur_id
130
+ await gather(
131
+ window.set_ppo(query.message),
132
+ ans(query, store.glob.pms[callback_data.pmcur_id]),
133
+ )
134
134
 
135
135
 
136
136
  @pay.callback_query(cd.Ppo.filter())
137
- async def h_got_ppo(query: CallbackQuery, state: FSMContext, callback_data: cd.Ppo):
138
- await query.message.delete()
139
- await state.update_data(ppo=callback_data.num)
140
- await query.answer(str(callback_data.num))
141
- await window.set_urgency(query.message)
137
+ async def h_got_ppo(query: CallbackQuery, callback_data: cd.Ppo):
138
+ query.message.bot.store.pay.ppo = callback_data.num
139
+ await gather(window.set_urgency(query.message), ans(query, str(callback_data.num)))
142
140
 
143
141
 
144
142
  @pay.callback_query(cd.Time.filter())
145
- async def process_time_selection(callback: CallbackQuery, callback_data: cd.Time, state: FSMContext):
146
- await callback.answer()
143
+ async def process_time_selection(query: CallbackQuery, callback_data: cd.Time, state: FSMContext):
144
+ store: Store = query.message.bot.store
145
+
147
146
  pay_until = datetime.now() + timedelta(minutes=callback_data.minutes)
148
147
 
149
- data = await state.get_data()
150
- if ex_id := data.get("t_ex_id", data.get("s_ex_id")):
151
- if not (actor_id := data.get("actor_id")):
152
- person_id = data.get("person_id")
153
- actor_id = await models.Actor.get(ex_id=ex_id, person_id=person_id).values_list("id", flat=True)
154
- await state.update_data(actor_id=actor_id)
155
- if not (addr_id := data.get("addr_id")):
156
- coin_id = data.get("t_coin_id", data.get("s_coin_id"))
148
+ if ex_id := (store.pay.t_ex_id or store.pay.s_ex_id):
149
+ actor_id = store.perm.actors[ex_id]
150
+ if not (addr_id := store.pay.addr):
151
+ coin_id = store.pay.t_coin_id or store.pay.s_coin_id
157
152
  addr_id = await models.Addr.get(coin_id=coin_id, actor_id=actor_id).values_list("id", flat=True)
158
- await state.update_data(addr_id=addr_id)
153
+ store.pay.addr_id = addr_id
159
154
  else:
160
155
  addr_id = None
161
-
162
- pay_req = await models.PayReq.create(
156
+ pr_data = dict(
163
157
  pay_until=pay_until,
164
- amount=data["amount"],
165
- parts=data["ppo"],
158
+ amount=store.pay.amount,
159
+ parts=store.pay.ppo,
166
160
  payed_at=None,
167
161
  addr_id=addr_id,
168
- cred_id=data["cred_id"],
169
- user_id=1,
162
+ cred_id=store.pay.cred_id,
163
+ user=store.perm.user,
170
164
  )
165
+ pay_req, *_ = await gather(
166
+ models.PayReq.create(**pr_data), ans(query, None), state.set_state(dep.PaymentState.timer)
167
+ )
168
+
171
169
  await state.update_data(
172
170
  timer=callback_data.minutes,
173
171
  timer_active=True,
174
172
  pay_until=pay_until,
175
173
  pay_req_id=pay_req.id,
176
174
  )
177
-
178
- await state.set_state(dep.PaymentState.timer)
179
- create_task(window.run_timer(callback.message, state))
175
+ create_task(window.run_timer(query.message, state))
180
176
 
181
177
 
182
178
  # ACTIONS
183
179
  @pay.callback_query(cd.Action.filter(F.act.__eq__(cd.ActionType.received)))
184
180
  async def payment_confirmed(query: CallbackQuery, state: FSMContext):
185
- await query.answer()
181
+ await ans(query, None)
186
182
  payed_at = datetime.now()
187
183
  await state.update_data(timer_active=False, payed_at_formatted=payed_at)
188
184
  data = await state.get_data()
@@ -194,13 +190,12 @@ async def payment_confirmed(query: CallbackQuery, state: FSMContext):
194
190
  builder = InlineKeyboardBuilder()
195
191
  builder.button(text="Новый платеж💸", callback_data=cd.PayNav(to=cd.PayStep.t_type))
196
192
  await query.message.answer("✅ Платеж успешно подтвержден", reply_markup=builder.as_markup())
197
- await query.message.delete()
198
193
  await state.clear()
199
194
 
200
195
 
201
196
  @pay.callback_query(cd.Action.filter(F.act.__eq__(cd.ActionType.not_received)))
202
197
  async def no_payment(query: CallbackQuery, state: FSMContext):
203
- await query.answer()
198
+ await ans(query, None)
204
199
  await state.update_data(timer_active=False)
205
200
  await query.message.edit_text("Платеж не получен!")
206
201
  await query.message.answer("укажите детали платежа")
@@ -218,80 +213,70 @@ async def payment_not_specified(msg: Message, state: FSMContext):
218
213
  f"Детали платежа: {data["text"]}\n"
219
214
  f"Время: {msg.date.strftime('%Y-%m-%d %H:%M:%S')}"
220
215
  )
221
- await msg.bot.send_message(chat_id="1779829771", text=complaint_text)
216
+ await msg.bot.send_message(chat_id="xyncpay", text=complaint_text)
222
217
 
223
218
 
224
219
  # NAVIGATION
225
220
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_type, cd.PayStep.s_type])))
226
221
  async def handle_home(query: CallbackQuery, state: FSMContext):
227
- await query.message.delete()
228
- await query.answer()
222
+ await ans(query, None)
229
223
  await window.type_select(query.message, await state.get_value("is_target"))
230
224
 
231
225
 
232
226
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_coin, cd.PayStep.s_coin])))
233
227
  async def to_coin_select(query: CallbackQuery, state: FSMContext):
234
- await query.message.delete()
235
- await query.answer()
228
+ await ans(query, None)
236
229
  is_target = await state.get_value("is_target")
237
230
  pref = "t" if is_target else "s"
238
231
  await state.update_data({pref + "_ex_id": None, pref + "_coin_id": None})
239
- await window.coin_select(query.message, state)
232
+ await window.coin_select(query.message)
240
233
 
241
234
 
242
235
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_cur, cd.PayStep.s_cur])))
243
236
  async def to_cur_select(query: CallbackQuery, state: FSMContext):
244
- await query.message.delete()
245
- await query.answer()
237
+ await ans(query, None)
246
238
  is_target = await state.get_value("is_target")
247
239
  pref = "t" if is_target else "s"
248
240
  await state.update_data({pref + "_pmcur_id": None, pref + "_cur_id": None})
249
- await window.cur_select(query.message, state)
241
+ await window.cur_select(query.message)
250
242
 
251
243
 
252
244
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_pm, cd.PayStep.s_pm])))
253
245
  async def to_pm_select(query: CallbackQuery, state: FSMContext):
254
- await query.message.delete()
255
- await query.answer()
256
- await window.pm(query.message, state)
246
+ await ans(query, None)
247
+ await window.pm(query.message)
257
248
 
258
249
 
259
250
  @pay.callback_query(cd.PayNav.filter(F.to.__eq__(cd.PayStep.t_cred_dtl)))
260
251
  async def back_to_cred_detail(query: CallbackQuery, state: FSMContext):
261
- await query.answer()
252
+ await ans(query, None)
262
253
  await state.update_data(detail=None)
263
- await window.fill_cred_dtl(query.message, state)
264
- await query.message.delete()
254
+ await window.fill_cred_dtl(query.message)
265
255
 
266
256
 
267
257
  @pay.callback_query(cd.PayNav.filter(F.to.__eq__(cd.PayStep.t_cred_name)))
268
258
  async def back_to_cred_name(query: CallbackQuery, state: FSMContext):
269
- await query.message.delete()
270
- await query.answer()
259
+ await ans(query, None)
271
260
  await state.update_data(name=None)
272
- await window.fill_cred_name(query.message, state)
273
- await query.message.delete()
261
+ await window.fill_cred_name(query.message)
274
262
 
275
263
 
276
264
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_ex, cd.PayStep.s_ex])))
277
265
  async def back_to_ex_select(query: CallbackQuery, state: FSMContext):
278
- await query.message.delete()
279
- await query.answer()
266
+ await ans(query, None)
280
267
  await state.update_data({("t" if await state.get_value("is_target") else "s") + "ex_id": None})
281
- await window.ex_select(query.message, state)
268
+ await window.ex_select(query.message)
282
269
 
283
270
 
284
271
  @pay.callback_query(cd.PayNav.filter(F.to.__eq__(cd.PayStep.t_amount)))
285
272
  async def back_to_amount(query: CallbackQuery, state: FSMContext):
286
- await query.message.delete()
287
- await query.answer()
273
+ await ans(query, None)
288
274
  await state.update_data(amount=None)
289
- await window.amount(query.message, state)
275
+ await window.amount(query.message)
290
276
 
291
277
 
292
278
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_pm])))
293
279
  async def back_to_payment(query: CallbackQuery, state: FSMContext):
294
- await query.message.delete()
295
- await query.answer()
280
+ await ans(query, None)
296
281
  await state.update_data(payment=None)
297
- await window.pm(query.message, state)
282
+ await window.pm(query.message)
@@ -3,7 +3,7 @@ from asyncio import sleep
3
3
  from aiogram.fsm.context import FSMContext
4
4
  from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton
5
5
  from aiogram.utils.keyboard import InlineKeyboardBuilder
6
- from xync_schema import models
6
+ from xync_bot.routers.pay.dep import edt
7
7
 
8
8
  from xync_bot import Store
9
9
  from xync_bot.routers.pay import cd, dep
@@ -11,26 +11,26 @@ from xync_bot.routers.pay import cd, dep
11
11
 
12
12
  async def type_select(msg: Message):
13
13
  """Step 1: Select type"""
14
- ist: bool = msg.bot.store.curr.is_target
14
+ store: Store = msg.bot.store
15
+ ist: bool = store.curr.is_target
15
16
  rm = InlineKeyboardMarkup(
16
17
  inline_keyboard=[
17
18
  [
18
19
  InlineKeyboardButton(
19
- text="Банковская валюта", callback_data=cd.TargetType(is_fiat=1, is_target=ist).pack()
20
+ text="Банковская валюта", callback_data=cd.MoneyType(is_fiat=1, is_target=ist).pack()
20
21
  ),
21
22
  InlineKeyboardButton(
22
- text="Крипта", callback_data=cd.TargetType(is_fiat=0, is_target=msg.bot.store.curr.is_target).pack()
23
+ text="Крипта", callback_data=cd.MoneyType(is_fiat=0, is_target=store.curr.is_target).pack()
23
24
  ),
24
25
  ]
25
26
  ]
26
27
  )
27
- txt = "Что нужно?" if msg.bot.store.curr.is_target else "Чем платишь?"
28
- if msg.bot.store.perm.msg_id:
29
- await msg.edit_text(txt)
30
- await msg.edit_reply_markup(reply_markup=rm)
28
+ txt = "Что нужно?" if store.curr.is_target else "Чем платишь?"
29
+ if store.perm.msg_id:
30
+ await edt(msg, txt, rm)
31
31
  else:
32
32
  msg = await msg.answer(txt, reply_markup=rm)
33
- msg.bot.store.perm.msg_id = msg.message_id
33
+ store.perm.msg_id = msg.message_id
34
34
 
35
35
 
36
36
  async def cur_select(msg: Message):
@@ -42,8 +42,7 @@ async def cur_select(msg: Message):
42
42
  builder.button(text="Назад к выбору типа", callback_data=cd.PayNav(to=cd.PayStep.t_type))
43
43
  builder.adjust(3, 3, 3, 3, 3, 1)
44
44
  sfx = "ую нужно" if ist else "ой платишь"
45
- await msg.edit_text("Выбери валюту котор" + sfx)
46
- await msg.edit_reply_markup(reply_markup=builder.as_markup())
45
+ await msg.edit_text("Выбери валюту котор" + sfx, reply_markup=builder.as_markup())
47
46
 
48
47
 
49
48
  async def coin_select(msg: Message):
@@ -58,14 +57,13 @@ async def coin_select(msg: Message):
58
57
  )
59
58
  builder.adjust(1)
60
59
  sfx = "ую нужно" if store.curr.is_target else "ой платишь"
61
- await msg.edit_text("Выберите монету котор" + sfx)
62
- await msg.edit_reply_markup(reply_markup=builder.as_markup())
60
+ await msg.edit_text("Выберите монету котор" + sfx, reply_markup=builder.as_markup())
63
61
 
64
62
 
65
63
  async def ex_select(msg: Message):
66
64
  store: Store = msg.bot.store
67
65
  ist = store.curr.is_target
68
- coin_id = getattr(store.curr, ("t" if ist else "s") + "_coin_id")
66
+ coin_id = getattr(store.pay, ("t" if ist else "s") + "_coin_id")
69
67
  builder = InlineKeyboardBuilder()
70
68
  for ex_id in store.glob.coinexs[coin_id]:
71
69
  builder.button(text=store.glob.exs[ex_id], callback_data=cd.Ex(id=ex_id, is_target=ist))
@@ -75,14 +73,13 @@ async def ex_select(msg: Message):
75
73
  builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
76
74
  builder.adjust(1)
77
75
  keyboard = builder.as_markup()
78
- await msg.edit_text("На какую биржу?" if ist else "С какой биржи?")
79
- await msg.edit_reply_markup(reply_markup=keyboard)
76
+ await msg.edit_text("На какую биржу?" if ist else "С какой биржи?", reply_markup=keyboard)
80
77
 
81
78
 
82
79
  async def pm(msg: Message):
83
80
  store: Store = msg.bot.store
84
81
  ist = store.curr.is_target
85
- cur_id = getattr(store.curr, ("t" if ist else "s") + "_cur_id")
82
+ cur_id = getattr(store.pay, ("t" if ist else "s") + "_cur_id")
86
83
  builder = InlineKeyboardBuilder()
87
84
  for pmcur_id in store.glob.curpms[cur_id]:
88
85
  builder.button(text=store.glob.pms[pmcur_id], callback_data=cd.Pm(pmcur_id=pmcur_id, is_target=ist))
@@ -92,68 +89,60 @@ async def pm(msg: Message):
92
89
  builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
93
90
  builder.adjust(1)
94
91
  keyboard = builder.as_markup()
95
- await msg.edit_text("На какую платежную систему?" if ist else "C какой платежной системы?")
96
- await msg.edit_reply_markup(reply_markup=keyboard)
92
+ await msg.edit_text("На какую платежную систему?" if ist else "C какой платежной системы?", reply_markup=keyboard)
97
93
 
98
94
 
99
- async def fill_cred_dtl(msg: Message, state: FSMContext):
95
+ async def fill_cred_dtl(msg: Message):
100
96
  builder = InlineKeyboardBuilder()
101
- data = await state.get_data()
102
- if not (person_id := data.get("person_id")):
103
- person_id = await models.User.get(username_id=193017646).values_list("person_id", flat=True)
104
- await state.update_data(person_id=person_id)
105
- pmcur_id = data["t_pmcur_id"]
106
- if not (creds := data.get("creds", {}).get(pmcur_id)):
107
- creds = await models.Cred.filter(person_id=person_id, pmcur_id=pmcur_id)
108
- await state.update_data({"creds": {pmcur_id: creds}})
109
- for cred in creds:
110
- txt = f"{cred.detail}\n{cred.name}"
111
- if cred.extra:
112
- txt += f" ({cred.extra})"
113
- builder.button(text=txt, callback_data=cd.Cred(id=cred.id))
97
+ store: Store = msg.bot.store
98
+ txt = "В"
99
+ if cred_ids := store.perm.cur_creds.get(store.pay.t_pmcur_id):
100
+ for cred_id in cred_ids:
101
+ cred = store.perm.creds[cred_id]
102
+ txt = f"{cred.detail}\n{cred.name}"
103
+ if cred.extra:
104
+ txt += f" ({cred.extra})"
105
+ builder.button(text=txt, callback_data=cd.Cred(id=cred_id))
106
+ txt = "Выберите реквизиты куда нужно получить деньги, если в списке нет нужных, то\nв"
114
107
 
115
108
  builder.button(text="Назад к выбору платежной системы", callback_data=cd.PayNav(to=cd.PayStep.t_pm))
116
109
  builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
117
110
  builder.adjust(2)
118
- txt = "Выберите реквизиты куда нужно получить деньги, если в списке нет нужных, то\n"
119
- await msg.answer(f"{txt}Введите номер для {await state.get_value('t_name')}:", reply_markup=builder.as_markup())
120
- await state.set_state(dep.CredState.detail)
111
+
112
+ await msg.edit_text(
113
+ f"{txt}ведите номер для {store.glob.pms[store.pay.t_pmcur_id]}:", reply_markup=builder.as_markup()
114
+ )
121
115
 
122
116
 
123
- async def fill_cred_name(msg: Message, state: FSMContext):
124
- await msg.bot.delete_messages(chat_id=msg.chat.id, message_ids=[msg.message_id, msg.message_id - 1])
125
- await state.update_data(detail=msg.text)
117
+ async def fill_cred_name(msg: Message):
126
118
  builder = InlineKeyboardBuilder()
127
119
  builder.button(text="Назад к вводу реквизитов", callback_data=cd.PayNav(to=cd.PayStep.t_cred_dtl))
128
120
  builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
129
121
  builder.adjust(2)
130
- data = await state.get_data()
131
- cur = data["curs"].get(data["t_cur_id"])
132
- payment = data["t_name"]
133
- detail = data["detail"]
134
- await msg.answer(f"{cur}:{payment}:{detail}: Введите имя получателя", reply_markup=builder.as_markup())
135
- await state.set_state(dep.CredState.name)
122
+ store: Store = msg.bot.store
123
+ cur = store.glob.curs[store.pay.t_cur_id]
124
+ payment = store.glob.pms[store.pay.t_pmcur_id]
125
+ detail = store.pay.cred_dtl
126
+ await edt(msg, f"{cur}:{payment}:{detail}: Введите имя получателя", builder.as_markup())
136
127
 
137
128
 
138
- async def amount(msg: Message, state: FSMContext):
139
- await msg.bot.delete_messages(chat_id=msg.chat.id, message_ids=[msg.message_id, msg.message_id - 1])
129
+ async def amount(msg: Message):
140
130
  """Step 5: Filling target amount"""
141
131
  builder = InlineKeyboardBuilder()
142
-
143
- if await state.get_value("is_fiat"):
144
- cur_coin = (await state.get_value("curs"))[await state.get_value("t_cur_id")]
132
+ store: Store = msg.bot.store
133
+ if store.curr.is_fiat:
134
+ cur_coin = store.glob.curs[store.pay.t_cur_id]
145
135
  builder.button(text="Назад к вводу имени", callback_data=cd.PayNav(to=cd.PayStep.t_cred_name))
136
+ t_name = store.glob.pms[store.pay.t_pmcur_id]
146
137
  else:
147
- cur_coin = (await state.get_value("coins"))[await state.get_value("t_coin_id")]
138
+ cur_coin = store.glob.curs[store.pay.t_coin_id]
148
139
  builder.button(text="Назад к выбору биржи", callback_data=cd.PayNav(to=cd.PayStep.t_ex))
140
+ t_name = store.glob.exs[store.pay.t_ex_id]
149
141
 
150
142
  builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
151
143
  builder.adjust(2)
152
144
 
153
- await msg.answer(
154
- f"Введите нужную сумму {cur_coin} для {await state.get_value('t_name')}", reply_markup=builder.as_markup()
155
- )
156
- await state.set_state(dep.PaymentState.amount)
145
+ await edt(msg, f"Введите нужную сумму {cur_coin} для {t_name}", builder.as_markup())
157
146
 
158
147
 
159
148
  async def set_ppo(msg: Message):
@@ -166,7 +155,7 @@ async def set_ppo(msg: Message):
166
155
  [InlineKeyboardButton(text="Да хоть на 3", callback_data="ppo:3")],
167
156
  ]
168
157
  )
169
- await msg.answer("На 2 платежа сможем разбить?", reply_markup=rm)
158
+ await msg.edit_text("На 2 платежа сможем разбить?", reply_markup=rm)
170
159
 
171
160
 
172
161
  async def set_urgency(msg: Message):
@@ -179,7 +168,7 @@ async def set_urgency(msg: Message):
179
168
  builder.button(text="Назад к вводу платежей", callback_data=cd.PayNav(to=cd.PayStep.t_pm))
180
169
  builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
181
170
  builder.adjust(2, 2, 1, 1, 1)
182
- await msg.answer("Сколько можешь ждать?", reply_markup=builder.as_markup())
171
+ await msg.edit_text("Сколько можешь ждать?", reply_markup=builder.as_markup())
183
172
 
184
173
 
185
174
  async def run_timer(message, state: FSMContext):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-bot
3
- Version: 0.3.24.dev4
3
+ Version: 0.3.24.dev6
4
4
  Summary: Telegram bot with web app for xync net
5
5
  Author-email: Artemiev <mixartemev@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
File without changes
File without changes
File without changes