xync-bot 0.3.24.dev3__tar.gz → 0.3.24.dev4__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.
- {xync_bot-0.3.24.dev3/xync_bot.egg-info → xync_bot-0.3.24.dev4}/PKG-INFO +1 -1
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/__init__.py +22 -9
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/cd.py +0 -2
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/handler.py +18 -20
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/window.py +68 -72
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4/xync_bot.egg-info}/PKG-INFO +1 -1
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/.env.dist +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/.gitignore +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/.pre-commit-config.yaml +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/makefile +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/pyproject.toml +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/setup.cfg +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/test_main.http +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/__init__.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/loader.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/cond/__init__.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/cond/func.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/main.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/order.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/dep.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/photo.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/vpn.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/xicon.png +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/shared.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/typs.py +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/SOURCES.txt +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/dependency_links.txt +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/requires.txt +0 -0
- {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/top_level.txt +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from tortoise.functions import Min
|
|
2
|
+
from x_model.func import ArrayAgg
|
|
2
3
|
from xync_schema import models
|
|
3
4
|
|
|
4
5
|
from xync_bot.routers.pay.dep import flags
|
|
@@ -11,26 +12,30 @@ class SingleStore(type):
|
|
|
11
12
|
if not cls._store:
|
|
12
13
|
cls._store = super(SingleStore, cls).__call__()
|
|
13
14
|
cls._store.coins = {k: v for k, v in await models.Coin.all().order_by("ticker").values_list("id", "ticker")}
|
|
14
|
-
|
|
15
|
+
curs = {
|
|
15
16
|
k: v
|
|
16
17
|
for k, v in await models.Cur.filter(ticker__in=flags.keys())
|
|
17
18
|
.order_by("ticker")
|
|
18
19
|
.values_list("id", "ticker")
|
|
19
20
|
}
|
|
21
|
+
cls._store.curs = curs
|
|
20
22
|
cls._store.exs = {k: v for k, v in await models.Ex.all().values_list("id", "name")}
|
|
21
23
|
cls._store.pms = {
|
|
22
24
|
k: v
|
|
23
|
-
for k, v in await models.Pmex.filter(
|
|
25
|
+
for k, v in await models.Pmex.filter(pm__pmcurs__cur_id__in=cls._store.curs.keys())
|
|
24
26
|
.annotate(sname=Min("name"))
|
|
25
|
-
.group_by("
|
|
26
|
-
.values_list("
|
|
27
|
+
.group_by("pm__pmcurs__id")
|
|
28
|
+
.values_list("pm__pmcurs__id", "sname")
|
|
27
29
|
}
|
|
28
30
|
cls._store.coinexs = {
|
|
29
31
|
c.id: [ex.ex_id for ex in c.coinexs] for c in await models.Coin.all().prefetch_related("coinexs")
|
|
30
32
|
}
|
|
31
33
|
cls._store.curpms = {
|
|
32
|
-
|
|
33
|
-
for
|
|
34
|
+
cur_id: ids
|
|
35
|
+
for cur_id, ids in await models.Pmcur.filter(cur_id__in=curs.keys())
|
|
36
|
+
.annotate(ids=ArrayAgg("id"))
|
|
37
|
+
.group_by("cur_id")
|
|
38
|
+
.values_list("cur_id", "ids")
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
return cls._store
|
|
@@ -41,13 +46,20 @@ class Store:
|
|
|
41
46
|
coins: dict[int, str] # id:ticker
|
|
42
47
|
curs: dict[int, str] # id:ticker
|
|
43
48
|
exs: dict[int, str] # id:name
|
|
44
|
-
|
|
49
|
+
coinexs: dict[int, list[int]] # id:[ex_ids]
|
|
50
|
+
pms: dict[int, str] # pmcur_id:name
|
|
51
|
+
curpms: dict[int, list[int]] # id:[pmcur_ids]
|
|
45
52
|
|
|
46
53
|
class Permanent:
|
|
47
|
-
|
|
48
|
-
|
|
54
|
+
msg_id: int = None
|
|
55
|
+
user: models.User = None
|
|
56
|
+
actors: dict[int, models.Actor] = None # key=ex_id
|
|
49
57
|
|
|
50
58
|
class Current:
|
|
59
|
+
is_target: bool = None
|
|
60
|
+
is_fiat: bool = None
|
|
61
|
+
|
|
62
|
+
class Payment:
|
|
51
63
|
t_cur_id: int = None
|
|
52
64
|
s_cur_id: int = None
|
|
53
65
|
t_coin_id: int = None
|
|
@@ -61,4 +73,5 @@ class Store:
|
|
|
61
73
|
|
|
62
74
|
glob: Global
|
|
63
75
|
perm: Permanent = Permanent()
|
|
76
|
+
pay: Payment = Payment()
|
|
64
77
|
curr: Current = Current()
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from asyncio import create_task
|
|
2
2
|
from datetime import timedelta, datetime
|
|
3
|
+
|
|
4
|
+
import PGram
|
|
3
5
|
from aiogram import Router, F
|
|
4
6
|
from aiogram.filters import Command
|
|
5
7
|
from aiogram.types import Message, CallbackQuery
|
|
@@ -12,47 +14,43 @@ pay = Router()
|
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
@pay.message(Command("pay"))
|
|
15
|
-
async def h_start(msg: Message
|
|
17
|
+
async def h_start(msg: Message):
|
|
16
18
|
"""Step 1: Select target type"""
|
|
17
|
-
|
|
18
|
-
await
|
|
19
|
-
await window.type_select(msg
|
|
19
|
+
msg.bot.store.curr.is_target = True
|
|
20
|
+
await msg.delete()
|
|
21
|
+
await window.type_select(msg)
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
@pay.callback_query(cd.TargetType.filter(F.is_fiat))
|
|
23
|
-
async def h_got_fiat_type(query: CallbackQuery,
|
|
25
|
+
async def h_got_fiat_type(query: CallbackQuery, bot: PGram):
|
|
24
26
|
"""Step 2f: Select cur"""
|
|
25
|
-
await query.message.delete()
|
|
26
|
-
await state.update_data(is_fiat=True)
|
|
27
27
|
await query.answer("Понял, фиат")
|
|
28
|
-
|
|
28
|
+
bot.store.curr.is_fiat = True
|
|
29
|
+
await window.cur_select(query.message)
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
@pay.callback_query(cd.TargetType.filter(F.is_fiat.__eq__(0)))
|
|
32
|
-
async def h_got_crypto_type(query: CallbackQuery,
|
|
33
|
+
async def h_got_crypto_type(query: CallbackQuery, bot: PGram):
|
|
33
34
|
"""Step 2c: Select coin"""
|
|
34
|
-
|
|
35
|
-
await state.update_data(is_fiat=False)
|
|
35
|
+
bot.store.curr.is_fiat = False
|
|
36
36
|
await query.answer("Понял, крипта")
|
|
37
|
-
await window.coin_select(query.message
|
|
37
|
+
await window.coin_select(query.message)
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
@pay.callback_query(cd.Coin.filter())
|
|
41
|
-
async def h_got_coin(query: CallbackQuery, callback_data: cd.Coin,
|
|
41
|
+
async def h_got_coin(query: CallbackQuery, callback_data: cd.Coin, bot: PGram):
|
|
42
42
|
"""Step 3c: Select target ex"""
|
|
43
|
-
|
|
44
|
-
await state.update_data({("t" if await state.get_value("is_target") else "s") + "_coin_id": callback_data.id})
|
|
43
|
+
setattr(bot.store.curr, ("t" if bot.store.curr.is_target else "s") + "_coin_id", callback_data.id)
|
|
45
44
|
await query.answer("Эта монета есть на следующих биржах")
|
|
46
|
-
await window.ex_select(query.message
|
|
45
|
+
await window.ex_select(query.message)
|
|
47
46
|
|
|
48
47
|
|
|
49
48
|
@pay.callback_query(cd.Cur.filter())
|
|
50
|
-
async def h_got_cur(query: CallbackQuery, callback_data: cd.Cur,
|
|
49
|
+
async def h_got_cur(query: CallbackQuery, callback_data: cd.Cur, bot: PGram):
|
|
51
50
|
"""Step 3f: Select target pm"""
|
|
52
|
-
|
|
53
|
-
await state.update_data({("t" if await state.get_value("is_target") else "s") + "_cur_id": callback_data.id})
|
|
51
|
+
setattr(bot.store.curr, ("t" if bot.store.curr.is_target else "s") + "_cur_id", callback_data.id)
|
|
54
52
|
await query.answer("Вот платежные системы доступные для этой валюты")
|
|
55
|
-
await window.pm(query.message
|
|
53
|
+
await window.pm(query.message)
|
|
56
54
|
|
|
57
55
|
|
|
58
56
|
@pay.callback_query(cd.Pm.filter(F.is_target))
|
|
@@ -3,122 +3,97 @@ 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 tortoise.functions import Max
|
|
7
6
|
from xync_schema import models
|
|
8
7
|
|
|
8
|
+
from xync_bot import Store
|
|
9
9
|
from xync_bot.routers.pay import cd, dep
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
async def type_select(msg: Message
|
|
12
|
+
async def type_select(msg: Message):
|
|
13
13
|
"""Step 1: Select type"""
|
|
14
|
-
|
|
15
|
-
await msg.bot.delete_messages(chat_id=msg.chat.id, message_ids=[msg.message_id, msg.message_id - 1])
|
|
14
|
+
ist: bool = msg.bot.store.curr.is_target
|
|
16
15
|
rm = InlineKeyboardMarkup(
|
|
17
16
|
inline_keyboard=[
|
|
18
17
|
[
|
|
19
18
|
InlineKeyboardButton(
|
|
20
|
-
text="Банковская валюта", callback_data=cd.TargetType(is_fiat=1, is_target=
|
|
19
|
+
text="Банковская валюта", callback_data=cd.TargetType(is_fiat=1, is_target=ist).pack()
|
|
20
|
+
),
|
|
21
|
+
InlineKeyboardButton(
|
|
22
|
+
text="Крипта", callback_data=cd.TargetType(is_fiat=0, is_target=msg.bot.store.curr.is_target).pack()
|
|
21
23
|
),
|
|
22
|
-
InlineKeyboardButton(text="Крипта", callback_data=cd.TargetType(is_fiat=0, is_target=is_target).pack()),
|
|
23
24
|
]
|
|
24
25
|
]
|
|
25
26
|
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
await msg.bot.delete_messages(chat_id=msg.chat.id, message_ids=[msg.message_id, msg.message_id - 1])
|
|
31
|
-
"""Step 5: Filling target amount"""
|
|
32
|
-
builder = InlineKeyboardBuilder()
|
|
33
|
-
|
|
34
|
-
if await state.get_value("is_fiat"):
|
|
35
|
-
cur_coin = (await state.get_value("curs"))[await state.get_value("t_cur_id")]
|
|
36
|
-
builder.button(text="Назад к вводу имени", callback_data=cd.PayNav(to=cd.PayStep.t_cred_name))
|
|
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)
|
|
37
31
|
else:
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
msg = await msg.answer(txt, reply_markup=rm)
|
|
33
|
+
msg.bot.store.perm.msg_id = msg.message_id
|
|
40
34
|
|
|
41
|
-
builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
|
|
42
|
-
builder.adjust(2)
|
|
43
35
|
|
|
44
|
-
|
|
45
|
-
f"Введите нужную сумму {cur_coin} для {await state.get_value('t_name')}", reply_markup=builder.as_markup()
|
|
46
|
-
)
|
|
47
|
-
await state.set_state(dep.PaymentState.amount)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
async def cur_select(msg: Message, state: FSMContext):
|
|
36
|
+
async def cur_select(msg: Message):
|
|
51
37
|
"""Common using cur func"""
|
|
52
|
-
if not (curs := await state.get_value("curs")):
|
|
53
|
-
await state.update_data(curs=curs)
|
|
54
38
|
builder = InlineKeyboardBuilder()
|
|
55
|
-
|
|
56
|
-
for cur_id, ticker in curs.items():
|
|
57
|
-
builder.button(text=ticker + dep.flags[ticker], callback_data=cd.Cur(id=cur_id, is_target=
|
|
39
|
+
ist: bool = msg.bot.store.curr.is_target
|
|
40
|
+
for cur_id, ticker in msg.bot.store.glob.curs.items():
|
|
41
|
+
builder.button(text=ticker + dep.flags[ticker], callback_data=cd.Cur(id=cur_id, is_target=ist))
|
|
58
42
|
builder.button(text="Назад к выбору типа", callback_data=cd.PayNav(to=cd.PayStep.t_type))
|
|
59
43
|
builder.adjust(3, 3, 3, 3, 3, 1)
|
|
60
|
-
sfx = "ую нужно" if
|
|
61
|
-
await msg.
|
|
44
|
+
sfx = "ую нужно" if ist else "ой платишь"
|
|
45
|
+
await msg.edit_text("Выбери валюту котор" + sfx)
|
|
46
|
+
await msg.edit_reply_markup(reply_markup=builder.as_markup())
|
|
62
47
|
|
|
63
48
|
|
|
64
|
-
async def coin_select(msg: Message
|
|
49
|
+
async def coin_select(msg: Message):
|
|
65
50
|
"""Common using coin func"""
|
|
66
51
|
builder = InlineKeyboardBuilder()
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
is_target = await state.get_value("is_target")
|
|
71
|
-
for coin_id, ticker in coins.items():
|
|
72
|
-
builder.button(text=ticker, callback_data=cd.Coin(id=coin_id, is_target=is_target))
|
|
52
|
+
store: Store = msg.bot.store
|
|
53
|
+
for coin_id, ticker in store.glob.coins.items():
|
|
54
|
+
builder.button(text=ticker, callback_data=cd.Coin(id=coin_id, is_target=store.curr.is_target))
|
|
73
55
|
builder.button(
|
|
74
|
-
text="Назад к выбору типа",
|
|
56
|
+
text="Назад к выбору типа",
|
|
57
|
+
callback_data=cd.PayNav(to=cd.PayStep.t_type if store.curr.is_target else cd.PayStep.s_type),
|
|
75
58
|
)
|
|
76
59
|
builder.adjust(1)
|
|
77
|
-
sfx = "ую нужно" if is_target else "ой платишь"
|
|
78
|
-
await msg.
|
|
60
|
+
sfx = "ую нужно" if store.curr.is_target else "ой платишь"
|
|
61
|
+
await msg.edit_text("Выберите монету котор" + sfx)
|
|
62
|
+
await msg.edit_reply_markup(reply_markup=builder.as_markup())
|
|
79
63
|
|
|
80
64
|
|
|
81
|
-
async def ex_select(msg: Message
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
coin_id =
|
|
85
|
-
if not (exs := data.get("exs", {}).get(coin_id)):
|
|
86
|
-
await state.update_data({"exs": {coin_id: exs}})
|
|
65
|
+
async def ex_select(msg: Message):
|
|
66
|
+
store: Store = msg.bot.store
|
|
67
|
+
ist = store.curr.is_target
|
|
68
|
+
coin_id = getattr(store.curr, ("t" if ist else "s") + "_coin_id")
|
|
87
69
|
builder = InlineKeyboardBuilder()
|
|
88
|
-
for
|
|
89
|
-
builder.button(text=
|
|
70
|
+
for ex_id in store.glob.coinexs[coin_id]:
|
|
71
|
+
builder.button(text=store.glob.exs[ex_id], callback_data=cd.Ex(id=ex_id, is_target=ist))
|
|
90
72
|
builder.button(
|
|
91
|
-
text="Назад к выбору монеты", callback_data=cd.PayNav(to=cd.PayStep.t_coin if
|
|
73
|
+
text="Назад к выбору монеты", callback_data=cd.PayNav(to=cd.PayStep.t_coin if ist else cd.PayStep.s_coin)
|
|
92
74
|
)
|
|
93
75
|
builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
|
|
94
76
|
builder.adjust(1)
|
|
95
77
|
keyboard = builder.as_markup()
|
|
96
|
-
await msg.
|
|
78
|
+
await msg.edit_text("На какую биржу?" if ist else "С какой биржи?")
|
|
79
|
+
await msg.edit_reply_markup(reply_markup=keyboard)
|
|
97
80
|
|
|
98
81
|
|
|
99
|
-
async def pm(msg: Message
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
cur_id =
|
|
103
|
-
if not (pms := data.get("pms", {}).get(cur_id)):
|
|
104
|
-
pms = await (
|
|
105
|
-
models.Pmex.filter(pm__pmcurs__cur_id=cur_id)
|
|
106
|
-
.annotate(lname=Max("name"))
|
|
107
|
-
.group_by("pm__pmcurs__id")
|
|
108
|
-
.values_list("pm__pmcurs__id", "lname")
|
|
109
|
-
)
|
|
110
|
-
await state.update_data({"pms": {cur_id: pms}})
|
|
82
|
+
async def pm(msg: Message):
|
|
83
|
+
store: Store = msg.bot.store
|
|
84
|
+
ist = store.curr.is_target
|
|
85
|
+
cur_id = getattr(store.curr, ("t" if ist else "s") + "_cur_id")
|
|
111
86
|
builder = InlineKeyboardBuilder()
|
|
112
|
-
for pmcur_id
|
|
113
|
-
builder.button(text=
|
|
87
|
+
for pmcur_id in store.glob.curpms[cur_id]:
|
|
88
|
+
builder.button(text=store.glob.pms[pmcur_id], callback_data=cd.Pm(pmcur_id=pmcur_id, is_target=ist))
|
|
114
89
|
builder.button(
|
|
115
|
-
text="Назад к выбору валюты", callback_data=cd.PayNav(to=cd.PayStep.t_cur if
|
|
90
|
+
text="Назад к выбору валюты", callback_data=cd.PayNav(to=cd.PayStep.t_cur if ist else cd.PayStep.s_cur)
|
|
116
91
|
)
|
|
117
92
|
builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
|
|
118
93
|
builder.adjust(1)
|
|
119
94
|
keyboard = builder.as_markup()
|
|
120
|
-
|
|
121
|
-
await msg.
|
|
95
|
+
await msg.edit_text("На какую платежную систему?" if ist else "C какой платежной системы?")
|
|
96
|
+
await msg.edit_reply_markup(reply_markup=keyboard)
|
|
122
97
|
|
|
123
98
|
|
|
124
99
|
async def fill_cred_dtl(msg: Message, state: FSMContext):
|
|
@@ -160,6 +135,27 @@ async def fill_cred_name(msg: Message, state: FSMContext):
|
|
|
160
135
|
await state.set_state(dep.CredState.name)
|
|
161
136
|
|
|
162
137
|
|
|
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])
|
|
140
|
+
"""Step 5: Filling target amount"""
|
|
141
|
+
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")]
|
|
145
|
+
builder.button(text="Назад к вводу имени", callback_data=cd.PayNav(to=cd.PayStep.t_cred_name))
|
|
146
|
+
else:
|
|
147
|
+
cur_coin = (await state.get_value("coins"))[await state.get_value("t_coin_id")]
|
|
148
|
+
builder.button(text="Назад к выбору биржи", callback_data=cd.PayNav(to=cd.PayStep.t_ex))
|
|
149
|
+
|
|
150
|
+
builder.button(text="Домой", callback_data=cd.PayNav(to=cd.PayStep.t_type))
|
|
151
|
+
builder.adjust(2)
|
|
152
|
+
|
|
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)
|
|
157
|
+
|
|
158
|
+
|
|
163
159
|
async def set_ppo(msg: Message):
|
|
164
160
|
rm = InlineKeyboardMarkup(
|
|
165
161
|
inline_keyboard=[
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|