xync-bot 0.3.24.dev4__tar.gz → 0.3.24.dev5__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.dev4/xync_bot.egg-info → xync_bot-0.3.24.dev5}/PKG-INFO +1 -1
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/__init__.py +19 -4
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/pay/cd.py +1 -1
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/pay/dep.py +45 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/pay/handler.py +102 -106
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/pay/window.py +46 -57
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5/xync_bot.egg-info}/PKG-INFO +1 -1
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/.env.dist +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/.gitignore +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/.pre-commit-config.yaml +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/makefile +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/pyproject.toml +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/setup.cfg +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/test_main.http +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/__init__.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/loader.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/cond/__init__.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/cond/func.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/main.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/order.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/photo.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/vpn.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/routers/xicon.png +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/shared.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot/typs.py +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot.egg-info/SOURCES.txt +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot.egg-info/dependency_links.txt +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot.egg-info/requires.txt +0 -0
- {xync_bot-0.3.24.dev4 → xync_bot-0.3.24.dev5}/xync_bot.egg-info/top_level.txt +0 -0
|
@@ -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()
|
|
@@ -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
|
|
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
|
-
await
|
|
132
|
-
|
|
133
|
-
|
|
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,
|
|
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), 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(
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
256
|
-
await window.pm(query.message
|
|
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
|
|
257
|
+
await ans(query, None)
|
|
262
258
|
await state.update_data(detail=None)
|
|
263
|
-
await window.fill_cred_dtl(query.message
|
|
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
|
|
266
|
+
await ans(query, None)
|
|
271
267
|
await state.update_data(name=None)
|
|
272
|
-
await window.fill_cred_name(query.message
|
|
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
|
|
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
|
|
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
|
|
283
|
+
await ans(query, None)
|
|
288
284
|
await state.update_data(amount=None)
|
|
289
|
-
await window.amount(query.message
|
|
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
|
|
291
|
+
await ans(query, None)
|
|
296
292
|
await state.update_data(payment=None)
|
|
297
|
-
await window.pm(query.message
|
|
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
|
|
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 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.
|
|
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):
|
|
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
|