mirror of
https://github.com/Redume/Shirino.git
synced 2025-05-19 02:05:26 +01:00
chore: wrap lines to 79 chars for PEP8 compliance and improved readability, no logic changes
This commit is contained in:
parent
6f415c2378
commit
f92e24816d
1 changed files with 176 additions and 179 deletions
|
@ -1,8 +1,11 @@
|
||||||
|
from typing import Optional, Tuple, List
|
||||||
from aiogram import Router, types
|
from aiogram import Router, types
|
||||||
from aiogram.filters import Command
|
from aiogram.filters import Command, Text
|
||||||
from aiogram.types import InlineKeyboardMarkup, \
|
from aiogram.types import (
|
||||||
InlineKeyboardButton, \
|
InlineKeyboardMarkup,
|
||||||
CallbackQuery
|
InlineKeyboardButton,
|
||||||
|
CallbackQuery,
|
||||||
|
)
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from bot import db
|
from bot import db
|
||||||
|
@ -11,34 +14,57 @@ from i18n.localization import I18n
|
||||||
router = Router()
|
router = Router()
|
||||||
i18n = I18n()
|
i18n = I18n()
|
||||||
|
|
||||||
lang_options = [
|
LangOption = Tuple[str, str]
|
||||||
|
PeriodOption = Tuple[str, str]
|
||||||
|
|
||||||
|
LANG_OPTIONS: List[LangOption] = [
|
||||||
("en", "English"),
|
("en", "English"),
|
||||||
("ru", "Русский"),
|
("ru", "Русский"),
|
||||||
]
|
]
|
||||||
|
|
||||||
period_options = [
|
PERIOD_OPTIONS: List[PeriodOption] = [
|
||||||
("week", "week"),
|
("week", "week"),
|
||||||
("month", "month"),
|
("month", "month"),
|
||||||
("quarter", "quarter"),
|
("quarter", "quarter"),
|
||||||
("year", "year"),
|
("year", "year"),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
async def get_user_locale(user_id: int) -> dict:
|
||||||
|
data = await db.fetch(
|
||||||
|
'SELECT lang FROM users WHERE user_id = $1', user_id
|
||||||
|
)
|
||||||
|
if not data:
|
||||||
|
await db.insert(
|
||||||
|
'INSERT INTO users (user_id) VALUES (?)', user_id
|
||||||
|
)
|
||||||
|
data = await db.fetch(
|
||||||
|
'SELECT lang FROM users WHERE user_id = $1', user_id
|
||||||
|
)
|
||||||
|
lang = data.get('lang', 'en')
|
||||||
|
return i18n.get_locale(lang)
|
||||||
|
|
||||||
|
|
||||||
def build_options_keyboard(
|
def build_options_keyboard(
|
||||||
options: list[tuple[str, str]],
|
options: List[Tuple[str, str]],
|
||||||
current_value: str,
|
current_value: str,
|
||||||
callback_prefix: str,
|
callback_prefix: str,
|
||||||
locale: dict,
|
locale: dict,
|
||||||
buttons_per_row: int = 2,
|
buttons_per_row: int = 2,
|
||||||
back_callback: str = None
|
back_callback: Optional[str] = None,
|
||||||
) -> InlineKeyboardMarkup:
|
) -> InlineKeyboardMarkup:
|
||||||
buttons = []
|
buttons: List[List[InlineKeyboardButton]] = []
|
||||||
row = []
|
row: List[InlineKeyboardButton] = []
|
||||||
|
|
||||||
for code, label_key in options:
|
for code, label_key in options:
|
||||||
label = locale.get(label_key, label_key)
|
label = locale.get(label_key, label_key)
|
||||||
text = f"[X] {label}" if code == current_value else label
|
text = (
|
||||||
row.append(InlineKeyboardButton(
|
f"[X] {label}" if code == current_value else label
|
||||||
text=text,
|
)
|
||||||
callback_data=f"{callback_prefix}_{code}")
|
row.append(
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=text, callback_data=f"{callback_prefix}_{code}"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
if len(row) == buttons_per_row:
|
if len(row) == buttons_per_row:
|
||||||
buttons.append(row)
|
buttons.append(row)
|
||||||
|
@ -46,203 +72,182 @@ def build_options_keyboard(
|
||||||
if row:
|
if row:
|
||||||
buttons.append(row)
|
buttons.append(row)
|
||||||
if back_callback:
|
if back_callback:
|
||||||
buttons.append([
|
buttons.append(
|
||||||
InlineKeyboardButton(
|
[
|
||||||
text=locale.get("back"),
|
InlineKeyboardButton(
|
||||||
callback_data=back_callback
|
text=locale.get("back"),
|
||||||
)
|
callback_data=back_callback,
|
||||||
])
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
return InlineKeyboardMarkup(inline_keyboard=buttons)
|
return InlineKeyboardMarkup(inline_keyboard=buttons)
|
||||||
|
|
||||||
|
|
||||||
def get_chart_toggle_keyboard(
|
def get_chart_toggle_keyboard(
|
||||||
chart_enabled: bool,
|
chart_enabled: bool, locale: dict
|
||||||
locale: dict
|
|
||||||
) -> InlineKeyboardMarkup:
|
) -> InlineKeyboardMarkup:
|
||||||
toggle_text = locale.get("chart_disable") \
|
toggle_text = (
|
||||||
if chart_enabled \
|
locale.get("chart_disable")
|
||||||
|
if chart_enabled
|
||||||
else locale.get("chart_enable")
|
else locale.get("chart_enable")
|
||||||
|
)
|
||||||
|
return InlineKeyboardMarkup(
|
||||||
|
inline_keyboard=[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=toggle_text, callback_data="chart_toggle"
|
||||||
|
),
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=locale.get("chart_period"),
|
||||||
|
callback_data="chart_period",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=locale.get("back"),
|
||||||
|
callback_data="back_to_settings",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
return InlineKeyboardMarkup(inline_keyboard=[
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
text=toggle_text,
|
|
||||||
callback_data="chart_toggle"),
|
|
||||||
InlineKeyboardButton(
|
|
||||||
text=locale.get("chart_period"),
|
|
||||||
callback_data="chart_period"
|
|
||||||
),
|
|
||||||
],
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
text=locale.get("back"),
|
|
||||||
callback_data="back_to_settings"
|
|
||||||
),
|
|
||||||
],
|
|
||||||
])
|
|
||||||
|
|
||||||
def markup_to_json(markup: InlineKeyboardMarkup | None) -> str | None:
|
def markup_to_json(
|
||||||
|
markup: Optional[InlineKeyboardMarkup],
|
||||||
|
) -> Optional[str]:
|
||||||
if markup is None:
|
if markup is None:
|
||||||
return None
|
return None
|
||||||
# model_dump() возвращает dict с данными
|
|
||||||
return json.dumps(markup.model_dump(), sort_keys=True)
|
return json.dumps(markup.model_dump(), sort_keys=True)
|
||||||
|
|
||||||
|
|
||||||
async def safe_edit_message_text(
|
async def safe_edit_message_text(
|
||||||
callback: CallbackQuery,
|
callback: CallbackQuery,
|
||||||
new_text: str,
|
new_text: str,
|
||||||
new_reply_markup: InlineKeyboardMarkup | None = None,
|
new_reply_markup: Optional[InlineKeyboardMarkup] = None,
|
||||||
parse_mode: str | None = None,
|
parse_mode: Optional[str] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
message = callback.message
|
message = callback.message
|
||||||
|
|
||||||
current_text = (message.text or "").strip()
|
current_text = (message.text or "").strip()
|
||||||
new_text_clean = new_text.strip()
|
new_text_clean = new_text.strip()
|
||||||
|
|
||||||
is_text_same = (current_text == new_text_clean)
|
is_text_same = current_text == new_text_clean
|
||||||
|
is_markup_same = (
|
||||||
current_markup = message.reply_markup
|
markup_to_json(message.reply_markup)
|
||||||
|
== markup_to_json(new_reply_markup)
|
||||||
is_markup_same = markup_to_json(current_markup) == markup_to_json(new_reply_markup)
|
)
|
||||||
|
|
||||||
if is_text_same and is_markup_same:
|
if is_text_same and is_markup_same:
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
return
|
return
|
||||||
|
|
||||||
await message.edit_text(
|
await message.edit_text(
|
||||||
new_text,
|
new_text, reply_markup=new_reply_markup, parse_mode=parse_mode
|
||||||
reply_markup=new_reply_markup,
|
|
||||||
parse_mode=parse_mode
|
|
||||||
)
|
)
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
|
|
||||||
@router.message(Command("settings"))
|
@router.message(Command("settings"))
|
||||||
async def settings_handler(message: types.Message):
|
async def settings_handler(message: types.Message):
|
||||||
data = await db.fetch(
|
locale = await get_user_locale(message.from_user.id)
|
||||||
'SELECT lang FROM users WHERE user_id = $1',
|
|
||||||
message.from_user.id
|
settings_keyboard = InlineKeyboardMarkup(
|
||||||
|
inline_keyboard=[
|
||||||
|
[
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=locale.get("setting_chart"),
|
||||||
|
callback_data="setting_chart",
|
||||||
|
),
|
||||||
|
InlineKeyboardButton(
|
||||||
|
text=locale.get("setting_lang"),
|
||||||
|
callback_data="setting_lang",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
if not data:
|
|
||||||
await db.insert(
|
|
||||||
'INSERT INTO users (user_id) VALUES (?)',
|
|
||||||
message.from_user.id
|
|
||||||
)
|
|
||||||
data = await db.fetch(
|
|
||||||
'SELECT lang FROM users WHERE user_id = $1',
|
|
||||||
message.from_user.id
|
|
||||||
)
|
|
||||||
|
|
||||||
lang = data.get('lang', 'en')
|
|
||||||
locale = i18n.get_locale(lang)
|
|
||||||
|
|
||||||
settings_keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
|
||||||
[
|
|
||||||
InlineKeyboardButton(
|
|
||||||
text=locale.get("setting_chart"),
|
|
||||||
callback_data="setting_chart"),
|
|
||||||
InlineKeyboardButton(
|
|
||||||
text=locale.get("setting_lang"),
|
|
||||||
callback_data="setting_lang"),
|
|
||||||
],
|
|
||||||
])
|
|
||||||
|
|
||||||
await message.answer(
|
await message.answer(
|
||||||
locale.get("settings_title"),
|
locale.get("settings_title"), reply_markup=settings_keyboard
|
||||||
reply_markup=settings_keyboard
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@router.callback_query(lambda c: c.data == "setting_lang")
|
|
||||||
|
@router.callback_query(Text("setting_lang"))
|
||||||
async def show_language_menu(callback: CallbackQuery):
|
async def show_language_menu(callback: CallbackQuery):
|
||||||
data = await db.fetch(
|
locale = await get_user_locale(callback.from_user.id)
|
||||||
'SELECT lang FROM users WHERE user_id = $1',
|
|
||||||
callback.from_user.id
|
|
||||||
)
|
|
||||||
lang = data.get('lang', 'en')
|
|
||||||
locale = i18n.get_locale(lang)
|
|
||||||
|
|
||||||
keyboard = build_options_keyboard(
|
keyboard = build_options_keyboard(
|
||||||
options=lang_options,
|
options=LANG_OPTIONS,
|
||||||
current_value=lang,
|
current_value=locale.get("lang", "en"),
|
||||||
callback_prefix="lang",
|
callback_prefix="lang",
|
||||||
locale=locale,
|
locale=locale,
|
||||||
buttons_per_row=2,
|
back_callback="back_to_settings",
|
||||||
back_callback="back_to_settings"
|
|
||||||
)
|
|
||||||
await safe_edit_message_text(
|
|
||||||
callback,
|
|
||||||
new_text=locale.get("choose_language"),
|
|
||||||
new_reply_markup=keyboard
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@router.callback_query(lambda c: c.data and c.data.startswith("lang_"))
|
await safe_edit_message_text(
|
||||||
|
callback, locale.get("choose_language"), keyboard
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@router.callback_query(Text(startswith="lang_"))
|
||||||
async def language_selected(callback: CallbackQuery):
|
async def language_selected(callback: CallbackQuery):
|
||||||
lang = callback.data.split("_")[1]
|
lang = callback.data.split("_")[1]
|
||||||
await db.update(
|
await db.update(
|
||||||
'UPDATE users SET lang = $1 WHERE user_id = $2',
|
'UPDATE users SET lang = $1 WHERE user_id = $2',
|
||||||
lang, callback.from_user.id
|
lang,
|
||||||
|
callback.from_user.id,
|
||||||
)
|
)
|
||||||
locale = i18n.get_locale(lang)
|
locale = i18n.get_locale(lang)
|
||||||
|
|
||||||
keyboard = build_options_keyboard(
|
keyboard = build_options_keyboard(
|
||||||
options=lang_options,
|
options=LANG_OPTIONS,
|
||||||
current_value=lang,
|
current_value=lang,
|
||||||
callback_prefix="lang",
|
callback_prefix="lang",
|
||||||
locale=locale,
|
locale=locale,
|
||||||
buttons_per_row=2,
|
back_callback="back_to_settings",
|
||||||
back_callback="back_to_settings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
await safe_edit_message_text(
|
await safe_edit_message_text(
|
||||||
callback,
|
callback, locale.get("choose_language"), keyboard
|
||||||
new_text=locale.get("choose_language"),
|
|
||||||
new_reply_markup=keyboard
|
|
||||||
)
|
)
|
||||||
|
|
||||||
await callback.answer(
|
await callback.answer(
|
||||||
locale.get("language_set").format(lang=lang.upper())
|
locale.get("language_set").format(lang=lang.upper())
|
||||||
)
|
)
|
||||||
|
|
||||||
@router.callback_query(lambda c: c.data == "back_to_settings")
|
@router.callback_query(Text("back_to_settings"))
|
||||||
async def back_to_settings(callback: CallbackQuery):
|
async def back_to_settings(callback: CallbackQuery):
|
||||||
data = await db.fetch(
|
locale = await get_user_locale(callback.from_user.id)
|
||||||
'SELECT lang FROM users WHERE user_id = $1',
|
|
||||||
callback.from_user.id
|
|
||||||
)
|
|
||||||
lang = data.get('lang', 'en')
|
|
||||||
locale = i18n.get_locale(lang)
|
|
||||||
|
|
||||||
settings_keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
settings_keyboard = InlineKeyboardMarkup(
|
||||||
[
|
inline_keyboard=[
|
||||||
InlineKeyboardButton(
|
[
|
||||||
text=locale.get("setting_chart"),
|
InlineKeyboardButton(
|
||||||
callback_data="setting_chart"),
|
text=locale.get("setting_chart"),
|
||||||
InlineKeyboardButton(
|
callback_data="setting_chart",
|
||||||
text=locale.get("setting_lang"),
|
),
|
||||||
callback_data="setting_lang"),
|
InlineKeyboardButton(
|
||||||
],
|
text=locale.get("setting_lang"),
|
||||||
])
|
callback_data="setting_lang",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
await safe_edit_message_text(
|
await safe_edit_message_text(
|
||||||
callback,
|
callback, locale.get("settings_title"), settings_keyboard
|
||||||
new_text=locale.get("settings_title"),
|
|
||||||
new_reply_markup=settings_keyboard
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@router.callback_query(lambda c: c.data == "setting_chart")
|
@router.callback_query(Text("setting_chart"))
|
||||||
async def show_chart_settings(callback: CallbackQuery):
|
async def show_chart_settings(callback: CallbackQuery):
|
||||||
data = await db.fetch(
|
data = await db.fetch(
|
||||||
'SELECT chart, chart_period, lang FROM users WHERE user_id = $1',
|
'SELECT chart, chart_period, lang FROM users WHERE user_id = $1',
|
||||||
callback.from_user.id
|
callback.from_user.id,
|
||||||
)
|
)
|
||||||
lang = data.get('lang', 'en')
|
lang = data.get("lang", "en")
|
||||||
locale = i18n.get_locale(lang)
|
locale = i18n.get_locale(lang)
|
||||||
|
|
||||||
chart_status = bool(data.get('chart', 1))
|
chart_status = bool(data.get("chart", 1))
|
||||||
period = data.get('chart_period')
|
period = data.get("chart_period") or "week"
|
||||||
|
|
||||||
status_text = locale.get("enabled", "Enabled") \
|
|
||||||
if chart_status \
|
|
||||||
else locale.get("disabled", "Disabled")
|
|
||||||
|
|
||||||
|
status_text = locale.get("enabled") if chart_status else locale.get("disabled")
|
||||||
period_text = locale.get(period, period)
|
period_text = locale.get(period, period)
|
||||||
|
|
||||||
text = (
|
text = (
|
||||||
|
@ -250,93 +255,85 @@ async def show_chart_settings(callback: CallbackQuery):
|
||||||
f"{locale.get('status')}: {status_text}\n"
|
f"{locale.get('status')}: {status_text}\n"
|
||||||
f"{locale.get('period')}: {period_text}"
|
f"{locale.get('period')}: {period_text}"
|
||||||
)
|
)
|
||||||
|
|
||||||
keyboard = get_chart_toggle_keyboard(chart_status, locale)
|
keyboard = get_chart_toggle_keyboard(chart_status, locale)
|
||||||
|
|
||||||
await safe_edit_message_text(
|
await safe_edit_message_text(callback, text, keyboard)
|
||||||
callback,
|
|
||||||
new_text=text,
|
|
||||||
new_reply_markup=keyboard
|
|
||||||
)
|
|
||||||
|
|
||||||
@router.callback_query(lambda c: c.data == "chart_toggle")
|
@router.callback_query(Text("chart_toggle"))
|
||||||
async def toggle_chart(callback: CallbackQuery):
|
async def toggle_chart(callback: CallbackQuery):
|
||||||
data = await db.fetch(
|
data = await db.fetch(
|
||||||
'SELECT chart, lang FROM users WHERE user_id = $1',
|
'SELECT chart, lang FROM users WHERE user_id = $1',
|
||||||
callback.from_user.id
|
callback.from_user.id,
|
||||||
)
|
)
|
||||||
lang = data.get('lang', 'en')
|
lang = data.get("lang", "en")
|
||||||
locale = i18n.get_locale(lang)
|
locale = i18n.get_locale(lang)
|
||||||
|
|
||||||
current_status = data.get('chart', True)
|
current_status = data.get("chart", True)
|
||||||
new_status = not current_status
|
new_status = not current_status
|
||||||
|
|
||||||
await db.update(
|
await db.update(
|
||||||
'UPDATE users SET chart = $1 WHERE user_id = $2',
|
'UPDATE users SET chart = $1 WHERE user_id = $2',
|
||||||
new_status, callback.from_user.id
|
new_status,
|
||||||
|
callback.from_user.id,
|
||||||
)
|
)
|
||||||
|
|
||||||
await callback.answer(
|
await callback.answer(
|
||||||
locale.get(f"chart_now_{'enabled' if new_status else 'disabled'}",
|
locale.get(
|
||||||
f"Chart now {'enabled' if new_status else 'disabled'}")
|
f"chart_now_{'enabled' if new_status else 'disabled'}",
|
||||||
|
f"Chart now {'enabled' if new_status else 'disabled'}",
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
await show_chart_settings(callback)
|
await show_chart_settings(callback)
|
||||||
|
|
||||||
@router.callback_query(lambda c: c.data == "chart_period")
|
|
||||||
|
@router.callback_query(Text("chart_period"))
|
||||||
async def change_chart_period(callback: CallbackQuery):
|
async def change_chart_period(callback: CallbackQuery):
|
||||||
data = await db.fetch(
|
data = await db.fetch(
|
||||||
'SELECT chart_period, lang FROM users WHERE user_id = $1',
|
'SELECT chart_period, lang FROM users WHERE user_id = $1',
|
||||||
callback.from_user.id
|
callback.from_user.id,
|
||||||
)
|
)
|
||||||
lang = data.get('lang', 'en')
|
lang = data.get("lang", "en")
|
||||||
locale = i18n.get_locale(lang)
|
locale = i18n.get_locale(lang)
|
||||||
|
|
||||||
current_period = data.get('chart_period')
|
current_period = data.get("chart_period")
|
||||||
|
|
||||||
keyboard = build_options_keyboard(
|
keyboard = build_options_keyboard(
|
||||||
options=period_options,
|
options=PERIOD_OPTIONS,
|
||||||
current_value=current_period,
|
current_value=current_period,
|
||||||
callback_prefix="period",
|
callback_prefix="period",
|
||||||
locale=locale,
|
locale=locale,
|
||||||
buttons_per_row=2,
|
back_callback="setting_chart",
|
||||||
back_callback="setting_chart"
|
|
||||||
)
|
|
||||||
await safe_edit_message_text(
|
|
||||||
callback,
|
|
||||||
new_text=locale.get("choose_period"),
|
|
||||||
new_reply_markup=keyboard
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@router.callback_query(lambda c: c.data and c.data.startswith("period_"))
|
await safe_edit_message_text(
|
||||||
|
callback,
|
||||||
|
locale.get("choose_period"),
|
||||||
|
keyboard
|
||||||
|
)
|
||||||
|
|
||||||
|
@router.callback_query(Text(startswith="period_"))
|
||||||
async def set_chart_period(callback: CallbackQuery):
|
async def set_chart_period(callback: CallbackQuery):
|
||||||
period = callback.data.split("_")[1]
|
period = callback.data.split("_")[1]
|
||||||
await db.update(
|
await db.update(
|
||||||
'UPDATE users SET chart_period = $1 WHERE user_id = $2',
|
'UPDATE users SET chart_period = $1 WHERE user_id = $2',
|
||||||
period, callback.from_user.id
|
period,
|
||||||
|
callback.from_user.id,
|
||||||
)
|
)
|
||||||
data = await db.fetch(
|
|
||||||
'SELECT lang FROM users WHERE user_id = $1',
|
locale = await get_user_locale(callback.from_user.id)
|
||||||
callback.from_user.id
|
|
||||||
)
|
|
||||||
lang = data.get('lang', 'en')
|
|
||||||
locale = i18n.get_locale(lang)
|
|
||||||
|
|
||||||
keyboard = build_options_keyboard(
|
keyboard = build_options_keyboard(
|
||||||
options=period_options,
|
options=PERIOD_OPTIONS,
|
||||||
current_value=period,
|
current_value=period,
|
||||||
callback_prefix="period",
|
callback_prefix="period",
|
||||||
locale=locale,
|
locale=locale,
|
||||||
buttons_per_row=2,
|
back_callback="setting_chart",
|
||||||
back_callback="setting_chart"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
await safe_edit_message_text(
|
await safe_edit_message_text(
|
||||||
callback,
|
callback,
|
||||||
new_text=locale.get("choose_period"),
|
locale.get("choose_period"),
|
||||||
new_reply_markup=keyboard
|
keyboard
|
||||||
)
|
|
||||||
|
|
||||||
await callback.answer(
|
|
||||||
locale.get("period_set").format(period=period)
|
|
||||||
)
|
)
|
||||||
|
await callback.answer(locale.get("period_set").format(period=period))
|
||||||
|
|
Loading…
Add table
Reference in a new issue