xync-bot 0.3.24.dev4__py3-none-any.whl → 0.3.24.dev5__py3-none-any.whl

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.

@@ -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,11 @@
1
+ from asyncio import gather
1
2
  from enum import IntEnum
2
3
 
3
4
  from aiogram.fsm.state import StatesGroup, State
5
+ from aiogram.types import Message, InlineKeyboardMarkup
6
+ from pyrogram.types import CallbackQuery
7
+ from x_model.func import ArrayAgg
8
+ from xync_schema import models
4
9
 
5
10
 
6
11
  class Report(StatesGroup):
@@ -68,3 +73,43 @@ flags = {
68
73
  "PHP": "🇵🇭",
69
74
  "USD": "🇺🇸",
70
75
  }
76
+
77
+
78
+ async def fill_creds(person_id: int) -> tuple[dict[int, models.Cred], dict[int, list[int]]]:
79
+ cq = models.Cred.filter(person_id=person_id)
80
+ creds = {c.id: c for c in await cq}
81
+ cur_creds = {
82
+ pci: ids
83
+ for pci, ids in await cq.annotate(ids=ArrayAgg("id")).group_by("pmcur_id").values_list("pmcur_id", "ids")
84
+ }
85
+ return creds, cur_creds
86
+
87
+
88
+ async def fill_actors(person_id: int) -> tuple[dict[int, models.Actor], dict[int, list[int]]]:
89
+ aq = models.Actor.filter(person_id=person_id)
90
+ actors = {a.id: a for a in await aq}
91
+ ex_act_ids = {
92
+ exi: ids for exi, ids in await aq.annotate(ids=ArrayAgg("id")).group_by("ex_id").values_list("ex_id", "ids")
93
+ }
94
+ return actors, ex_act_ids
95
+
96
+
97
+ async def edit(msg: Message, txt: str, rm: InlineKeyboardMarkup):
98
+ await gather(msg.edit_text(txt), msg.edit_reply_markup(reply_markup=rm))
99
+
100
+
101
+ async def ans(cbq: CallbackQuery, txt: str = None):
102
+ await cbq.answer(txt, cache_time=99)
103
+
104
+
105
+ async def dlt(msg: Message):
106
+ await msg.delete()
107
+
108
+
109
+ async def edt(msg: Message, txt: str, rm: InlineKeyboardMarkup):
110
+ if msg.message_id == msg.bot.store.perm.msg_id:
111
+ await msg.edit_text(txt, reply_markup=rm)
112
+ else: # окно вызвано в ответ на текст, а не кнопку
113
+ await msg.bot.edit_message_text(txt, chat_id=msg.chat.id, message_id=msg.bot.store.perm.msg_id, reply_markup=rm)
114
+
115
+ await msg.edit_text(txt, reply_markup=rm)
@@ -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
+ query.message.bot.store.pay.s_pmcur_id = callback_data.pmcur_id
129
+ await gather(
130
+ window.set_ppo(query.message),
131
+ query.message.delete(),
132
+ ans(query, callback_data.name),
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), query.message.delete(), 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,
164
+ )
165
+ pay_req, *_ = await gather(
166
+ models.PayReq.create(**pr_data), ans(query, None), state.set_state(dep.PaymentState.timer)
170
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()
@@ -200,7 +196,7 @@ async def payment_confirmed(query: CallbackQuery, state: FSMContext):
200
196
 
201
197
  @pay.callback_query(cd.Action.filter(F.act.__eq__(cd.ActionType.not_received)))
202
198
  async def no_payment(query: CallbackQuery, state: FSMContext):
203
- await query.answer()
199
+ await ans(query, None)
204
200
  await state.update_data(timer_active=False)
205
201
  await query.message.edit_text("Платеж не получен!")
206
202
  await query.message.answer("укажите детали платежа")
@@ -225,73 +221,73 @@ async def payment_not_specified(msg: Message, state: FSMContext):
225
221
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_type, cd.PayStep.s_type])))
226
222
  async def handle_home(query: CallbackQuery, state: FSMContext):
227
223
  await query.message.delete()
228
- await query.answer()
224
+ await ans(query, None)
229
225
  await window.type_select(query.message, await state.get_value("is_target"))
