xync-bot 0.3.24.dev4__py3-none-any.whl → 0.3.24.dev6__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.
- xync_bot/routers/__init__.py +19 -4
- xync_bot/routers/pay/cd.py +1 -1
- xync_bot/routers/pay/dep.py +49 -0
- xync_bot/routers/pay/handler.py +103 -118
- xync_bot/routers/pay/window.py +46 -57
- {xync_bot-0.3.24.dev4.dist-info → xync_bot-0.3.24.dev6.dist-info}/METADATA +1 -1
- {xync_bot-0.3.24.dev4.dist-info → xync_bot-0.3.24.dev6.dist-info}/RECORD +9 -9
- {xync_bot-0.3.24.dev4.dist-info → xync_bot-0.3.24.dev6.dist-info}/WHEEL +0 -0
- {xync_bot-0.3.24.dev4.dist-info → xync_bot-0.3.24.dev6.dist-info}/top_level.txt +0 -0
xync_bot/routers/__init__.py
CHANGED
|
@@ -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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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()
|
xync_bot/routers/pay/cd.py
CHANGED
xync_bot/routers/pay/dep.py
CHANGED
|
@@ -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)
|
xync_bot/routers/pay/handler.py
CHANGED
|
@@ -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
|
|
20
|
-
|
|
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.
|
|
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.
|
|
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
|
|
37
|
-
|
|
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.
|
|
44
|
-
await query.
|
|
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.
|
|
52
|
-
await query.
|
|
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
|
-
|
|
60
|
-
await
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
68
|
-
await
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
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},
|
|
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
|
-
|
|
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
|
|
100
|
+
async def h_got_ex(query: CallbackQuery, callback_data: cd.Ex):
|
|
100
101
|
"""Step 4c: Save target"""
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
await
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
122
|
-
if
|
|
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
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
await
|
|
133
|
-
|
|
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,
|
|
138
|
-
|
|
139
|
-
await
|
|
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(
|
|
146
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
if not (
|
|
152
|
-
|
|
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
|
-
|
|
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=
|
|
165
|
-
parts=
|
|
158
|
+
amount=store.pay.amount,
|
|
159
|
+
parts=store.pay.ppo,
|
|
166
160
|
payed_at=None,
|
|
167
161
|
addr_id=addr_id,
|
|
168
|
-
cred_id=
|
|
169
|
-
|
|
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
|
|
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
|
|
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="
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
255
|
-
await query.
|
|
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
|
|
252
|
+
await ans(query, None)
|
|
262
253
|
await state.update_data(detail=None)
|
|
263
|
-
await window.fill_cred_dtl(query.message
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
287
|
-
await query.answer()
|
|
273
|
+
await ans(query, None)
|
|
288
274
|
await state.update_data(amount=None)
|
|
289
|
-
await window.amount(query.message
|
|
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
|
|
295
|
-
await query.answer()
|
|
280
|
+
await ans(query, None)
|
|
296
281
|
await state.update_data(payment=None)
|
|
297
|
-
await window.pm(query.message
|
|
282
|
+
await window.pm(query.message)
|
xync_bot/routers/pay/window.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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.
|
|
20
|
+
text="Банковская валюта", callback_data=cd.MoneyType(is_fiat=1, is_target=ist).pack()
|
|
20
21
|
),
|
|
21
22
|
InlineKeyboardButton(
|
|
22
|
-
text="Крипта", callback_data=cd.
|
|
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
|
|
28
|
-
if
|
|
29
|
-
await msg
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
95
|
+
async def fill_cred_dtl(msg: Message):
|
|
100
96
|
builder = InlineKeyboardBuilder()
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
txt =
|
|
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
|
-
|
|
119
|
-
await msg.
|
|
120
|
-
|
|
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
|
|
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
|
-
|
|
131
|
-
cur =
|
|
132
|
-
payment =
|
|
133
|
-
detail =
|
|
134
|
-
await msg
|
|
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
|
|
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
|
|
144
|
-
cur_coin =
|
|
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 =
|
|
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.
|
|
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.
|
|
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.
|
|
171
|
+
await msg.edit_text("Сколько можешь ждать?", reply_markup=builder.as_markup())
|
|
183
172
|
|
|
184
173
|
|
|
185
174
|
async def run_timer(message, state: FSMContext):
|
|
@@ -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=
|
|
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=
|
|
14
|
-
xync_bot/routers/pay/dep.py,sha256=
|
|
15
|
-
xync_bot/routers/pay/handler.py,sha256=
|
|
16
|
-
xync_bot/routers/pay/window.py,sha256=
|
|
17
|
-
xync_bot-0.3.24.
|
|
18
|
-
xync_bot-0.3.24.
|
|
19
|
-
xync_bot-0.3.24.
|
|
20
|
-
xync_bot-0.3.24.
|
|
13
|
+
xync_bot/routers/pay/cd.py,sha256=WGeGqFUvEeXWcL42EJ3jjyFAK1rg2X7yp5Z-W5GiWXE,900
|
|
14
|
+
xync_bot/routers/pay/dep.py,sha256=S88UCgJF2sO4OT7m_KaVZ9FtxTdf9dGb12WDqolpmo4,3982
|
|
15
|
+
xync_bot/routers/pay/handler.py,sha256=KGGMYFfw7pfsB7F1h5BmpeAZEFtQ8-ZY_vbiYSP3WSw,11168
|
|
16
|
+
xync_bot/routers/pay/window.py,sha256=y2k3eMf13_qhQF5CLGE-5G5oiFr8tW9omQgmiIRjx7s,9307
|
|
17
|
+
xync_bot-0.3.24.dev6.dist-info/METADATA,sha256=uBD3-8XGXcNst5tkq2ZK1duq5vJWJaDcXM3JrBvbNfo,751
|
|
18
|
+
xync_bot-0.3.24.dev6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
19
|
+
xync_bot-0.3.24.dev6.dist-info/top_level.txt,sha256=O2IjMc1ryAf0rwIXWohSNT5Kzcs9johgKRDz8lCC0rs,9
|
|
20
|
+
xync_bot-0.3.24.dev6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|