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.

Files changed (29) hide show
  1. {xync_bot-0.3.24.dev3/xync_bot.egg-info → xync_bot-0.3.24.dev4}/PKG-INFO +1 -1
  2. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/__init__.py +22 -9
  3. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/cd.py +0 -2
  4. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/handler.py +18 -20
  5. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/window.py +68 -72
  6. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4/xync_bot.egg-info}/PKG-INFO +1 -1
  7. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/.env.dist +0 -0
  8. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/.gitignore +0 -0
  9. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/.pre-commit-config.yaml +0 -0
  10. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/makefile +0 -0
  11. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/pyproject.toml +0 -0
  12. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/setup.cfg +0 -0
  13. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/test_main.http +0 -0
  14. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/__init__.py +0 -0
  15. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/loader.py +0 -0
  16. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/cond/__init__.py +0 -0
  17. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/cond/func.py +0 -0
  18. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/main.py +0 -0
  19. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/order.py +0 -0
  20. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/pay/dep.py +0 -0
  21. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/photo.py +0 -0
  22. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/vpn.py +0 -0
  23. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/routers/xicon.png +0 -0
  24. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/shared.py +0 -0
  25. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot/typs.py +0 -0
  26. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/SOURCES.txt +0 -0
  27. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/dependency_links.txt +0 -0
  28. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/requires.txt +0 -0
  29. {xync_bot-0.3.24.dev3 → xync_bot-0.3.24.dev4}/xync_bot.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-bot
3
- Version: 0.3.24.dev3
3
+ Version: 0.3.24.dev4
4
4
  Summary: Telegram bot with web app for xync net
5
5
  Author-email: Artemiev <mixartemev@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -1,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
- cls._store.curs = {
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(pm__pmcurs__id__in=cls._store.curs.keys())
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("pm_id")
26
- .values_list("pm_id", "sname")
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
- c.id: [pmc.pm_id for pmc in c.pmcurs]
33
- for c in await models.Cur.filter(id__in=cls._store.curs.keys()).prefetch_related("pmcurs")
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
- pms: dict[int, models.Pm] # id:name
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
- user: models.User
48
- actors: dict[int, models.Actor] # key=ex_id
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()
@@ -24,13 +24,11 @@ class Cred(CallbackData, prefix="cred"):
24
24
 
25
25
  class Ex(CallbackData, prefix="ex"):
26
26
  id: int
27
- name: str
28
27
  is_target: int # bool
29
28
 
30
29
 
31
30
  class Pm(CallbackData, prefix="pm"):
32
31
  pmcur_id: int
33
- name: str
34
32
  is_target: bool
35
33
 
36
34
 
@@ -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, state: FSMContext, **kwargs):
17
+ async def h_start(msg: Message):
16
18
  """Step 1: Select target type"""
17
- # await window.amount(msg, state)
18
- await state.set_data({"is_target": True})
19
- await window.type_select(msg, True)
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, state: FSMContext):
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
- await window.cur_select(query.message, state)
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, state: FSMContext):
33
+ async def h_got_crypto_type(query: CallbackQuery, bot: PGram):
33
34
  """Step 2c: Select coin"""
34
- await query.message.delete()
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, state)
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, state: FSMContext):
41
+ async def h_got_coin(query: CallbackQuery, callback_data: cd.Coin, bot: PGram):
42
42
  """Step 3c: Select target ex"""
43
- await query.message.delete()
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, state)
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, state: FSMContext):
49
+ async def h_got_cur(query: CallbackQuery, callback_data: cd.Cur, bot: PGram):
51
50
  """Step 3f: Select target pm"""
52
- await query.message.delete()
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, state)
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, is_target: bool):
12
+ async def type_select(msg: Message):
13
13
  """Step 1: Select type"""
14
- if is_target is False:
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=is_target).pack()
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
- await msg.answer("Что нужно?" if is_target else "Чем платишь?", reply_markup=rm)
27
-
28
-
29
- async def amount(msg: Message, state: FSMContext):
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
- cur_coin = (await state.get_value("coins"))[await state.get_value("t_coin_id")]
39
- builder.button(text="Назад к выбору биржи", callback_data=cd.PayNav(to=cd.PayStep.t_ex))
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
- await msg.answer(
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
- is_target = await state.get_value("is_target")
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=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 is_target else "ой платишь"
61
- await msg.answer("Выбери валюту котор" + sfx, reply_markup=builder.as_markup())
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, state: FSMContext):
49
+ async def coin_select(msg: Message):
65
50
  """Common using coin func"""
66
51
  builder = InlineKeyboardBuilder()
67
- if not (coins := await state.get_value("coins")):
68
- coins = {k: v for k, v in await models.Coin.all().values_list("id", "ticker")}
69
- await state.update_data(coins=coins)
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="Назад к выбору типа", callback_data=cd.PayNav(to=cd.PayStep.t_type if is_target else cd.PayStep.s_type)
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.answer("Выберите монету котор" + sfx, reply_markup=builder.as_markup())
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, state: FSMContext):
82
- data = await state.get_data()
83
- is_target = data["is_target"]
84
- coin_id = data[("t" if is_target else "s") + "_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 eid, name in exs:
89
- builder.button(text=name, callback_data=cd.Ex(id=eid, name=name, is_target=is_target))
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 is_target else cd.PayStep.s_coin)
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.answer("На какую биржу?" if is_target else "С какой биржи?", reply_markup=keyboard)
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, state: FSMContext):
100
- data = await state.get_data()
101
- is_target = data["is_target"]
102
- cur_id = data[("t" if is_target else "s") + "_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, name in pms:
113
- builder.button(text=name, callback_data=cd.Pm(pmcur_id=pmcur_id, name=name[:50], is_target=is_target))
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 is_target else cd.PayStep.s_cur)
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
- txt = "На какую платежную систему?" if is_target else "C какой платежной системы?"
121
- await msg.answer(txt, reply_markup=keyboard)
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=[
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xync-bot
3
- Version: 0.3.24.dev3
3
+ Version: 0.3.24.dev4
4
4
  Summary: Telegram bot with web app for xync net
5
5
  Author-email: Artemiev <mixartemev@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
File without changes
File without changes
File without changes