230
226
 
231
227
 
232
228
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_coin, cd.PayStep.s_coin])))
233
229
  async def to_coin_select(query: CallbackQuery, state: FSMContext):
234
230
  await query.message.delete()
235
- await query.answer()
231
+ await ans(query, None)
236
232
  is_target = await state.get_value("is_target")
237
233
  pref = "t" if is_target else "s"
238
234
  await state.update_data({pref + "_ex_id": None, pref + "_coin_id": None})
239
- await window.coin_select(query.message, state)
235
+ await window.coin_select(query.message)
240
236
 
241
237
 
242
238
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_cur, cd.PayStep.s_cur])))
243
239
  async def to_cur_select(query: CallbackQuery, state: FSMContext):
244
240
  await query.message.delete()
245
- await query.answer()
241
+ await ans(query, None)
246
242
  is_target = await state.get_value("is_target")
247
243
  pref = "t" if is_target else "s"
248
244
  await state.update_data({pref + "_pmcur_id": None, pref + "_cur_id": None})
249
- await window.cur_select(query.message, state)
245
+ await window.cur_select(query.message)
250
246
 
251
247
 
252
248
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_pm, cd.PayStep.s_pm])))
253
249
  async def to_pm_select(query: CallbackQuery, state: FSMContext):
254
250
  await query.message.delete()
255
- await query.answer()
256
- await window.pm(query.message, state)
251
+ await ans(query, None)
252
+ await window.pm(query.message)
257
253
 
258
254
 
259
255
  @pay.callback_query(cd.PayNav.filter(F.to.__eq__(cd.PayStep.t_cred_dtl)))
260
256
  async def back_to_cred_detail(query: CallbackQuery, state: FSMContext):
261
- await query.answer()
257
+ await ans(query, None)
262
258
  await state.update_data(detail=None)
263
- await window.fill_cred_dtl(query.message, state)
259
+ await window.fill_cred_dtl(query.message)
264
260
  await query.message.delete()
265
261
 
266
262
 
267
263
  @pay.callback_query(cd.PayNav.filter(F.to.__eq__(cd.PayStep.t_cred_name)))
268
264
  async def back_to_cred_name(query: CallbackQuery, state: FSMContext):
269
265
  await query.message.delete()
270
- await query.answer()
266
+ await ans(query, None)
271
267
  await state.update_data(name=None)
272
- await window.fill_cred_name(query.message, state)
268
+ await window.fill_cred_name(query.message)
273
269
  await query.message.delete()
274
270
 
275
271
 
276
272
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_ex, cd.PayStep.s_ex])))
277
273
  async def back_to_ex_select(query: CallbackQuery, state: FSMContext):
278
274
  await query.message.delete()
279
- await query.answer()
275
+ await ans(query, None)
280
276
  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)
277
+ await window.ex_select(query.message)
282
278
 
283
279
 
284
280
  @pay.callback_query(cd.PayNav.filter(F.to.__eq__(cd.PayStep.t_amount)))
285
281
  async def back_to_amount(query: CallbackQuery, state: FSMContext):
286
282
  await query.message.delete()
287
- await query.answer()
283
+ await ans(query, None)
288
284
  await state.update_data(amount=None)
289
- await window.amount(query.message, state)
285
+ await window.amount(query.message)
290
286
 
291
287
 
292
288
  @pay.callback_query(cd.PayNav.filter(F.to.in_([cd.PayStep.t_pm])))
293
289
  async def back_to_payment(query: CallbackQuery, state: FSMContext):
294
290
  await query.message.delete()
295
- await query.answer()
291
+ await ans(query, None)
296
292
  await state.update_data(payment=None)
