chore: Added message deletions and small code refactoring

This commit is contained in:
ITQ
2024-03-21 18:33:14 +03:00
parent 2d35f26b29
commit 3226e090f5
4 changed files with 161 additions and 31 deletions
+67 -20
View File
@@ -12,7 +12,7 @@ from app.filters.user_filter import Registered, RegisteredCallback
from app.keyboards.builders import profile from app.keyboards.builders import profile
from app.keyboards.profile import get from app.keyboards.profile import get
from app.models.user import User from app.models.user import User
from app.utils.states import UserAltering from app.utils.states import delete_message_from_state, UserAltering
router = Router(name="profile_callback") router = Router(name="profile_callback")
@@ -33,22 +33,23 @@ async def profile_change_callback(
column = callback.data.replace("profile_change_", "") column = callback.data.replace("profile_change_", "")
if column == "username": if column == "username":
await callback.message.answer(messages.EDIT_USERNAME) message = await callback.message.answer(messages.EDIT_USERNAME)
elif column == "age": elif column == "age":
await callback.message.answer(messages.INPUT_AGE) message = await callback.message.answer(messages.INPUT_AGE)
elif column == "bio": elif column == "bio":
await callback.message.answer(messages.EDIT_BIO) message = await callback.message.answer(messages.EDIT_BIO)
elif column == "sex": elif column == "sex":
await callback.message.answer( message = await callback.message.answer(
messages.INPUT_SEX, messages.INPUT_SEX,
reply_markup=profile(["Male", "Female"]), reply_markup=profile(["Male", "Female"]),
) )
elif column == "location": elif column == "location":
await callback.message.answer(messages.INPUT_LOCATION) message = await callback.message.answer(messages.INPUT_LOCATION)
await state.update_data( await state.update_data(
column=column, column=column,
message_id=callback.message.message_id, message_id=callback.message.message_id,
input_message=message,
) )
await state.set_state(UserAltering.value) await state.set_state(UserAltering.value)
@@ -67,41 +68,72 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
value=value, value=value,
) )
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await state.update_data(value=validated_value) await state.update_data(value=validated_value, successfully=True)
elif column == "age": elif column == "age":
try: try:
validated_age = User().validate_age(key="age", value=value) validated_age = User().validate_age(key="age", value=value)
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await state.update_data(value=validated_age) await state.update_data(value=validated_age, successfully=True)
elif column == "bio": elif column == "bio":
if value == "/skip": if value == "/skip":
await state.update_data(value=None) await state.update_data(value=None, successfully=True)
await delete_message_from_state(state)
else: else:
try: try:
validated_bio = User().validate_bio(key="bio", value=value) validated_bio = User().validate_bio(key="bio", value=value)
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await state.update_data(value=validated_bio) await state.update_data(value=validated_bio, successfully=True)
elif column == "sex": elif column == "sex":
value = value.lower() value = value.lower()
if value not in ["male", "female"]: try:
await message.answer(messages.VALIDATION_ERROR_MESSAGE) validated_sex = User().validate_sex(key="sex", value=value)
except AssertionError as e:
await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await state.update_data(value=value) await state.update_data(value=validated_sex, successfully=True)
elif column == "location": elif column == "location":
location = value.split(", ") location = value.split(", ")
if len(location) != 2: if len(location) != 2:
await message.answer(messages.VALIDATION_ERROR_MESSAGE) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(
messages.VALIDATION_ERROR_MESSAGE,
)
await state.update_data(previous_message=error_message)
return return
country, city = location country, city = location
@@ -112,7 +144,12 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
value=country, value=country,
) )
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
try: try:
@@ -121,11 +158,20 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
country=validated_country, country=validated_country,
) )
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await delete_message_from_state(state)
await state.update_data(value=[validated_country, validated_city]) await state.update_data(value=[validated_country, validated_city])
await delete_message_from_state(state)
state_data = await state.get_data() state_data = await state.get_data()
user = User.get_user_queryset_by_telegram_id(message.from_user.id) user = User.get_user_queryset_by_telegram_id(message.from_user.id)
@@ -163,8 +209,9 @@ async def profile_change_entered(message: Message, state: FSMContext) -> None:
except TelegramBadRequest: except TelegramBadRequest:
pass pass
await message.delete()
await message.answer( await message.answer(
"✅ Profile updated", messages.PROFILE_UPDATED,
reply_markup=ReplyKeyboardRemove(), reply_markup=ReplyKeyboardRemove(),
) )
+61 -10
View File
@@ -8,7 +8,7 @@ from aiogram.types import Message, ReplyKeyboardRemove
from app import messages, session from app import messages, session
from app.keyboards.builders import profile from app.keyboards.builders import profile
from app.models.user import User from app.models.user import User
from app.utils.states import RegistrationForm from app.utils.states import delete_message_from_state, RegistrationForm
router = Router(name="start_command") router = Router(name="start_command")
@@ -51,9 +51,16 @@ async def username_handler(message: Message, state: FSMContext) -> None:
value=username, value=username,
) )
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await delete_message_from_state(state)
await state.update_data(username=validated_username) await state.update_data(username=validated_username)
await state.set_state(RegistrationForm.age) await state.set_state(RegistrationForm.age)
@@ -76,9 +83,16 @@ async def age_handler(message: Message, state: FSMContext) -> None:
try: try:
validated_age = User().validate_age(key="age", value=age) validated_age = User().validate_age(key="age", value=age)
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await delete_message_from_state(state)
await state.update_data(age=validated_age) await state.update_data(age=validated_age)
await state.set_state(RegistrationForm.sex) await state.set_state(RegistrationForm.sex)
@@ -98,11 +112,20 @@ async def sex_handler(message: Message, state: FSMContext) -> None:
sex = message.text.strip().lower() sex = message.text.strip().lower()
if sex not in ["male", "female"]: try:
await message.answer(messages.VALIDATION_ERROR_MESSAGE) validated_sex = User().validate_sex(key="sex", value=sex)
except AssertionError as e:
await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await state.update_data(sex=sex) await delete_message_from_state(state)
await state.update_data(sex=validated_sex)
await state.set_state(RegistrationForm.bio) await state.set_state(RegistrationForm.bio)
await message.answer( await message.answer(
@@ -123,15 +146,24 @@ async def bio_handler(message: Message, state: FSMContext) -> None:
await state.update_data(bio=None) await state.update_data(bio=None)
await state.set_state(RegistrationForm.location) await state.set_state(RegistrationForm.location)
await delete_message_from_state(state)
await message.answer(messages.INPUT_BIO_SKIPPED) await message.answer(messages.INPUT_BIO_SKIPPED)
await message.answer(messages.INPUT_LOCATION) await message.answer(messages.INPUT_LOCATION)
else: else:
try: try:
validated_bio = User().validate_bio(key="bio", value=bio) validated_bio = User().validate_bio(key="bio", value=bio)
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await delete_message_from_state(state)
await state.update_data(bio=validated_bio) await state.update_data(bio=validated_bio)
await state.set_state(RegistrationForm.location) await state.set_state(RegistrationForm.location)
@@ -149,7 +181,12 @@ async def location_handler(message: Message, state: FSMContext) -> None:
location = message.text.strip().split(", ") location = message.text.strip().split(", ")
if len(location) != 2: if len(location) != 2:
await message.answer(messages.VALIDATION_ERROR_MESSAGE) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(messages.VALIDATION_ERROR_MESSAGE)
await state.update_data(previous_message=error_message)
return return
country, city = location country, city = location
@@ -160,7 +197,12 @@ async def location_handler(message: Message, state: FSMContext) -> None:
value=country, value=country,
) )
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
try: try:
@@ -169,9 +211,16 @@ async def location_handler(message: Message, state: FSMContext) -> None:
country=validated_country, country=validated_country,
) )
except AssertionError as e: except AssertionError as e:
await message.answer(str(e)) await message.delete()
await delete_message_from_state(state)
error_message = await message.answer(str(e))
await state.update_data(previous_message=error_message)
return return
await delete_message_from_state(state)
await state.update_data(location=[validated_country, validated_city]) await state.update_data(location=[validated_country, validated_city])
data = await state.get_data() data = await state.get_data()
await state.clear() await state.clear()
@@ -187,6 +236,8 @@ async def location_handler(message: Message, state: FSMContext) -> None:
data["country"] = data["location"][0] data["country"] = data["location"][0]
data["city"] = data["location"][1] data["city"] = data["location"][1]
del data["location"] del data["location"]
del data["previous_message"]
session.add(User(**data)) session.add(User(**data))
session.commit() session.commit()
+2 -1
View File
@@ -21,10 +21,11 @@ PROFILE = (
"\tUsername: <b>{username}</b>\n" "\tUsername: <b>{username}</b>\n"
"\tAge: <b>{age}</b>\n" "\tAge: <b>{age}</b>\n"
"\tSex: <b>{sex}</b>\n" "\tSex: <b>{sex}</b>\n"
"\tBio: <b>{bio}</b>\n"
"\tCountry: <b>{country}</b>\n" "\tCountry: <b>{country}</b>\n"
"\tCity: <b>{city}</b>" "\tCity: <b>{city}</b>"
"\tBio: <b>{bio}</b>\n"
) )
NOT_SET = "<i>Not set</i>" NOT_SET = "<i>Not set</i>"
EDIT_USERNAME = "Enter your username:\n<i>Allowed characters: a-z, A-Z, 0-9, _</i>\n<i>Length: 5-20 characters</i>" EDIT_USERNAME = "Enter your username:\n<i>Allowed characters: a-z, A-Z, 0-9, _</i>\n<i>Length: 5-20 characters</i>"
EDIT_BIO = "Enter your bio (enter /skip if you want to set it to None):\n<i>Maximum length: 100 characters</i>" EDIT_BIO = "Enter your bio (enter /skip if you want to set it to None):\n<i>Maximum length: 100 characters</i>"
PROFILE_UPDATED = "✅ Profile updated"
+31
View File
@@ -1,9 +1,12 @@
__all__ = ("RegistrationForm",) __all__ = ("RegistrationForm",)
from aiogram.exceptions import TelegramBadRequest
from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.context import FSMContext
class RegistrationForm(StatesGroup): class RegistrationForm(StatesGroup):
previous_message = State()
username = State() username = State()
age = State() age = State()
bio = State() bio = State()
@@ -12,6 +15,34 @@ class RegistrationForm(StatesGroup):
class UserAltering(StatesGroup): class UserAltering(StatesGroup):
successfully = State()
message_id = State() message_id = State()
input_message = State()
previous_message = State()
column = State() column = State()
value = State() value = State()
async def delete_message_from_state(state: FSMContext) -> None:
data = await state.get_data()
if "previous_message" in data and data["previous_message"] is not None:
try:
await data["previous_message"].delete()
except TelegramBadRequest:
pass
await state.update_data(previous_message=None)
if (
"input_message" in data
and data["input_message"] is not None
and "successfully" in data
and data["successfully"]
):
try:
await data["input_message"].delete()
except TelegramBadRequest:
pass
await state.update_data(info_message=None)