297
- await window.pm(query.message, state)
293
+ 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 msg.edit_text(f"Введите нужную сумму {cur_coin} для {t_name}", reply_markup=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.dev5
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
@@ -2,7 +2,7 @@ xync_bot/__init__.py,sha256=0m9zUYZUJHEJUMb24CU10wYfCIAg8eourNFlBLsHgWU,705
2
2
  xync_bot/loader.py,sha256=4ZeR-yVMoOmswdLS0UEBG19K7JVcuvH6WpP-_0yAK3I,573
3
3
  xync_bot/shared.py,sha256=MlKkTrsT29l7fF6-qAN9FO14cSuXuOuYxbNY5F4S2w4,137
4
4
  xync_bot/typs.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- xync_bot/routers/__init__.py,sha256=NvHk-tI-27BBtI8HGB95s46xo5_z5jNEYqeEeUfVWw8,2544
5
+ xync_bot/routers/__init__.py,sha256=GxSG8zgK0zVNK_U-mF4XWddgmCxfbfp2xwt_49zweVE,3171
6
6
  xync_bot/routers/main.py,sha256=FumWa48ORhV77Df6NbEosHfgmFIe_Y2ci6IkJCvU4Zs,9535
7
7
  xync_bot/routers/order.py,sha256=ZKWDLyiWrXzcR-aHKLBTBCACwp-P0Vvnr22T-EuLHaM,274
8
8
  xync_bot/routers/photo.py,sha256=aq6ImIOoZQYTW-lEy26qjgj5TYAuk4bQjgiCv64mPJs,1203
@@ -10,11 +10,11 @@ xync_bot/routers/vpn.py,sha256=qKK55UrjEZeDvu7ljWXNUFBFgXTPTIEaCT2OAmKWky4,2219
10
10
  xync_bot/routers/xicon.png,sha256=O57_kvzhVcCXSoGYZ61m0dW9pizY6gxR8Yj5aeCP0RQ,429283
11
11
  xync_bot/routers/cond/__init__.py,sha256=It4djVO8AxXL1I76buRz8yYF12dsjXaa4WNtPdb7CFc,4333
12
12
  xync_bot/routers/cond/func.py,sha256=m0NWDKunbqDJQmhv_5UnpjxjRzn78GFG94ThOFLVlQo,4720
13
- xync_bot/routers/pay/cd.py,sha256=Ia0fN8B6ZPKi45z_k1f7O55C9n4PnX-EhebSHRiszSs,901
14
- xync_bot/routers/pay/dep.py,sha256=QoOhmqKj8QesiIT6QqEomR2xu83cg9Z8mh6oquJKZnM,2208
15
- xync_bot/routers/pay/handler.py,sha256=bTczwWws5lQj8sbnw0Vo-uZl5RApAVTSj_SEHsRGUwE,11691
16
- xync_bot/routers/pay/window.py,sha256=h3jk42RJphD0TtX7IMCrXQERS2jGdRFuBf9oGJjRd0k,10184
17
- xync_bot-0.3.24.dev4.dist-info/METADATA,sha256=Df0VsJlwjs2TZ9S5S1GJzzfhmOdouuhqmsnem0EqzLk,751
18
- xync_bot-0.3.24.dev4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
- xync_bot-0.3.24.dev4.dist-info/top_level.txt,sha256=O2IjMc1ryAf0rwIXWohSNT5Kzcs9johgKRDz8lCC0rs,9
20
- xync_bot-0.3.24.dev4.dist-info/RECORD,,
13
+ xync_bot/routers/pay/cd.py,sha256=WGeGqFUvEeXWcL42EJ3jjyFAK1rg2X7yp5Z-W5GiWXE,900
14
+ xync_bot/routers/pay/dep.py,sha256=tRBOHiuimJ2xBlT0f8xg2Yl3rFm92L--Lflts5e6hD0,3844
15
+ xync_bot/routers/pay/handler.py,sha256=oni761tmSsEAzcC4aX3rNOEpngJRkXjvoscsj-6C4rs,11545
16
+ xync_bot/routers/pay/window.py,sha256=Nmm9gFPWvWsIWMggObLs8tC4hxQpybYmePAUdwCAL34,9325
17
+ xync_bot-0.3.24.dev5.dist-info/METADATA,sha256=K9jbDFDA0jKiIL_n1zPlMM2s7han1HfqVIsMERYfSMA,751
18
+ xync_bot-0.3.24.dev5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ xync_bot-0.3.24.dev5.dist-info/top_level.txt,sha256=O2IjMc1ryAf0rwIXWohSNT5Kzcs9johgKRDz8lCC0rs,9
20
+ xync_bot-0.3.24.dev5.dist-info/RECORD,,